Инсталиране и конфигуриране на RASPBERRY PI 2 B (Raspbian OS) като VPN server (OpenVPN) част 2/2

Какво е VPN server ?

VPN или Virtual Private Network или казано с други думи виртуална частна мрежа. Щом четете как се прави, предполагам знаете и за какво служи, но все пак, нека да дам въведение в темата. Когато изградите такава виртуална мрежа, Вие получавате защитен достъп на отдалечен компютър до определена частна мрежа. Какво искам да кажа ? digital-tunnelАко в къщи или в офиса имате изградена вътрешна мрежа и искате да я достигнете от друг компютър (най – често лаптоп), който се намира извън нея – нуждаете се от VPN./снимка взета от тук/

Какво ще направи VPN ?

Когато пуснете VPN от клиентската машина, програмата по криптиран канал, ще се свърже с вашия VPN Server, ще се оторизира и след това ще изгради криптиран канал между Вас (клиентската машина) и мрежата на организацията към която се свързвате. По този начин, Вие ще получите IP от отдалечената мрежа (от VPN server-а). Спрямо настройките, целият Ви интернет трафик, може да мине през този канал или само трафикът, насочен към мрежата на организацията. Извършвайки това, въпреки че не сте се вързали директно в мрежата на организацията, Вие чрез VPN сте в нея, и може да я използвате с пълните възможности, които предлага. Всичко това се случва по сигурен криптиран канал между Вас и отдалечената мрежа.

Защо имам нужда (за какво ми е) ?

Нужда от VPN имат всички, които имат изградена мрежа вкъщи или в офиса и трябва да достигат ресурси по тази мрежа.

Много често VPN се използва, ако имате няколко сървъра и трябва направите нещо по тях или използвате софтуерно приложение (било то инсталирано на работната Ви станция или web базирано – но не публично достъпно) – Вие трябва да достъпите, да сте в мрежата на организацията. За да може да включите Remote Desktop към работната си станция,  респективно браузър (browser) с вътрешен адрес (на организацията) на приложението, или да си достъпите сървърите Ви е нужен VPN. Дори ако имате няколко физически разделени мрежи (например няколко офиса на различни места), може да ги обедините, чрез този тип връзка.

Едно от предимствата на VPN пред други софтуерни продукти, които дават отдалечен достъп до компютър са, че повечето софтуери Ви дават възможност за връзка с един компютър. Обикновено има редица ограничения: например при windows компютрите, десктоп-а става черен,  и ред други ограничения – прехвърляне на файлове и т.н. VPN Ви дава достъп до цялата мрежа, дава възможност за Remote Desktop, за много паралелни SSH връзки и прочие. Както казах, реално сте в мрежата си и можете да правите всичко, което правите в нея.

Защо OpenVPN ?

OpenVPN_LogoOpenVPN има безплатна версия – Community, която може да се изтегли – тя е Open Source и може, ако желаете, да я билднете самостоятелно.

Важното е, че е безплатен и е много гъвкав от към настройки. Освен това е и достатъчно сигурен – поддържа много високи нива на криптиране, още при самото искане за отваряне на канал.

Инсталация

Аз ще демонстрирам инсталация върху Raspian операционна система, която е базирана на Linux Debian. Реално, стъпките които показвам за инсталация и конфигурация не зависят от операционната система. OpenVPN има версии за най-различни операционни системи. Ако желаете да го инсталирате на друга операционна система и друг хардуер, следвайте същите стъпки, като ще се наложи да променяте само някои специфични команди за съответната платформата.

След като сте инсталирали Raspberry Pi с Raspbian (описано в предходния пост) и сте изпълнили командите за update (“sudo apt-get update”) и  upgrade (“sudo apt-get upgrade”), е време да инсталираме и VPN Server –a. За целта изпълнявате следната команда:

~$ sudo apt-get install openvpn

install_openvpnВашият OpenVPN е инсталиран, но тепърва започва конфигурацията. За по-нататък, ще трябва да сте винаги като root потребител, затова изпълнявате командата:sudo_s

 ~$ sudo –s

EASY-RSA

Аз предпочитам да работя в една директория и накрая да преместя само необходимите файлове на местата им, затова създавам една работна директория в /root/openvpn и влизам в нея.

~$ mkdir /root/openvpn

~$ cd /root/openvpn

Сега трябва да генерирате ключове и сертификати. За целта Ви е необходим easy-rsa, като единият вариант е да го копирате (ако го имате наличен) от примерите, предоставени Ви с OpenVPN

~$ cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /root/openvpn/easy-rsa

Другият вариант е да го вземете от git repository –то и да checkout –нете версия 2.2.2

~$ git clone https://github.com/OpenVPN/easy-rsa.gitclon_git_easy-rsa

~$ cd easy-rsa

~$ git checkout 2.2.2

chekout_git

В този случай, по-добре е да копирате easy-rsa в отделна директория, за да не е обвързана с GIT, но ако желаете, може да работите и директно в тази директория. Аз ще копирам и ще показвам следващите команди от новата дестинация.

~$ cd /root/openvpn

~$ mkdir easy_ras

~$ cd easy_rsa/

~$ cp –r /root/openvpn/easy-rsa/ .

copy_easy_rsa

EASY-RSA – Конфигурация

Сега трябва да се конфигурират първоначалните данни. За целта, влизате е новосъздадената (копираната) директория и отваряте файла “vars” в любимия си редактор. Може да го отворите с vi, vim, nano, mcedit и др. Аз предпочитам mcedit и за целта първо трябва да го инсталирам.

~$ apt-get install mc (ако несте като root /sudo –s/, изпълнете командата с sudo)

~$ cd /root/openvpn/easy_rsa/2.0/

~$ mcedit vars

Трябва да се редактират основните параметри:

export EASY_RSA=”/root/openvpn/easy_ras/2.0” – това е основната директория в която ще работитеERASY_RSA_PATH

EASY_RSA_KEY_SIZEexport KEY_SIZE=2048 – така ключът е по-голям – ако не желаете да е толкова голям, може да го намалите на 1024, като в последващите конфигурации, ще трябва да сложите същото число.

Попълнете и данните за вашата организация – НЕ оставяйте празни полета

export KEY_COUNTRYexport_company_data

export KEY_PROVINCE

export KEY_CITY

export KEY_ORG

export KEY_EMAIL

export KEY_OU

Запазвате промените във файла, за mcedit – натискате F10 и програмата ще Ви попита, дали да запази промените преди затваряне.

Генериране на сертификати и ключове

Трябва да заредите направените промени и да изчистите директорията от стари ключове. За целта :

~$ . ./vars

~$ ./clean-all – Внимание! – при бъдещо генериране на допълнителни потребители – НЕ изпълнявайте тази команда – това изчиства директорията с генерирани сертификати.

edit_execute_vars_clean

Създаване на ключ се извършва чрез стартиране на build-ca

~$ ./build-ca –ще иска да потвърдите или промените данните, тъй като Вие сте въвели правилните дефолтни данни в “vars”, тук само натискате “enter” за потвърждение. Аз съм променил само “Common name”, тъй като не харесвам интервали в имената.

easy-rsa_build-ca

~$ build-key-server YOUR_SERVER_NAME – отново ще попита за данните. Важно е, да попълните “Commоn name”  – това име ще Ви е необходимо и след това.

За “A challenge password” – не въвеждайте нищо, само натиснете “enter”.

На въпросите, показани по-долу, отговаряте с “y

easy-rsa_build-key-server

Време е, да направите клиентските сертификати. Аз ще направя един сертификат за потребител с име Boris. Ако имате нужда от повече сертификати, изпълнете последователността от следващите команди за всеки един клиент.

~$ ./build-key-pass Boris – отново ще пита за основна информация.

За “Enter PEM pass phrase” – въведете парола която ще запомните. Тя ще Ви е необходима всеки път, когато се връзвате с VPN – това е нещо като предпазна мярка, за да не е възможно, ако някой друг използва Вашият компютър, да се свърже, без да е въвел парола.

за “A challenge password” – отново не въвеждайте нищо – “enter

На въпросите отново отговаряте с “y”.

Сега трябва да защитите клиентския ключ от “brute force” атака. Това става посредством прилагане на des3 кодиране, което кодира 3 пъти всеки блок от данни.

~$ cd keys

~$ openssl rsa -in Boris.key -des3 -out Boris.3des.key – кодиране на клиентския ключ. Програмата ще поиска парола на първия ключ (генериран в предходната стъпка), след това за новия ключ, както и потвърждение. Аз въвеждам една и съща парола – какво е на оригиналния ключ.easy-rsa_des3-key

Връщаме се в предходната директория, за да създадем “Diffie-Hellman key”, благодарение на който (казано с 2 думи) клиентът и сървърът, ще могат да си разменят сертификатите по сигурен начин при свързване (wikipedia). Тази команда отнема известно време – бъдете търпеливи. Тъй като аз съм с конфигурация за 2048 битов ключ, времето е повече, но не може да се каже колко с голяма точност, защото се използват произволни числа (когато писах тази статия, при мен отне около 40 мин).

~$ cd .. (или в моя случай това е директорията /root/openvpn/easy_ras_2.0/)

~$ ./build-dh

build-dh

след около 40 мин. и екран пълен с точки Smile продължаваме да защитаваме VPN сървъра.

Следва да генерираме така наречения “HMAC key” (hash-based message authentication code) – той служи за превенция от атаки с неправилни ключове (Denial of Service (DoS) attack) или още известни като DoS атаки. При огромно количество заявки към VPN сървър-а, дори те да са с неправилни ключове, сървърът ще блокира от препълване на буфера, тъй като за всяка една заявка, той трябва да отдели време за пресмятане на ключа. Идеята е, клиентът да подава първоначално един статичен ключ, който сървърът да проверява и ако не съвпада – директно да отхвърля заявката. По този начин, хакерските произволно генерирани сертификати и ключове автоматично ще отпаднат.

~$ openvpn –-genkey –-secret /root/openvpn/easy_rsa/2.0/keys/ta.key – Забележете, тук се подава директорията и името на файла за ключа, като се препоръчва задаване на целия път. Съдържанието на този файл ще трябва да се копита при всеки един клиент (обяснено по нататък).

HMAC-key_ta_key

Разпределение на файловете

Време е да се сложат файловете по местата им. В описанието на OpenVPN има следната таблица, кой ключ/сертификат къде трябва да бъде:

Filename Needed by Purpose Secret
ca.crt server + all clients Root CA certificate No
ca.key key signing machine only Root CA key YES
dh{n}.pen server only Diffier Hellman parameters No
server.crt server only Server Certificate No
server key server only Server Key YES
client1.crt client1 only Client1 Certificate No
client1.key client1 only Client 1 Key YES
client2.crt client2 only Client2 Certificate No
client2.key client2 only Client2 key YES
…..
ta.key server + in all client config

Съответно:

dh{n}.pen файла при мен се казва dh2048.pen, защото е с дължина 2048 бита.

client1 се казва Boris

за client1.key (Boris.key) използвате Client1.3des.key (Boris.3des.key)

server е това, което сте попълнили при стартиране на build-key-server командата.

Копирате всички нужни за сървъра файлове в директорията /etc/openvpn/ – аз първо влизам в нея и след това копирам:

~$ cd /etc/openvpn/

~$ cp /root/openvpn_copy/easy_rsa/2.0/keys/ca.crt .

~$ cp /root/openvpn_copy/easy_rsa/2.0/keys/********-vpn.crt . (–сървърния сертификат)

~$ cp /root/openvpn_copy/easy_rsa/2.0/keys/********-vpn.key .

~$ cp /root/openvpn_copy/easy_rsa/2.0/keys/dh2048.pem .

~$ cp /root/openvpn_copy/easy_rsa/2.0/keys/ta.key .

Копирате и клиентските сертификати+ключове+ta.key на клиентските машини, разбира се. Силно се препоръчва да се използват сигурни канали при предаване на сертификатите и ключовете към клиентите.

Конфигуриране на VPN

Хубаво е конфигурацията на VPN server –а да се намира в същата папка, където са сертификатите и ключовете. Конфиг файла може да изтеглите от ТУК или да изкопирате (както съм направил аз) по следния начин:

~$ cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz .  – намирайки се в /etc/openvpn

copy_server_config_openvpn

и разархивираме

~$ gunzip server.conf.gz

В него редактираме следните неща:

~$ mcedit server.conf

port 443port_443порт на който ще “слуша” VPN-a. 443 в повечето случай е отворен навсякъде (хотели, заведения, компании), освен това, той е SSL портът по подразбиране и трафикът на пръв поглед ще се маскира, все едно сте в най-обикновена страница с SSL сертификат.

proto tcpproto_tcp

dev tap0 dev_tap0

config_sertificateca ca.crt – сертификат

cert ******.crt – това е сертифика от build-key-server

key ******.key – ключа към сертификата

dh dh2048.key

 

server bridge 192.168.2.9 255.255.255.0 192.168.2.90 192.168.2.99 – IP на сървъра, маска, стартово и крайно IP на DHCP-то

sercer_bridge_dhcp

tls-authtls-auth ta.key 0 – генерираният статичен ключ 0- за сървъра, 1 за клиентите

cipher AES-256-CBC – криптиращ алгоритъм ( има и други, този е един от добрите)

auth SHA512 – още криптирания Smile  – може и по-слабо (SHA256), а по подразбиране е SHA128

max-client 10 – колко максимум клиенти може да има закачениmax_client

log_appendlog-append openvpn.log – конфигурация –  да има ли лог, дали да продължава стария, или да го зачиства при всяко рестартиране и къде да се намира

Инсталиране – конфигуриране на BRIDGE

За да поддържате множество клиенти Ви е необходим bridge (така и конфигурирахте server.conf файла). За целта, първо трябва да го инсталирате.

~$ apt-get install bridge-utils

install_bridge-utils

От примерите, копирате стартовия и спиращия скрипт (или от ТУК).

copy_start_stop_bridge

Конфигурирате “моста” като задавате име, адаптор, TAP, IP, маска и broadcast:

br=”br0”config_bridge

tap=”tap0”

eth=”eth0” – лан картата, чрез която е вързано устройството

eth_ip=”192.168.2.9”

eth_netmask=”255.255.255.0”

eth=broadcast=”192.168.2.255”

Конфигуриране на стартиращ скрипт

За целта, препоръчвам да инсталирате “chkconfig”, с помощта на който може да конфигурирате стартовите и спиращите скриптове

~$ apt-get install chkconfigchkconfig_install

С инсталиране на openvpn, в директорията /etc/init.d/ се е генерирал стартов скрипт “openvpn”. За да управлявате openvpn-a като сървис, стартиращ се при стартиране на операционната система, използвайте следните команди:

~$ chkconfig openvpn –add – добавяне на шедулирания процес, като след изпълнението показва в кои нива се е задействал

~$ chkconfig openvpn on пускане на “шедулър “ процес

~$ chkconfig openvpn offспиране на “шедулър “ процес

~$ chkconfig –list | grep openvpn – показване на статус

След като сте го направили да се стартира автоматично, влезте с любимия си редактор във файла openvpn (в /etc/init.d/) и допишете, преди стартиране на vpn-а да се стартира bridge-а.start_bridge

if [ –f $CONFIG_DIR/openvpn_startup ]; then

$CONFIG_DIR/openvpn_startup

fi

Както сами се досещате, имате нужда и от сктипта “openvpn-startup”. Този скрипт е изключително елементарен и може да го създадете сами – отваряте нов текстов файл с името openvpn-startup и в него записвате:openvpn_startup

#! /bin/sh

workdir=”/etc/openvpn”

start_bridge=”bridge-start”

echo “starting bridge”

echo “execute = $workdir/$start_bridge”

$workdir/$start_bridge

Стопиращия скрипт не Ви е нужен, но все пак ето го и него:

#! /bin/sh

workdir=”/etc/openvpn”

stop_bridge=”bridge-stop”

echo “stoping bridge”

echo “execute = $workdir/$stop_bridge”

$workdir/$stop_bridge

Сега е ред да да им дадете права за изпълнение.

~$ chmod 750 openvpn-startup

~$ chmod 750 openvpn-shutdown

chmod_openvpn-startup

Конфигуриране на FIREWALL

Препоръчително е Firewall конфигурацията за Raspbian да бъде направена в отделен файл, който да се зарежда при стартиране или на мрежата, или на “bridge”-a. Аз съм го нагласил да се зарежда точно преди конфигурация на мрежата. За целта, създавам файла “firewall-openvpn-rules.sh” в който записвам следните правила:

iptables -I INPUT 1 -i tap0 -j ACCEPT

iptables -I INPUT 1 -i br0 -j ACCEPT

iptables -I INPUT 1 -i wlan0 -j ACCEPT

iptables -I FORWARD 1 -i br0 -j ACCEPT

и отново му давам права за изпълнениеfirewall-rules

~$ chmod 750 firewall-openvpn-rules.sh

В конфигурацията на мрежата (“/etc/network/interface”), задавате да се заредят направените конфигурации, преди да се зареди мрежата.

~$ mcedti /etc/network/interface

Където записвате:

pre-up /etc/openvpn/firewall-openvpn-rules.sheth0-firewall

Тест за стартиране на VPN server

OpenVPN server –а е готов за използване. Време е да проверите, дали не сте объркали някой път, директория, файл или нещо друго.

Стартирайте последователно: firewall правилата, bridge-a, openvpn-a

Внимание! може да загубите SSH връзка със сървъра (Raspberry-то), тъй като когато стартирате bridge-а, eth0- ще вземе нов адрес и статичния адрес ще премине в бриджа. Препоръчва се да имате директен достъп до операционната система (монитор и клавиатура).

~$ cd /etc/openvpn

~$ ./firewall-openvpn-rules.sh

~$ iptables –L -v

резултат:

iptables_rules

~$ service openvpn start

резултат: трябва да се стартира бриджа и след това vpn server-а startup-openvpn

~$ service openvpn status

openvpn_status

С това работата по сървъра приключва. Рестартирайте, за да сте сигурни, че всичко се стартира правилно – след рестарт проверете отново статуса на сървъра.

~$ shutdown –r 0

Конфигуриране на рутер

Трябва да насочите идващите заявки (към мрежата на организацията  – там където се намира VPN сървърът) да бъдат насочени към този VPN сървър. За целта, влизате в конфигурацията на рутера и създавате запис за “Forwarding”, който гласи, че заявки по протокол “TCP” от порт 443, да бъдат насочени към IP=192.168.2.9. При мен изглежда по следния начин:

ruter-config

Инсталиране – конфигуриране на клиент

Ще покажа инсталация и конфигурация на клиент под Windows операционна система.

Първо изтеглете инсталационния (exe) файл на openvpn клиент от ТУК.

Инсталирайте, като при стартиране на файла, изберете опция – “run as administrator” (от менюто чрез десен клик на мишката). При инсталацията, ще Ви попита дали искате да се инсталира мрежов адаптер (TAP) – отговаряте с YES.

След инсталация, влизате в Start menu –> Control panel –> Network and Sharing Center –> Change adapter settings, където преименувате новосъздадения мрежов адаптер примерно на “MyTAP(Важно е да няма интервали в името).

В директорията “C:\Programs Files\OpenVPN\config” копирате взетите от сървъра клиентски файлове: “ca.crt”, “client1.crt” (Boris.crt), “client1.3des.key” (Boris.3des.key) и създавате файл с име “client.ovpn” (може да го създадете и редактирате с текстов редактор). Имате възможнос за сваляне на примерна конфигурация от ТУК. Файлът трябва да съдържа:

client

dev tap

dev node MyTAP – MyTAP – заместете с името което сте поставили на мрежовия адаптер

proto tcp

remote XXX.XXX.XX.XXX 443 – IP адрес и порт за връзване – това е публичния IP адрес (адреса на рутера) на организацията където е VPN сървърът. Може да изпозвате и DNS име или DDNS (много от доставчиците не предоставят статични IP адреси или имена, но дават DDNS (dinamic DNS).

nobind

persist-key

persist-tun

ca ca.crt

cert Boris.crt – сертификата на клиента

key Boris.3des.key – ключа на клиента

ns-cert-type server

tls-auth ta.key 1 – на сървъра е 0-ла, тук(при клиента) е 1

cipher AES-256-CBC – каквото сте задали в конфигурацията на сървъра

auth SHA512 – същото криптиране каквото е на сървъра

comp-lzo

verb 3

– между таговете “tls-auth”, копирате съдържанието на файла ta.key(с началния и краен коментар)

<tls-auth>

——- BEGIN OpenVPN Static key V1 —-

**********************************

——— END OpenVpn Static key V1 —-

</tls-auth>

Ако се опитвате да се свържете през прокси сървър трябва да сложите конфигурация за proxy

http-proxy-retry

http-proxy 10.20.x.x 8080 – IP и порт на proxy сървър.

ако прокси сървъра използва парола, създавате файл примерно “proxyconf” в config директорията и файлът го задавате по следния начин:

http-proxy 10.20.x.x 8080 proxyconf basic

 

Създаване на допълнителни клиенти:

Влизате като Pi и преминавате с пълни root права:

~$ sudo –s

В работната директория (в моя случай /root/openvpn/easy_rsa/2.0/, изпълнявате стъпките свързани само с клиентите и инициализацията на променливите:

~$ cd /root/openvpn/easy_rsa/2.0/

~$ . ./vars

ВНИМАНИЕ! НЕ изпълнявате clean-all

~$ ./build-key-pass client3 – потвърждаваме информацията или променяме при желание. Задаваме парола за ключа, а за канала оставяме празно (описано по горе в този пост)

~$ cd keys

~$  openssl rsa –in Client3.key -des3 -out Client3.3des.key – паролата от предната стъпка – (подробно описание по горе)

Копирате и предоставяте на клиента файловете “ca.crt”, “client3.crt”, “client3.3des.key”, както и конфигурирания “client.conf” файл съдържащ ta.key в себе си.