Снощи, след като прекарах едни 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-allroot# ./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 tunca /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.txtpush "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 systemkeepalive 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.logverb 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
ConnectBot подържа тунели и е безплатен доколкото знам
То хубаво поддържа, ама как да накарам browser-а да минава през него?
А така е по-лесно …