Komplexní řešení pro více klientů
Vytvoření tunelu mezi dvěma počítači je jistě užitečné, ale co když se chcete připojovat na VPN server z více počítačů, nebo dokonce nabídnout klientům možnost směrovat veškerou svou komunikaci přes VPN? I to samozřejmě OpenVPN umí. Pro snadnou správu přístupu mnoha klientů k VPN serveru využívá OpenVPN PKI. Je tedy třeba začít vytvořením certifikační autority, dále certifikátu serveru a certifikátu klientů.
Vytvoření certifikační autority
Prvním krokem je vytvoření vlastní certifikační autority. Můžete tak učinit buď ručně pomocí nástroje openssl
, nebo si značně usnadnit práci pomocí pomocných skriptů. V Debianu naleznete příslušné skripty v adresáři /usr/share/doc/openvpn/examples/easy-rsa
, takže si je odtud zkopírujte někam jinam, třeba do /etc/openvpn
, takto:
cd /etc/openvpn cp -r /usr/share/doc/openvpn/examples/easy-rsa . cd easy-rsa/2.0
Postup pro vytvoření certifikační autority je následující. Upozorňuji, že tento postup (přesněji druhý příkaz) smaže všechny klíče, které jste dosud vytvořili (pokud toto provádíte poprvé, není se samozřejmě čeho obávat).
. ./vars ./clean-all ./build-ca
Po dokončení této procedury byste měli nalézt příslušné výstupy, tzn. zejména soubor ca.crt
s kořenovým certifikátem certifikační autority a soubor ca.key
se soukromým klíčem certifikační autority (tím se pak podepisují jednotlivé dílčí certifikáty).
Vytvoření serverového klíče
Máte-li vygenerovanou certifikační autoritu, můžete si nechat vygenerovat serverový certifikát. To provedete ve stejném adresáři následujícím příkazem:
./build-key-server server
Za slovo server
si dosaďte libovolné jméno. Zde budete opět vyzváni k zadání řady informací. Ujistěte se, že na konci odpovíte na dotaz "y", tedy opravdu podepsat daný certifikát.
Vygenerování certifikátů a klíčů pro uživatele
Pro každého uživatele vygenerujte jeho vlastní certifikát spolu s klíčem, pomocí kterých se bude připojovat k serveru. K tomu vám poslouží následující příkaz:
./build-key jmeno_klienta
Vygenerování Diffie Hellman parametrů
Posledním krokem je vygenerování parametrů pro Diffie Hellman protokol. To provedete příkazem:
./build-dh
Umístění jednotlivých souborů
Až budete mít vygenerované všechny soubory, bude potřeba je vhodně rozmístit. Obecně, soubory s příponami .key
obsahují privátní klíče a měly by být pečlivě střeženy (doporučuji jim nastavit práva 400
), ostatní být střeženy nemusí. Přípona .crt
označuje jednotlivé certifikáty - certifikát certifikační autority, certifikát serveru a certifikáty klientů. Diffie Hellman parametry se pak nacházejí v souboru dh*.pem
, kde hvězdička bude odpovídat velikosti klíče - výchozí hodnota je 1024
, ale je samozřejmě možné vygenerovat větší.
Soubory pro klienta
Klienti by měli mít k dispozici následující soubory:
-
ca.crt
- kořenový certifikát certifikační autority -
klient1.crt
- odpovídající certifikát klienta -
klient1.key
- odpovídající privátní klíč klienta
Soubory pro server
Server musí mít k dispozici následující soubory:
-
ca.crt - viz výše
-
server.crt
- serverový certifikát -
server.key
- soukromý klíč k serverovému certifikátu -
dh*.pem
- Diffie Hellman parametry
Ostatní soubory
Jediným souborem, který jste vygenerovali a nebyl popsán výše, je soubor ca.key
s klíčem pro kořenový certifikát certifikační autority. Ten není nutné mít přímo na serveru - je totiž nutný pouze k podepisování certifikátů. Z bezpečnostních důvodů je dokonce vhodné, aby byl někde v bezpečí mimo server.
Konfigurace OpenVPN serveru
Příklad konfigurace serveru může vypadat následovně. Konfiguraci si přizpůsobte svým potřebám:
local 1.2.3.4 dev tap mode server ifconfig 10.45.42.1 255.255.255.0 ifconfig-pool 10.45.42.2 10.45.42.102 255.255.255.0 tls-server ca /etc/openvpn/ca.crt cert /etc/openvpn/server.crt key /etc/openvpn/server.key dh /etc/openvpn/dh1024.pem user nobody group nogroup comp-lzo keepalive 10 20 ping-timer-rem persist-tun persist-key verb 3 duplicate-cn client-to-client max-clients 100
U všech cest k souborům se ujistěte, že ukazují správně. Parametr local
označuje IP adresu serveru, kde bude k dispozici OpenVPN server. Parametr ifconfig
označuje IP adresu serveru v rámci VPN tunelu. Klientům budou přiřazovány IP adresy z rozsahu, který je specifikován parametrem ifconfig-pool
. Mezi další důležité parametry patří:
-
tls-server
- zapíná TLS v režimu serveru -
duplicate-cn
- umožní, aby se připojilo více klientů se stejným certifikátem -
client-to-client
- umožní klientům, aby na sebe "viděli" a mohli spolu komunikovat -
max-clients 100
- limit počtu současně připojených klientů
Konfigurace klienta
Pro klienty použijte následující vzor konfiguračního souboru:
remote 1.2.3.4 client dev tap tls-client ns-cert-type server ca /etc/openvpn/ca.crt cert /etc/openvpn/klient1.crt key /etc/openvpn/klient1.key nobind comp-lzo keepalive 10 20 ping-timer-rem persist-tun persist-key verb 3
Řadu parametrů zde již jistě znáte, pro jistotu ještě zopakuji upozornění, abyste si přizpůsobili veřejnou IP adresu serveru (parametr remote
) a cesty k jednotlivým souborům. Mezi důležité volby patří:
-
tls-client
- zapíná TLS v režimu klienta -
ns-cert-type server
- ověřuje serverový certifikát (pomáhá zabránit man-in-the-middle útokům, kdy by se útočník vydával za server)
Extra zabezpečení pomocí sdíleného klíče
Ačkoliv infrastruktura založená na certifikátech nevyžaduje použití sdílených klíčů (což je ostatně jejím účelem), můžete pro zvýšení bezpečnosti sdílený klíč přeci jen vytvořit a používat jako bezpečnostní vrstvu navíc - server pak bude kontrolovat HMAC podpisy paketů a bude ignorovat pakety, které nebudou mít správný podpis. Klíč vytvoříte následujícím příkazem:
openvpn --genkey --secret klic
Následně je třeba dopravit klíč všem klientům a upravit konfiguraci serveru přidáním následující řádky do konfiguračního souboru:
tls-auth soubor_s_klicem 0
Nezapomeňte doplnit cestu k souboru s klíčem. Do konfiguračních souborů klientů je třeba doplnit podobnou řádku, ale s číslem 1 místo nuly:
tls-auth soubor_s_klicem 1
Směrování komunikace přes VPN
OpenVPN umožňuje, aby klienti směrovali veškerou svou komunikaci přes VPN tunel, což umožňuje vytvářet různé "anonymizační" služby založené na této technologii. Tato vlastnost se hodí mj. i k tomu, abyste zabezpečili svou komunikaci, pokud se třeba připojujete přes nešifrovanou wifi, kde vás může kdokoliv ve vaší blízkosti šmírovat (alespoň vaši nezabezpečenou komunikaci).
Směrování paketů
Abyste zajistili směrování komunikace v rámci OpenVPN serveru, musíte nejprve povolit směrování paketů. To můžete provést buď s dobou trvání do příštího restartu, nebo permanentně. Dočasné nastavení provedete příkazem:
sysctl -w net.ipv4.ip_forward=1
Permanentní nastavení provedete zapsáním níže uvedené řádky do souboru /etc/sysctl.conf
:
net.ipv4.ip_forward=1
Podívejte se na nastavení firewallu (iptables -L -n -v
), zejména pak na řetěz FORWARD
, který musí povolovat průchozí pakety z virtuálního rozhraní VPNky směrem na vnější síťové rozhraní.
NAT / maškaráda
Jelikož VPN síť využívá adresy z privátního rozsahu, je nutné vytvořit maškarádu, tedy vhodnou formu NATu (překladu adres), která zajistí, aby si pakety zvenčí našly cestu k příslušnému klientovi, který si je vyžádal. To zajistíte následujícím příkazem:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Toto nastavení bude fungovat pouze do příštího restartu serveru. Permanentní nastavení je v Debianu možné zařídit pomocí balíčku iptables-persistent
a nástroje iptables-save
:
iptables-save > /etc/iptables/rules
Tento příkaz uloží aktuální konfiguraci pravidel Netfiltru a při příštím spuštění systému bude zajištěno jejich opětovné načtení.
Úprava konfigurace OpenVPN serveru
Následně upravte konfigurační soubor OpenVPN serveru a přidejte do něj následující řádky:
push "route-gateway 10.45.42.1" push "redirect-gateway def1" push "dhcp-option DNS 10.45.42.1"
Jako parametr pro volbu route-gateway
zadejte IP adresu serveru v rámci VPN, tedy IP adresu, kterou jste zadali jako parametr volby ifconfig
. První řádka zajistí, že se klientovi pošle specifikovaná IP adresa brány. Druhá volba zajistí, že se klientovi nařídí, aby přesměroval veškerou svou komunikaci přes VPN. Parametr def1
zajistí, aby se neodstranila původní brána z konfigurace sítě klienta.
Parametr dhcp-option DNS
zajišťuje zaslání informace o DNS serverech klientovi. Tento parametr samozřejmě předpokládá dostupný funkční resolvující DNS server. Pokud se vám nechce nastavovat vlastní DNS server na serveru s OpenVPN, můžete použít buď OpenDNS, nebo Google DNS. Stavba vlastního DNS serveru je mimo zaměření tohoto článku, ale mohu vám v této souvislosti pro tuto konkrétní potřebu doporučit balíček dnsmasq
.
Úprava konfigurace OpenVPN klientů
U linuxových OpenVPN klientů se ovšem nastavení DNS pomocí dhcp-option
neprojeví - je nutné jej odchytit z proměnných prostředí a zpracovat skriptem. Tento skript si naštěstí nemusíte psát sami - měl by být součástí OpenVPN balíku a měl by sídlit v /etc/openvpn/update-resolv-conf
. Ke své činnosti vyžaduje balík resolvconf
, takže se raději ujistěte, že jej máte nainstalovaný. Pak už jen postačí upravit konfiguraci klienta přidáním následujících řádků do konfiguračního souboru OpenVPN:
up /etc/openvpn/update-resolv-conf down /etc/openvpn/update-resolv-conf script-security 2
Neposlušný klient aneb Jak si nenechat mluvit do směrování
Pokud máte takto nastavený server a jste v pozici klienta, který nechce, aby se mu veškerá komunikace směrovala přes VPN, ale vytvořit VPN tunel chcete, můžete do svého konfiguračního souboru přidat parametr route-nopull
. Tento parametr způsobí, že OpenVPN nebude ze serveru přebírat informace pro směrování.