OpenVPN
Pro servisní účely jsem potřeboval rychle rozběhnout OpenVPN. Nejprve jsem se docela trápil s nastavením konfiguračních souborů a certifikátů. Nicméně pak jsem objevil skript, který většinu věcí udělá za mě.
Projekt se skriptem se jmenuje openvpn-install.
Stažení je jednoduché:
curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh chmod +x openvpn-install.sh
A pak už jenom spustit:
./openvpn-install.sh
Zbytkem provede jednoduchý průvodce. Pokud chci vytvářet další uživatele a jejich certifikáty po instalaci, stačí skript spustit znovu a v nabídce se objeví možnost Add a client. Úplně stejně budu postupovat, pokud budu chtít vypnout nějakého klienta.
Skript mi vytvořil soubor /etc/iptables/add-openvpn-rules.sh, ve kterém bylo nachystáno routování do vnitřní sítě. Nemusel jsem se tedy trápit s tím, že když se připojím do VPN sítě, tak se nedostanu do vnitřní sítě.
Tady je obsah souboru:
#!/bin/sh iptables -t nat -I POSTROUTING 1 -s 10.8.0.0/24 -o wan -j MASQUERADE iptables -I INPUT 1 -i tun0 -j ACCEPT iptables -I FORWARD 1 -i wan -o tun0 -j ACCEPT iptables -I FORWARD 1 -i tun0 -o wan -j ACCEPT iptables -I INPUT 1 -i wan -p udp --dport 1194 -j ACCEPT
Dále pak vytvoří soubor /etc/systemd/system/multi-user.target.wants/iptables-openvpn.service, který nastavuje v systemd spouštění skriptu s iptables:
[Unit] Description=iptables rules for OpenVPN Before=network-online.target Wants=network-online.target [Service] Type=oneshot ExecStart=/etc/iptables/add-openvpn-rules.sh ExecStop=/etc/iptables/rm-openvpn-rules.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target
A jako další vytvoří soubor pro spouštění vpnserveru /etc/systemd/system/multi-user.target.wants/openvpn@server.service.
Dále mi ve složce /etc/openvpn vytvořil konfigurační soubor server.conf.
Pokud chci zařídit, aby po připojení k VPN nešel internet přes VPN server, tak je potřeba v konfiguračním souboru serveru zakomentovat tento řádek:
#push "redirect-gateway def1 bypass-dhcp"
Dále je možné mít klidně více instancí OpenVPN serveru. Stačí zkopírovat konfigurační soubor server.conf a vytvořit například server2.conf. V souboru editovat vše potřebné a poté spustit další instanci serveru:
openvpn --config server2.conf
Pokud mám VPN server nastavená tak, že nebude směřovat tok internetu přes server, je potřeba ještě u VPN klienta u připojení zaškrtnout tuto volbu:
Když jsem ji neměl zaškrtnutou, tak mi po připojení k VPN nešel internet.
Nastavení DNS serveru pro OpenVPN
Při konfiguraci OpenVPN serveru je možné nastavit, jaký DNS server bude klient používat po připojení. To se provádí přidáním následujícího řádku do konfigurace OpenVPN serveru:
push "dhcp-option DNS 192.168.1.50"
Tento příkaz zajistí, že klient po připojení použije DNS server s IP adresou 192.168.1.50. Lze přidat i více DNS serverů, přičemž první uvedený bude primární.
Po připojení přes OpenVPN jsem ověřil nastavení DNS serveru pomocí příkazu:
resolvectl status
Výstup tohoto příkazu zobrazil aktuálně používané DNS servery, což umožňuje ověřit, zda se změna správně projevila.
Problémy s SSH
Měl jsem problém, že ze serveru se mi nedařilo navázat spojení přes SSH u klientského počítače, který byl připojený přes VPN. Přitom ping na počítač fungoval a nmap mi potvrdil, že port s SSH je otevřený. Po delším zkoušení mě to dovedlo k tomu, že patrně dochází k fragmentaci packetů.
OpenVPN ve výchozím nastavení nebrání fragmentaci velkých TCP segmentů uvnitř tun-virt-rozhraní. Vaše MTU (1500 B na tun0) minus kryptografický overhead protokolu UDP/OpenVPN a minus IP/UDP hlavičky vychází někde kolem 1 400 B. Server ale posílá kusy až 1 388 B – to sice vypadá v pořádku, ale když se součet uvnitř šifrovaného UDP tunelu překlene do fragmentů (nebo někde v síti fragmenty zahazují), klient je už nikdy neslepí a TCP je neposkytne uživatelské aplikaci.
Vyřešil jsem to tak, že na konfiguračního souboru serveru jsem přidal:
mssfix 1200 tun-mtu 1400
- mssfix 1200 přinutí OpenVPN, aby upravilo MSS v TCP handshake na 1200 B, takže SSHKEX paket nikdy nepřesáhne bezpečnou velikost.
- tun-mtu 1400 pak nastavení tun-rozhraní na 1 400 B, aby zbyl dostatek místa i na OpenVPN hlavičky.
Bylo mi doporučeno to přidat i do konfiguračního souboru klienta, ale tam jsem to nepřidával a zatím to vypadá, že SSH už funguje.