Správa linuxového serveru: OpenVPN server
VPN představuje možnost, jak vytvářet šifrované tunely, kterými je možno směrovat libovolnou komunikaci, počínaje vzdáleným zabezpečeným přístupem k SSH či databázi až po směrování veškeré komunikace přes šifrované spojení. Jak to lze realizovat pomocí OpenVPN, to je předmětem tohoto a následujícího dílu.

Úvod do OpenVPN
OpenVPN je F/OSS nástroj dostupný snad v každé běžné linuxové distribuci, pomocí kterého je možné vytvářet šifrované tunely mezi dvěma (a více) počítači. OpenVPN může fungovat jako klient nebo jako server, podporuje řadu možností zabezpečení a má širokou škálu nastavení. Z tohoto důvodu bývá obtížné sestavit návod pro zprovoznění OpenVPN, neboť možností, co lze s OpenVPN provádět, je nepřeberně mnoho. V tomto seriálu budou prezentovány dvě alternativy, počínaje tou úplně nejjednodušší s obyčejným sdíleným klíčem, která je předmětem tohoto dílu, a konče pokročilejším řešením s certifikáty, více uživateli a směrováním veškeré komunikace přes šifrovaný tunel, které bude předmětem příštího dílu.

Pokud budete chtít zprovozňovat OpenVPN na svém virtuálním serveru, předesílám, že je nutné mít k dispozici jaderný modul "tun".

K čemu je to dobré?
VPN může být použito k mnoha účelům, z nichž velmi časté je zabezpečené připojení klientů k intranetu firmy či jiné organizace. Jinou možností je pohodlný zabezpečený přístup ke službám serveru, které jsou zvnějšku nepřístupné (z VPN pak třeba můžete k databázi nebo čemukoliv jinému přistupovat přímo, pokud to ve firewallu povolíte). Obvyklým použitím VPN může být i možnost dostat se zvnějšku do domácí sítě, která je třeba za NATem. Pro úplnost dodávám, že některá použití VPN se kryjí s možnostmi SSH - v rámci SSH je totiž také možné vytvářet šifrované tunely (viz předchozí díly seriálu).

Jednoduché propojení dvou počítačů
Předesílám, že aby bylo propojení dvou počítačů možné, musí na sebe "vidět". To znamená, že alespoň jeden z nich musí mít veřejnou IP adresu nebo musí být oba ve stejné síti. Pokud jsou oba dva za NATem, ale každý v jiné síti, nebude vám tento návod fungovat. Pokud chcete OpenVPN využívat k přístupu do domácí sítě, která je za NATem, jde to samozřejmě také, ale pouze pokud máte k dispozici nějaký stroj s veřejnou (a pokud možno i statickou) IP adresou. Serverem je vždy stroj s veřejnou a statickou IP adresou. Klientem pak může být i stroj za NATem, na tom nezáleží.

Jako úplně první krok si po instalaci OpenVPN na oba počítače nechte vygenerovat statický klíč, který bude sloužit k zabezpečení vaší komunikace. To můžete učinit následujícím příkazem:

openvpn --genkey --secret klic.key
Tento klíč je nutné zabezpečeně přenést na druhý počítač. Zde zdůrazňuji slovíčko "zabezpečeně", tedy rozhodně ne přes Internet v nešifrované podobě. Následně je třeba vytvořit dva konfigurační soubory, jeden pro server, jeden pro klienta. Server by měl mít následující konfigurační soubor:

dev tun
ifconfig 192.168.15.1 192.168.15.2
secret klic.key
Toto je nejjednodušší nastavení, ve kterém jsou zadány pouze nezbytné parametry, přičemž ostatní parametry spojení budou nastaveny dle výchozích hodnot, mj. včetně portu, který má výchozí hodnotu 1194 UDP (tento port musíte povolit na firewallu serveru, alespoň z IP adresy klienta). Parametr ifconfig určuje místní a vzdálenou IP adresu v rámci tunelu (v tomto pořadí). To znamená, že server bude mít v tomto tunelu IP adresu 192.168.15.1 a klient 192.168.15.2. Všimněte si parametru secret, který označuje, kde má OpenVPN hledat soubor se statickým klíčem (ideální je zadat absolutní cestu ke klíči - pokud zadáte relativní cestu, musíte OpenVPN spustit ve správném adresáři, jinak soubor s klíčem nenajde).

Parametr dev označuje typ zařízení pro virtuální síť. Zde máte dvě možnosti: buď zařízení typu tun, nebo zařízení typu tap. Zařízení tun obaluje protokol IP verze 4 nebo 6 (třetí vrstva OSI modelu), zařízení tap pracuje na druhé vrstvě, chová se tedy jako klasický Ethernet.

Konfigurační soubor klienta bude vypadat takto:

remote ip_adresa_serveru
dev tun
ifconfig 192.168.15.2 192.168.15.1
secret klic.key
Oproti konfiguraci serveru jsou zde dvě změny. Jednak přibyl parametr remote, který označuje, s jakým serverem se má OpenVPN klient spojit. Měla by zde být reálná IP adresa serveru. Druhou změnou je obrácení pořadí virtuálních IP adres u parametru ifconfig, neboť u klienta je situace přesně opačná, jeho místní adresa je 192.168.15.2 a IP adresa druhého počítače, tedy serveru, je 192.168.15.1.

Nezapomeňte umístit soubor klic.key do správného adresáře. Poté spusťte OpenVPN na serveru:

openvpn --config konfiguracni_soubor.conf
Pokud se OpenVPN server rozběhne, spusťte OpenVPN stejným způsobem i na klientovi. Za nějakou dobu by obě běžící instance OpenVPN měly ohlásit následující:

Initialization Sequence Completed
V tuto chvíli by měl být tunel vytvořen a vy můžete zkusit z klienta ping na server:

ping -c 1 192.168.15.1
Virtuální síť je tvořena příslušným virtuálním síťovým rozhraním na obou počítačích. V tomto případě to bude nejspíše rozhraní tun0. Jeho vlastnosti můžete vypsat následujícím příkazem:

ip addr show dev tun0
Pokud se cokoliv nedaří, projděte si následující body:

pokud se nedaří spuštění OpenVPN klienta nebo serveru, přečtěte si chybovou hlášku a pokuste se problém napravit (nejčastější budou asi problémy s cestou ke klíči),

ověřte dostupnost spojení z klienta na reálnou IP adresu serveru specifikovanou v konfiguračním souboru klienta u parametru remote - tato adresa musí být dosažitelná,

ověřte dostupnost UDP portu 1194 na serveru - port musí být otevřený (zkontrolujte nastavení firewallu příkazem iptables -L -n -v),

ověřte politiku firewallu k nově vzniklým virtuálním síťovým rozhraním (nejspíše tun0) na obou počítačích - pokud máte nastavenou výchozí politiku řetězce INPUT na DROP, přidejte výjimku pro toto rozhraní.

Komplexnější konfigurace
Pokud vám funguje výše uvedený jednoduchý příklad, můžete se pustit do rozšiřování konfigurace. V první řadě je z bezpečnostních důvodů velmi vhodné nenechávat OpenVPN běžet s právy roota, ale pouze s právy uživatele (např. uživatele nobody). Do obou konfiguračních souborů tedy přidejte následující:

user nobody
group nogroup
OpenVPN je možné spouštět jako démona (tzn. spustí se na pozadí a hlášky bude vypisovat do logů místo na obrazovku). Toto chování zajistí následující parametr:

daemon
Debian považuje libovolný soubor s koncovkou .conf v adresáři /etc/openvpn jako konfigurační soubor, pro který spustí samostatnou instanci OpenVPN při startu systému nebo příslušné operaci se startovacím skriptem /etc/init.d/openvpn. Výše zmíněný parametr daemon není v případě těchto konfiguračních souborů nutností (příslušná instance OpenVPN bude automaticky spuštěna jako démon).

Pokud nechcete OpenVPN provozovat na standardním portu, můžete na serveru explicitně udat port, na kterém chcete, aby naslouchal:

port 39993
Na klientovi je pak třeba upravit parametr remote, kam za IP adresu přidáte číslo portu, tedy např:

remote ip_adresa_serveru 39993
Bývá také dobré zajistit, aby si obě strany patřičně hlídaly propustnost tunelu a v případě potíží tunel shodili a začali se pokoušet jej znovu vytvořit. To zajistí následující parametry:

keepalive 10 60
ping-timer-rem
persist-tun
persist-key
Volba keepalive má dva parametry, které pracují následovně. Tím prvním je doba v sekundách, za kterou se pošle na druhou stranu tunelu "ping", je-li spojení v nečinnosti. Pokud tedy OpenVPN neobdrží žádný paket z druhé strany po tuto dobu (v příkladu výše by to bylo deset sekund), pošle na druhou stranu "ping". Druhým parametrem je "timeout", tzn. doba, za kterou se OpenVPN začne pokoušet spojení restartovat, pokud neobdrží žádnou odezvu z druhé strany (tzn. buď "ping", nebo jakýkoliv jiný paket).

Pokud se OpenVPN pokusí spojení restartovat (stejného výsledku lze dosáhnout ručně zasláním signálu SIGUSR1 běžícímu procesu OpenVPN), nemusí už mít potřebná oprávnění k vytvoření virtuálního síťového rozhraní či k opětovnému přečtení klíče. Z tohoto důvodu lze OpenVPN instruovat, aby zařízení ani klíč nezahazoval, ale nechal je "přežít" restart - to zajišťují volby persist-tun a persist-key.

Poslední volbou zde je ping-timer-rem, který u serveru zařídí, že nebude brát v úvahu parametry volby keepalive v případě, kdy není připojený žádný klient.

Poslední důležitou volbou je volba zajišťující kompresi dat, která sníží objem přenášených dat za cenu vyšší zátěže procesoru (v tomto ohledu je třeba dodat, že samotné šifrování také představuje zátěž pro procesor, zejména v případě širokého přenosového pásma). Zapnutí komprese zajistí následující volba:

comp-lzo
V příštím dílu seriálu vám představím komplexnější řešení s certifikáty, s více klienty a se směrováním veškeré komunikace přes VPN.