Apr 12 2016
Инсталиране и конфигуриране на RASPBERRY PI 2 B (Raspbian OS) като VPN server (OpenVPN) част 2/2
Какво е VPN server ?
VPN или Virtual Private Network или казано с други думи виртуална частна мрежа. Щом четете как се прави, предполагам знаете и за какво служи, но все пак, нека да дам въведение в темата. Когато изградите такава виртуална мрежа, Вие получавате защитен достъп на отдалечен компютър до определена частна мрежа. Какво искам да кажа ? Ако в къщи или в офиса имате изградена вътрешна мрежа и искате да я достигнете от друг компютър (най – често лаптоп), който се намира извън нея – нуждаете се от VPN./снимка взета от тук/
Какво ще направи VPN ?
Когато пуснете VPN от клиентската машина, програмата по криптиран канал, ще се свърже с вашия VPN Server, ще се оторизира и след това ще изгради криптиран канал между Вас (клиентската машина) и мрежата на организацията към която се свързвате. По този начин, Вие ще получите IP от отдалечената мрежа (от VPN server-а). Спрямо настройките, целият Ви интернет трафик, може да мине през този канал или само трафикът, насочен към мрежата на организацията. Извършвайки това, въпреки че не сте се вързали директно в мрежата на организацията, Вие чрез VPN сте в нея, и може да я използвате с пълните възможности, които предлага. Всичко това се случва по сигурен криптиран канал между Вас и отдалечената мрежа.
Защо имам нужда (за какво ми е) ?
Нужда от VPN имат всички, които имат изградена мрежа вкъщи или в офиса и трябва да достигат ресурси по тази мрежа.
Много често VPN се използва, ако имате няколко сървъра и трябва направите нещо по тях или използвате софтуерно приложение (било то инсталирано на работната Ви станция или web базирано – но не публично достъпно) – Вие трябва да достъпите, да сте в мрежата на организацията. За да може да включите Remote Desktop към работната си станция, респективно браузър (browser) с вътрешен адрес (на организацията) на приложението, или да си достъпите сървърите Ви е нужен VPN. Дори ако имате няколко физически разделени мрежи (например няколко офиса на различни места), може да ги обедините, чрез този тип връзка.
Едно от предимствата на VPN пред други софтуерни продукти, които дават отдалечен достъп до компютър са, че повечето софтуери Ви дават възможност за връзка с един компютър. Обикновено има редица ограничения: например при windows компютрите, десктоп-а става черен, и ред други ограничения – прехвърляне на файлове и т.н. VPN Ви дава достъп до цялата мрежа, дава възможност за Remote Desktop, за много паралелни SSH връзки и прочие. Както казах, реално сте в мрежата си и можете да правите всичко, което правите в нея.
Защо OpenVPN ?
OpenVPN има безплатна версия – 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
Вашият OpenVPN е инсталиран, но тепърва започва конфигурацията. За по-нататък, ще трябва да сте винаги като root потребител, затова изпълнявате командата:
~$ 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.git
~$ cd easy-rsa
~$ git checkout 2.2.2
В този случай, по-добре е да копирате easy-rsa в отделна директория, за да не е обвързана с GIT, но ако желаете, може да работите и директно в тази директория. Аз ще копирам и ще показвам следващите команди от новата дестинация.
~$ cd /root/openvpn
~$ mkdir easy_ras
~$ cd easy_rsa/
~$ cp –r /root/openvpn/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 KEY_SIZE=2048 – така ключът е по-голям – ако не желаете да е толкова голям, може да го намалите на 1024, като в последващите конфигурации, ще трябва да сложите същото число.
Попълнете и данните за вашата организация – НЕ оставяйте празни полета
export KEY_PROVINCE
export KEY_CITY
export KEY_ORG
export KEY_EMAIL
export KEY_OU
Запазвате промените във файла, за mcedit – натискате F10 и програмата ще Ви попита, дали да запази промените преди затваряне.
Генериране на сертификати и ключове
Трябва да заредите направените промени и да изчистите директорията от стари ключове. За целта :
~$ . ./vars
~$ ./clean-all – Внимание! – при бъдещо генериране на допълнителни потребители – НЕ изпълнявайте тази команда – това изчиства директорията с генерирани сертификати.
Създаване на ключ се извършва чрез стартиране на build-ca
~$ ./build-ca –ще иска да потвърдите или промените данните, тъй като Вие сте въвели правилните дефолтни данни в “vars”, тук само натискате “enter” за потвърждение. Аз съм променил само “Common name”, тъй като не харесвам интервали в имената.
~$ build-key-server YOUR_SERVER_NAME – отново ще попита за данните. Важно е, да попълните “Commоn name” – това име ще Ви е необходимо и след това.
За “A challenge password” – не въвеждайте нищо, само натиснете “enter”.
На въпросите, показани по-долу, отговаряте с “y”
Време е, да направите клиентските сертификати. Аз ще направя един сертификат за потребител с име 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 – кодиране на клиентския ключ. Програмата ще поиска парола на първия ключ (генериран в предходната стъпка), след това за новия ключ, както и потвърждение. Аз въвеждам една и съща парола – какво е на оригиналния ключ.
Връщаме се в предходната директория, за да създадем “Diffie-Hellman key”, благодарение на който (казано с 2 думи) клиентът и сървърът, ще могат да си разменят сертификатите по сигурен начин при свързване (wikipedia). Тази команда отнема известно време – бъдете търпеливи. Тъй като аз съм с конфигурация за 2048 битов ключ, времето е повече, но не може да се каже колко с голяма точност, защото се използват произволни числа (когато писах тази статия, при мен отне около 40 мин).
~$ cd .. (или в моя случай това е директорията /root/openvpn/easy_ras_2.0/)
~$ ./build-dh
след около 40 мин. и екран пълен с точки продължаваме да защитаваме 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 – Забележете, тук се подава директорията и името на файла за ключа, като се препоръчва задаване на целия път. Съдържанието на този файл ще трябва да се копита при всеки един клиент (обяснено по нататък).
Разпределение на файловете
Време е да се сложат файловете по местата им. В описанието на 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
и разархивираме
~$ gunzip server.conf.gz
В него редактираме следните неща:
~$ mcedit server.conf
port 443 – порт на който ще “слуша” VPN-a. 443 в повечето случай е отворен навсякъде (хотели, заведения, компании), освен това, той е SSL портът по подразбиране и трафикът на пръв поглед ще се маскира, все едно сте в най-обикновена страница с SSL сертификат.
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-то
tls-auth ta.key 0 – генерираният статичен ключ 0- за сървъра, 1 за клиентите
cipher AES-256-CBC – криптиращ алгоритъм ( има и други, този е един от добрите)
auth SHA512 – още криптирания – може и по-слабо (SHA256), а по подразбиране е SHA128
max-client 10 – колко максимум клиенти може да има закачени
log-append openvpn.log – конфигурация – да има ли лог, дали да продължава стария, или да го зачиства при всяко рестартиране и къде да се намира
Инсталиране – конфигуриране на BRIDGE
За да поддържате множество клиенти Ви е необходим bridge (така и конфигурирахте server.conf файла). За целта, първо трябва да го инсталирате.
~$ apt-get install bridge-utils
От примерите, копирате стартовия и спиращия скрипт (или от ТУК).
Конфигурирате “моста” като задавате име, адаптор, TAP, IP, маска и broadcast:
tap=”tap0”
eth=”eth0” – лан картата, чрез която е вързано устройството
eth_ip=”192.168.2.9”
eth_netmask=”255.255.255.0”
eth=broadcast=”192.168.2.255”
Конфигуриране на стартиращ скрипт
За целта, препоръчвам да инсталирате “chkconfig”, с помощта на който може да конфигурирате стартовите и спиращите скриптове
С инсталиране на 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-а.
if [ –f $CONFIG_DIR/openvpn_startup ]; then
$CONFIG_DIR/openvpn_startup
fi
Както сами се досещате, имате нужда и от сктипта “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
Конфигуриране на 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
и отново му давам права за изпълнение
~$ chmod 750 firewall-openvpn-rules.sh
В конфигурацията на мрежата (“/etc/network/interface”), задавате да се заредят направените конфигурации, преди да се зареди мрежата.
~$ mcedti /etc/network/interface
Където записвате:
pre-up /etc/openvpn/firewall-openvpn-rules.sh
Тест за стартиране на VPN server
OpenVPN server –а е готов за използване. Време е да проверите, дали не сте объркали някой път, директория, файл или нещо друго.
Стартирайте последователно: firewall правилата, bridge-a, openvpn-a
Внимание! може да загубите SSH връзка със сървъра (Raspberry-то), тъй като когато стартирате bridge-а, eth0- ще вземе нов адрес и статичния адрес ще премине в бриджа. Препоръчва се да имате директен достъп до операционната система (монитор и клавиатура).
~$ cd /etc/openvpn
~$ ./firewall-openvpn-rules.sh
~$ iptables –L -v
резултат:
~$ service openvpn start
резултат: трябва да се стартира бриджа и след това vpn server-а
~$ service openvpn status
С това работата по сървъра приключва. Рестартирайте, за да сте сигурни, че всичко се стартира правилно – след рестарт проверете отново статуса на сървъра.
~$ shutdown –r 0
Конфигуриране на рутер
Трябва да насочите идващите заявки (към мрежата на организацията – там където се намира VPN сървърът) да бъдат насочени към този VPN сървър. За целта, влизате в конфигурацията на рутера и създавате запис за “Forwarding”, който гласи, че заявки по протокол “TCP” от порт 443, да бъдат насочени към IP=192.168.2.9. При мен изглежда по следния начин:
Инсталиране – конфигуриране на клиент
Ще покажа инсталация и конфигурация на клиент под 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 в себе си.