OpenVPN na mě od jisté doby působí jako kouzelné slůvko. Kozelné především v tom, že mi umožní pracovat v síti, na kterou jsou zvyklý i mimo tuto síť. Prakticky to tedy znamená, že můžete sedět doma, nebo cestovat vlakem a přitom díky OpenVPN a prostřednictvím Internetu pracovat se svými soubory umístěnými na souborovém serveru, tisknout na tiskárně umístěné ve vaší kanceláři atd. Tzn. provádět všechny činnosti na které jste zvyklí, pokud se nacházíte v této síti. Prakticky řečeno - v práci zaklapnu notebook, doma ho otevřu a pokračuju v tom v čem jsem začal...
Samozřejmě tato činnost má i svou nevýhodu a tou je bezesporu nutkání pracovat na úkolech vám svěřených i mimo kancelář - ono to je stejné jako s firemním notebookem, mobilem, autem a dalšími "požitky", které vám v zaměstaní dají k dispozici - vždy to je něco za něco a to něco se od vás vždy očekává. Ale pojďme se podívat jak na to.
Vyšel jsem z bezvadného návodu na abclinuxu.cz, který stačí použít a prostě to musí fungovat, s minimálními úpravami a ve zkratce:
Nastavení serveru
nainstalujte openvpn
aptitude install openvpn
zkopírujte si vzorové skripty
cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn
nastavte práva (v tomto adresáři budete generovat klíče, tak by tam neměl každý "vidět")
chmod 0700 /etc/openvpn/easy-rsa
upravte soubor /etc/openvpn/easy-rsa/2.0/vars (soubor sám je bohatě komentovaný), zejména vás zajímají tyto proměnné
export KEY_SIZE=2048
export KEY_COUNTRY=CZ
export KEY_PROVINCE="Czech Republic"
export KEY_CITY="City"
export KEY_ORG="OpenVPN-company"
export KEY_EMAIL="vpn@domaincom"
načtete vámi nastavené proměnné pro generování klíčů (pozor na začátku druhého řádku je opravdu symbol tečka)
cd /etc/openvpn/easy-rsa/2.0
. ./vars
vymažte vzorové klíče
./clean-all
vytvořte klíč certifikační autority
./build-ca
vytvořte certifikát pro server
./build-key-server server
vytvořte certifikáty klientů
./build-key-pass client1
./build-key-pass client2
....
Tyto certifikáty klientů budou chráněny heslem, pokud nechcete, aby uživatel musel zadávat heslo pro použití certifikátu, pak zadejte
./build-key client1
vytvořte Diffie Hellman parametry. Sice nemám tušení k čemu to je, ale řekněme, že to zvýší zabezpečení - opravdu jsem po tom nepátral. :-) Počítejte s tím, že to bude trvat 5-10 minut..
./build-dh
zkopírujte vytvořené klíče a nastavte na nich příslušná práva
cp /etc/openvpn/easy-rsa/keys/2.0/{ca.crt,server.crt,server.key,dh2048.pem} /etc/openvpn
chmod 600 /etc/openvpn/2.0/{ca.crt,server.crt,server.key,dh2048.pem} /etc/openvpn
Dál vytvořte soubor /etc/openvpn/vpn_server.conf a do něj přidejte následující:
# server
mode server
# tls jako server
tls-server
# port, 1194 = default
port 1194
# protokol, tcp/udp
proto tcp-server
# nastavi zarizeni
dev tap
# pouzita sit a jeji maska
server 10.0.1.0 255.255.255.0
# soucasne prihlaseni vice klientu
# duplicate-cn
# certifikat certifikacni autority
ca /etc/openvpn/ca.crt
# certifikat serveru
cert /etc/openvpn/server.crt
# klic serveru
key /etc/openvpn/server.key
# parametry pro Diffie-Hellman protokol
dh /etc/openvpn/dh2048.pem
# logy serveru
log-append /var/log/openvpn.log
# status serveru
status /var/run/vpn.status 10
# uzivatel pod kterym bezi server
user nobody
# skupina pod kterou bezi server
group nogroup
# udrzuje spojeni nazivu, 10 (ping) a 120 (ping-restart)
keepalive 10 120
# komprese prenasenych dat
comp-lzo
# ukecanost serveru
verb 3
push "route 192.168.1.0 255.255.255.0"
Poslední řádek je nepovinný, ale udává do které sítě bude možno přistupovat prostřednitvím openVPN. Tzn. síť a masku lokální sítě (za vašim serverem). Tato síť se pak nadeleguje klientům, které se připojí k serveru prostřednictvím openvpn a nastaví se jim směrování do této sítě. Aby to všechno fungovalo je třeba ještě zapnout "přehazování" paketů mezi rozhraními, na serveru ještě zadejte:
echo 1 > /proc/sys/net/ipv4/ip_forward
Tím je konfigurace serveru hotové za zmínku ještě stojí možnost delegovat klientům další informace jako je např. místní DNS server a server WINS, ale to ještě nemám moc odzkoušené, do souboru /etc/openvpn/vpn_server.conf je tedy možno přidat i tyto řádky:
push "dhcp-option DNS ip_pocitace_mistni_site"
push "dhcp-option WINS ip_pocitace_mistni_site"
Pak ještě spusťte opevnpn
/etc/init.d/openvpn start
a zkontrolujte log
tail -f /var/log/openvpn.log
příkazem ifconfig zkontrolujte, zda se vám objevilo nové síťové rozhraní označené jako tap0.
Nastavení klienta
na klientský počítač nainstalujte openvpn ;-)
aptitude install openvpn
vytvořte soubor /etc/openvpn/vpn_client.conf a do něj přidejte následující
# server ke kteremu se pripojujeme
remote server.cz
# tls jako klient
tls-client
# port, 1194 = default
port 1194
# protokol, tcp/udp
proto tcp-client
# nastaveni zarizeni
dev tap
# povoluje stazeni konfigurace ze severu
pull
# certifikat certifikacni autority
ca ca.crt
# certifikat klienta
cert client1.crt
# certifikat klienta
key client1.key
# uzivatel pod kterym bezi klient
user nobody
# skupina pod kterou bezi klient
group nogroup
# opakovani radku v logu
mute 10
# logy klienta
log-append /var/log/openvpn.log
# status klienta
status /var/run/vpn.status 10
# komprese prenasenych dat
comp-lzo
# ukecanost klienta
verb 3
je vidět, že tento soubor má téměř stejnou strukturu jako je ta na serveru. Po jeho vytvoření ještě musíte nějakou formou zkopírovat soubory ca.crt, client1.crt a client1.key do adresáře /etc/openvpn klientského počítače. Tyto soubory se nachází na serveru v adresáři /etc/openvpn/easy-rsa/2.0/keys. Pokud to chcete udělat tak jako já a ne tak jak se to má (tzn. dopravit soubory ke klientovi nějakou bezpečnou cestou - např. na disketě), pak si můžete soubory stáhnout přes sshfs, nebo si jejich obsah na serveru zobrazit a na klientovi je nově vytvořit, funkci CTRL+C a CTRL+V známe všichni.. 0:-)
Pak můžete spustit na klientovi openvpn
/etc/init.d/openvpn start
případně sledovat log, pokud je něco špatně. Pokud proběhne vše v pořádku, přibude vám i zde síťové rozhraní tap0 a vy budete moci komunikovat stejně jako byste byli uvnitř sítě.
Můj velký/malý problém
Pokud máte všechny soubory na svých místech, spojení proběhne korektně a v logu se nic zajímavého neobjeví, pak bude jistě vše fungovat. V mém případě to ovšem nefungovalo. Ping s lokální IP adresou počítače, na kterém běžel OpenVPN server sice běžel tak jak má, ale nikam jinam jsem se nemohl dostat... V této situaci (a hlavně pokud to člověk instaluje poprvé) platí zlaté pravidlo - "líná huba, holé neštěstí", takže jsem se zeptal jiných...
I když jsem měl vše dobře nastavené a v logu bylo čisto, problém spočíval jinde, než jsem myslel. V síti, do které jsem se takto připojoval není počítač, na kterém běží openvpn server zároveň branou a to je kámen úrazu. Paket, který projde přes openvpn do sítě za serverem a najde svého příjemce je tímto počítačem zpracován a poslán zpět. Bohužel v tomto schématu sítě tento paket dál neputuje zpět na openvpn server, ale na bránu, která si s tím neví rady a paket zahodí.
V praxi se to pak projeví tak, že nepřijde žádná odpoveď a celé se to tváři dost nefunkčně. A řešení? Tím je nastavit na bráně tzv. "IP next hop", nebo tak něco. Další možnost pak spočívá v přidání další routy na počítači, s kterým chceme komunikovat, to se provede takto:
route add -net 10.0.1.0 netmask 255.255.255.0 gw ip_adresa_open_vpn_serveru
tím se docílí toho, že se paket vrátí na server s openvpn a tím i k vám, kdo s ním komunikujete. Jo, počítače jsou záludná stvoření...