от Lucifer

Снощи, след като прекарах едни 5-6 часа в едно кафене, свързан за техния Wi-Fi, се прибрах в нас с идеята да взема да намеря някакъв начин за SSH Tunnelling на трафика в Android. След много ровене, намерих някакво решение, което меко казано работеше половинчато. Но попаднах отново на идеята за VPN сървър и поддръжката на VPN под Android. Това, което не знаех е, че Android не поддържа нативно OpenVPN, който си идва в любимия Slackware.

Преди много време бях правил опити да подкарвам OpenVPN с идеята да свържа две мрежи и да ги превърна в една (София и Варна) за да мога да ползвам ресурсите и на двете, но в някакъв момент инфраструктурата ми се изнесе към София … и да си призная, вече не ми трябва. Но покрай телефона и многото отворени мрежи, ми трябва начин по който да мога да защитавам трафика си от всеки, който се опита да надникне в него. PuTTY + SSH Tunnels е много хубаво решение, но неприложимо за Android … какво да се прави.

Каква е постановката:

Един (или n на брой) Android device, който трябва да прекара целия си трафик през защитен канал.

Един OpenVPN server, който е разположен върху Slackware (предполагам на другите Linux базирани операционни системи ще е подобно).

Условия:

По принцип ми се искаше системата да може да се идентифицира с User и Pass, които да се взимат от IMAP server на същата машина, но за момента не мога да намеря свестен PAM модул, а не искам да понижавам сигурността с използването на външни скриптове, за това ще използвам сертификати.

OpenVPN за Android не поддържа tap interface (единственото хубаво нещо на tap пред tun, което аз виждам, е че с tap може да се направи network bridge (две мрежи да се обединят в една, което е идеално за бизнес)). Условието на tun интерфейса е да му се даде отделен IP Range (основната ми мрежа е на 192.168.0.0/24, tun-а, поне този на UDP е на 192.168.10.0/24).

Искам целия трафик на клиента, да излиза през VPN връзката, която искам да е шифрована.

Изпълнението:

За сървъра:

Преди да започнем с конфигурацията, трябва да си генерираме ключовете – това включва Certificate Autority (ако си нямаме), сървърна двойка ключове и така наречения  Diffie Hellman key, който (според Wikipedia) помага за идентифицирането на нови потребители за чиито ключове сървъра не знае (не ме гледайте мен – криптографията не е ми е силна страна). Всичко това се случва лесно – някъде из документацията на OpenVPN трябва да имате папка easy-rsa в която трябва да има набор скриптове, които да ви помогнат за генерирането на ключовете.

При мен (под Slackware) пълния път до скриптовете е:

/usr/share/doc/openvpn-2.x.x/easy-rsa/2.0/

Това което трябва да направите вътре е да промените vars така, че да отговарят на желанията ви.

root# ./clean-all
root# ./build-ca

Първата команда чисти всички налични вече ключове, втората, генерира Certificate Authority, което ще ни послужи после за подписване на ключовете.  Имайте предвид, че така генерирания ca.key е може би най-важното нещо, в цялата размяна на ключове, за това го скатайте някъде. Ако имате друго CA, което да използвате – можете да го използвате него за генериране и подписване на ключове.

root# ./build-dh

Ще генерира Diffie Hellman key, който ще ни трябва за сървъра.

root# ./build-key-server server

Ще генерира сървърна двойка ключове. Не забравяйте да зададете Common Name (CN). Това е един от най-важните параметри. След като ги генерира – ги подписва с нашето CA. Копирате създадените ключове, някъде (по подразбиране е /etc/openvpn/keys) и давате на татък. И сега идва малко по-сложния момент – конфигурация на сървъра.

Отворете /etc/openvpn/openvpn.conf с любимия си редактор за документи.

port 1194
proto udp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key # This file should be kept secret
dh /etc/openvpn/keys/dh1024.pem
client-to-client # To allow clients to see each other
server 192.168.10.0 255.255.255.0 # Set to virtual network and subnet mask
client-config-dir /etc/openvpn/ccd
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS xx.xx.xx.xx"
push "dhcp-option DNS xx.xx.xx.xx"
push "redirect-gateway def1"
#auth-user-pass-verify /etc/openvpn/auth-imap.pl via-file
#script-security 3 system
keepalive 10 120
cipher AES-256-CBC # AES
#cipher none
comp-lzo
persist-key
persist-tun
user nobody
group nobody
status openvpn-status.log
log /var/log/openvpn.log
log-append /var/log/openvpn.log
verb 3

Това горе-долу, означава че когато OpenVPN се стартира, той ще слуша на порт 1194 на UDP протокола и ще създаде виртуална мрежова карта от TUN тип. Тъй като искаме целия трафик (дори web трафика на потребителя) да минава през нас му изпращаме нашите DNS-и и добавяме redirect-gateway опцията (трите push реда). Тук искам да отворя една малка скоба – ако потребителя е на DHCP в своята мрежа, то той от време на време ще се налага да се свързва с DHCP сървъра за да си иска адрес, който няма да успява да си вземе и ще разпада връзката.

До тук добре, но ако и вие като мен имате сносно написан firewall ще се наложи да направите малко настройки:

трябва да разрешите FORWARD и INPUT през tun0 устройството за 192.168.10.0/24.

трябва да разрешите маскарадинга за мрежата и tun устройството.

И разбира се сте сигурни, че сте си разрешили достъпа до оказания порт на оказания протокол.

Стартирайте сървъра с openvpn –config /etc/openvpn/openvpn.conf

За клиента:

Нещата за клиента са много по прости. От easy-rsa папката изпълнете:

root# ./build-key potrebitel

Като не забравите да сложите Common Name(CN). Прехвърлете ca.crt и трите potrebitel.* файла по сигурен начин на клиента. Специално за Android има много приятен клиент.

За всеки клиент можете да дефинирате нови ключове или да дадете тези на всички клиенти – както ви е най-удобно.

Когато настройвате клиента, гледайте опцията cipher на потребителя и на клиента да съвпадат. Това е начина по-който ще се криптира трафика.

Това е едно допълнително ниво на сигурност, което не е излишно. Поне на мен ми спестява много чудене дали и кога да ползвам разните там отворени мрежи с които се сблъсквам.

Малко по-на татък смятам да добавя още 1 сървър, както и пусна връзка през tcp за случаите когато собственика на мрежата в която съм хитрее …

Надявам се да съм ви помогнал.

Ваш,

Lucifer

2 Отговори на “OpеnVPN … за параноика в мен (Geek Time)”

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

 

Този сайт използва Akismet за намаляване на спама. Научете как се обработват данните ви за коментари.