OpenVPN část 2

8.12.2015 Zdroj: Root.cz

V minulém článku jsme si OpenVPN nainstalovali a vytvořili jsme "obyčejný a nudný" tunel. V dnešním dílu se vrhneme na konfiguraci opravdové VPN.

Od verze 2.0 (v současné době je k dispozici teprve beta, ale již velice stabilní) OpenVPN umí tzv. client/server mód. V tomto režimu se k jednomu serveru může připojit více klientů, a vytvořit tak opravdovou virtuální privátní síť.

Použijeme scénář z „klasické úlohy obchodních cestujících vybavených notebooky“™. V tomto případě máme domovskou síť, která nabízí určité služby. Potom máme obchodní cestující, kteří jsou vybaveni notebooky a jsou schopni se připojovat k Internetu. Pro tyto obchodníky potřebujeme zajistit plnohodnotný a bezpečný přístup do domovské sítě a možnost využívat její služby. A celé to musí být pokud možno co nejjednodušší a nejtransparen­tnější. V anglické terminologii se těmto obchodníkům říká „roadwarriors“ a tomuto scénaři „roadwarriors scenario“.

Budeme předpokládat, že domovská síť (v sídle firmy) je vybavena linuxovým serverem, který je z Internetu dostupný alespoň na jednom UDP portu. Tomuto počítači „přidělíme“ adresu vpnserver.exam­ple.com. Dále budeme předpokládat, že mobilní stanice jsou vybaveny MS Windows. Vše by samozřejmě fungovalo i s jakýmkoliv jiným OpenVPN podporovaným operačním systémem, ale současné statistiky použitých operačních systémů na noteboocích obchodních cestujících jsou přeci jenom nakloněny právě MS Windows…

V režimu klient/server je potřeba použít SSL a X.509 autorizaci, sdílený klíč je možno použít pouze jako doplněk (viz dále). Proto je potřeba mít k dispozici nějakou certifikační autoritu nebo alespoň nějaké platné certifikáty. Použití cizí certifikační autority má tu nevýhodu, že OpenVPN standardně přijme kohokoliv, kdo se prokáže platným certifikátem. Je tedy nutné nakonfigurovat filtr, který podle jména certifikátu rozhodne, zda daného uživatele povolí, či nikoliv. Problematiku certifikátů zde nebudu podrobně rozebírat, zájemce odkážu na článek Jak na OpenSSL. Budu předpokládat, že máte k dispozici certifkát certifikační autority i certifikáty a klíče jednotlivých uživatelů.

Nejprve trocha teorie. OpenVPN server poslouchá na daném UDP (případně i TCP) portu. Ve chvíli, kdy OpenVPN obdrží nějaký paket, pokusí se pomocí UDP spojení navázat SSL/TLS komunikaci a ověřit certifikát druhé strany oproti certifikátu zvolené certifikační autority. Zde je možno ověřit pomocí externího skriptu, zda jméno z certifikátu druhé strany povolit. Pomocí takto vybudovaného řídícího SSL/TLS spojení se obě strany dohodnou na klíčích a šifrách, které budou používat k zabezpečení přenášených dat. Na závěr OpenVPN server pošle klientovi konfigurační volby obsahující např. jeho IP adresu, nastavení směrování atp. Chování většiny těchto kroků je navíc možno ovlivnit pomocí externích skriptů.

Do jednoho UDP (resp. TCP) spojení potom OpenVPN „skládá“ vlastní přenášená data a vlastní řídící spojení. Pomocí tohoto řídícího spojení OpenVPN například v periodických intervalech obměňuje šifrovací klíče. Zajímavé je použití sdíleného klíče jako doplňku k SSL/TLS. Pokud při SSL/TLS režimu použijeme sdílený klíč, budou všechna data pro řídící spojení podepisována pomocí tohoto klíče. Díky tomu je možné nepodepsané nebo špatně podepsané pakety rovnou zahazovat. Tím se sníží účinnost DoS útoku, protože všechny výpočetně náročné operace při navazování spojení se provádějí pouze tehdy, pokud je paket správně podepsán. Stejně tak v případě útoku na knihovnu OpenSSL musí útočník nejprve získat tento tajný klíč, jinak se jeho zákeřná data k OpenSSL knihovně vůbec nedostanou.

Klient má tedy k dispozici virtuální síťové zařízení s přidělenou interní IP adresou z rozsahu VPN. Veškerá komunikace mezi klientem a serverem je šifrována a případně komprimována. Pomocí směrování je možné přes VPN směrovat jakýkoliv provoz včetně broadcastových packetů, které jsou nutné pro správné fungování některých služeb (Okolní počítače v MS Windows, CUPS, síťové hry a další).

Dost bylo teorie, začněmež s konfigurací. Na linuxový server nainstalujeme OpenVPN (viz minulý díl) a vytvoříme následující konfigurační soubor /etc/openvpn/vpn_ser­ver.conf:

mode server
tls-server
dev tap0
ifconfig 10.0.1.100 255.255.255.0
ifconfig-pool 10.0.1.1 10.0.1.90 255.255.255.0
duplicate-cn

ca /etc/openvpn/cacert.pem
cert /etc/openvpn/vpn.crt
key /etc/openvpn/vpn.key
dh /etc/openvpn/dh1024.pem

log-append /var/log/openvpn
status /var/run/openvpn/vpn.status 10

user openvpn
group openvpn
comp-lzo
verb 3
Postupně si popíšeme jednotlivé volby. Na prvním řádku je stěžejní volba mode server, která způsobí, že OpenVPN bude fungovat v režimu client/server. Na dalším řádku pomocí volby tls-server nastavujeme, že tento počítač bude vystupovat v rámci TLS spojení jako server. Pomocí volby dev tap0 upřesňujeme, jaké zařízení se má vytvořit. To je vhodné zejména pokud máme na jednom počítači více VPN.

Další dva řádky určují, jakou IP adresu a netmasku bude mít vlastní server a jaké IP adresy a netmasky má přidělovat klientům. Server bude mít tedy adresu 10.0.1.100 a klienti budou dostávat adresy v rozsahu 10.0.1.1 až 10.0.1.90. Volba duplicate-cn povoluje současné přihlášení více klientů se stejným certifikátem.

V dalším bloku jsou uvedeny konfigurační direktivy pro SSL/TLS. Jedná se postupně o tyto soubory: certifikát certifikační autority, certifikát serveru, klíč serveru a parametry pro Diffie-Hellman protokol. Soubor s parametry pro Diffie-Hellman je možno vytvořit pomocí příkazu:
openssl dhparam -out dh1024.pem 1024.

Potom jsou uvedeny parametry logování (log-append) a nastavení jména souboru, kam OpenVPN pravidelně ukládá svůj stav (status).

Na závěr jsou uvedeny volby pro změnu efektivních práv, povolení komprese a stupeň ukecanosti démona. Nyní můžeme VPN spustit buď pomocí spouštěcího skriptu, nebo příkazem openvpn –config /etc/openvpn/vpn­.conf. Pokud nyní zadáme příkaz ifconfig, uvidíme výstup podobný tomuto:

tap0 Link encap:Ethernet HWaddr 00:FF:C5:65:F0:76
inet addr:10.0.1.100 Bcast:10.0.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:105554 errors:0 dropped:0 overruns:0 frame:0
TX packets:174987 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:10300276 (9.8 Mb) TX bytes:180523332 (172.1 Mb)
Tím je počáteční konfigurace serveru dokončena. Doporučuji si pročíst manuálovou stránku openvpn a rozšířit konfiguraci podle potřeby. Stručně zmíním některé zajímavé volby:

push – pošle klientovi konfigurační parametry, například směrovací záznam, nějaký DHCP parametr atd.
client-config-dir – Cesta k adresáři, kam je možné ukládat konfigurace pro každého klienta zvlášť. Pokud se v tomto adresáři najde soubor se jménem stejným, jako je Common Name certifikátu uživatele, pošle se pomocí push klientovi jeho obsah.
client-to-client – Pokud chtějí dva klienti komunikovat mezi sebou, prochází jejich pakety směrovacím mechanismem kernelu. Tato volba způsobí, že se pakety „otočí“ ihned v OpenVPN démonovi (klienti nikdy nekomunikují přímo, vždy přes server).
max-clients – Maximální počet současně připojených klientů
Především posílání směrovacích záznamů je praktická věc. Tyto záznamy se při ukončení spojení automaticky zruší (v případě změny default route se vrátí původní hodnota) a navíc se nemusíme starat o „drobné“ rozdíly v syntaxi příkazů pro nastavování směrování na jednotlivých klientských systémech.

Konfigurace klienta je obdobně jednoduchá. Nainstalujeme OpenVPN (viz minulý díl) a použijeme následující konfigurační soubor (na Windows například C:\Program Files\OpenVPN\con­fig\vpn_klien­t.ovpn):

remote vpnserver.example.com
tls-client
dev tap
pull

mute 10
ca cacert.pem
cert klient.cert
key klient.key

comp-lzo
verb 3
Na prvním řádku je uvedena adresa serveru, na druhém SSL/TLS režim. Dále je uveden typ zařízení, které se má použít. Pokud chcete na Windows používat více VPN najednou, je potřeba vytvořit více virtuálních zařízení a pomocí volby dev-node určit, které se má použít. Všechny dostupné adaptéry vypíše příkaz openvpn –show-adapters.

Důležitý je parametr pull, který povoluje stažení konfigurace ze serveru (pomocí volby push). Tím umožníme centrální správu nastavení jednotlivých klientů. Dále jsou ještě uvedeny názvy souborů s klíčem a certifikáty, komprese a ukecanost. Další možné volby si jistě laskavý čtenář nastuduje sám z doporučené literatury (man openvpn).

Pokud se soubor nachází v adresáři config a má příponu ovpn, spustí se automaticky při startu služby OpenVPN. Za lepší variantu považuji použít GUI klienta, který se usadí v systémové trayi a umožňuje pohodlné ovládání nalezených konfiguračních souborů. OpenVPN lze samozřejmě spouštět i „klasicky“, například z různých skriptů apod.

Libovolným způsobem spustíme OpenVPN, a pokud všechno proběhlo správně, dostane náš virtuální síťový adaptér IP adresu z rozsahu VPN:

Adaptér sítě Ethernet OpenVPN virtual tap interface:

Přípona DNS podle připojení . . . :
Adresa IP . . . . . . . . . . . . : 10.0.1.1
Maska podsítě . . . . . . . . . . : 255.255.255.0
Výchozí brána . . . . . . . . . . :
Nyní můžeme zkusit ping:

C:\>ping 10.0.1.100

Příkaz PING na 10.0.1.100 s délkou 32 bajtů:

Odpověď od 10.0.1.100: bajty=32 čas=6ms TTL=64
.....
I traceroute:

C:\>tracert 10.0.1.100

Výpis trasy k 10.0.1.100 [10.0.1.100]
s nejvýše 30 směrováními:
1 5 ms 2 ms 2 ms 10.0.1.100 [10.0.1.100]
Trasování bylo dokončeno.
Tímto optimistickým výstupem bych článek ukončil a popřál vám mnoho zdaru. Happy VPNing!