Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
| it:server:openvpn [2024/06/01 22:10] – Petr Nosek | it:server:openvpn [2025/06/18 12:20] (aktuální) – Petr Nosek | ||
|---|---|---|---|
| Řádek 57: | Řádek 57: | ||
| + | Dále mi ve složce **/ | ||
| + | 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 " | ||
| + | </ | ||
| + | |||
| + | 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, | ||
| + | |||
| + | ===== 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 " | ||
| + | </ | ||
| + | |||
| + | 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: | ||
| + | |||
| + | <code bash> | ||
| + | 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, | ||
| + | |||
| + | 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. | ||
| + | |||
| + | |||
| + | |||
| + | ===== Automatické připojení k OpenVPN serveru ===== | ||
| + | |||
| + | Cílem je zajistit, aby se OpenVPN klient automaticky připojoval po startu systému a zároveň přesměrovával příchozí síťovou komunikaci na konkrétní zařízení ve vnitřní síti. | ||
| + | |||
| + | Klíčové je vložit konfigurační soubor do složky `**/ | ||
| + | OpenVPN sice podporuje i příponu `.ovpn`, ale pouze `.conf` je systemd schopen automaticky spouštět. | ||
| + | |||
| + | Pro ruční spuštění postačí: | ||
| + | |||
| + | <code bash> | ||
| + | openvpn --config myclient.ovpn | ||
| + | </ | ||
| + | |||
| + | Pro automatické spouštění použij: | ||
| + | |||
| + | <code bash> | ||
| + | systemctl start openvpn-client@myclient.service | ||
| + | </ | ||
| + | |||
| + | Tento příkaz hledá konfigurační soubor `**/ | ||
| + | |||
| + | **Doporučení: | ||
| + | Chceš-li využívat výhody systemd (např. automatické restartování), | ||
| + | |||
| + | Pro stabilní spojení doporučujeme přidat do konfigurace řádek: | ||
| + | |||
| + | < | ||
| + | keepalive 10 60 | ||
| + | </ | ||
| + | |||
| + | To znamená, že klient každých 10 vteřin pošle " | ||
| + | Tento zápis je zjednodušený alias pro `--ping 10` a `--ping-restart 60`. | ||
| + | |||
| + | **Shrnutí postupu:** | ||
| + | |||
| + | * Přejmenuj soubor na `myclient.conf` | ||
| + | * Přidej (nebo ponech) `keepalive 10 60` | ||
| + | * Zkontroluj umístění: | ||
| + | * Aktivuj a spusť službu: | ||
| + | |||
| + | <code bash> | ||
| + | systemctl enable openvpn-client@myclient | ||
| + | systemctl start openvpn-client@myclient | ||
| + | </ | ||
| + | |||
| + | **Ověření funkčnosti: | ||
| + | |||
| + | * Stav služby: | ||
| + | <code bash> | ||
| + | systemctl status openvpn-client@myclient | ||
| + | </ | ||
| + | |||
| + | * Aktivní tunel poznáš podle rozhraní `tun0`: | ||
| + | <code bash> | ||
| + | ip a | grep tun0 | ||
| + | </ | ||
| + | |||
| + | * Pro zobrazení logů: | ||
| + | <code bash> | ||
| + | journalctl -u openvpn-client@myclient | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Forwarding na zařízení uvnitř sítě ===== | ||
| + | |||
| + | Aby bylo možné přeposílat komunikaci z VPN na zařízení v lokální síti, je potřeba povolit IP forwarding. | ||
| + | |||
| + | V souboru `/ | ||
| + | |||
| + | < | ||
| + | net.ipv4.ip_forward=1 | ||
| + | </ | ||
| + | |||
| + | Změnu načti pomocí: | ||
| + | |||
| + | <code bash> | ||
| + | sysctl -p | ||
| + | </ | ||
| + | |||
| + | Přesměrování provozu pak zajistí vlastní skripty. | ||
| + | Níže je příklad jednoduchého nastavení pro zařízení s IP `192.168.0.120`. | ||
| + | |||
| + | **/ | ||
| + | |||
| + | <code bash> | ||
| + | # | ||
| + | set -euo pipefail | ||
| + | |||
| + | # Tento skript nakonfiguruje DNAT z OpenVPN (tun0) na interní stroj 10.112.234.112 | ||
| + | # Přesměrování všech portů kromě SSH (port 22) s vyčištěním starých pravidel | ||
| + | |||
| + | # Kontrola, zda běží pod rootem | ||
| + | if [[ " | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # Proměnné – upravte podle potřeby | ||
| + | VPN_IF=" | ||
| + | INT_IF=" | ||
| + | DEST_IP=" | ||
| + | EXCLUDE_PORT=" | ||
| + | |||
| + | # 0) Načtení FTP helper modulů | ||
| + | #modprobe nf_conntrack_ftp | ||
| + | #modprobe nf_nat_ftp | ||
| + | |||
| + | # 0b) Připojení FTP helperu pro control channel (port 21) | ||
| + | iptables-legacy -t raw -A PREROUTING \ | ||
| + | -i " | ||
| + | -p tcp --dport 21 \ | ||
| + | -j CT --helper ftp | ||
| + | |||
| + | |||
| + | # 1) Vyčištění stávajících pravidel NAT a FORWARD | ||
| + | iptables-legacy -t nat -F PREROUTING | ||
| + | iptables-legacy -t nat -F POSTROUTING | ||
| + | iptables-legacy -F FORWARD | ||
| + | |||
| + | # 2) Povolit IP forwarding | ||
| + | sysctl -w net.ipv4.ip_forward=1 | ||
| + | if ! grep -q ' | ||
| + | echo ' | ||
| + | fi | ||
| + | |||
| + | # 3) DNAT: přesměrování všech TCP portů kromě SSH na interní stroj | ||
| + | iptables-legacy -t nat -A PREROUTING \ | ||
| + | -i " | ||
| + | -p tcp -m tcp ! --dport " | ||
| + | -j DNAT --to-destination ${DEST_IP} | ||
| + | |||
| + | # 4) DNAT: přesměrování všech UDP portů kromě SSH na interní stroj | ||
| + | iptables-legacy -t nat -A PREROUTING \ | ||
| + | -i " | ||
| + | -p udp -m udp ! --dport " | ||
| + | -j DNAT --to-destination ${DEST_IP} | ||
| + | |||
| + | # 5) Povolit forward chain pro směry tun0 → eth0 (nové i navázané relace) | ||
| + | iptables-legacy -A FORWARD \ | ||
| + | -i " | ||
| + | -j ACCEPT | ||
| + | iptables-legacy -A FORWARD \ | ||
| + | -i " | ||
| + | -m state --state ESTABLISHED, | ||
| + | -j ACCEPT | ||
| + | |||
| + | # 6) SNAT/ | ||
| + | iptables-legacy -t nat -A POSTROUTING \ | ||
| + | -o " | ||
| + | -d " | ||
| + | -j MASQUERADE | ||
| + | |||
| + | # Hotovo | ||
| + | echo " | ||
| + | |||
| + | </ | ||
| + | |||
| + | **/ | ||
| + | |||
| + | <code bash> | ||
| + | # | ||
| + | set -euo pipefail | ||
| + | |||
| + | # Tento skript odstraní pravidla DNAT a SNAT z předchozího setupu | ||
| + | |||
| + | # Kontrola, zda běží pod rootem | ||
| + | if [[ " | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # Proměnné – musí odpovídat setup skriptu | ||
| + | VPN_IF=" | ||
| + | INT_IF=" | ||
| + | DEST_IP=" | ||
| + | EXCLUDE_PORT=" | ||
| + | |||
| + | # Odstranění raw/FTP helper pravidla | ||
| + | iptables-legacy -t raw -D PREROUTING -i " | ||
| + | |||
| + | # Vyčištění pravidel NAT a FORWARD vztahujících se k tun0 a DEST_IP | ||
| + | iptables-legacy -t nat -D PREROUTING -i " | ||
| + | iptables-legacy -t nat -D PREROUTING -i " | ||
| + | iptables-legacy -t nat -D POSTROUTING -o " | ||
| + | iptables-legacy -D FORWARD -i " | ||
| + | iptables-legacy -D FORWARD -i " | ||
| + | |||
| + | # Volitelné: vrátit ip_forward do výchozí hodnoty (pokud potřebujete) | ||
| + | # sysctl -w net.ipv4.ip_forward=0 | ||
| + | |||
| + | echo " | ||
| + | |||
| + | </ | ||
| + | |||
| + | **Poznámka: | ||
| + | Pokud síťové rozhraní není `eth0`, uprav `**$INTERNAL_IF**` podle výstupu příkazu `ip a`. | ||
| + | |||
| + | Skripty je potřeba zpřístupnit pro spuštění: | ||
| + | |||
| + | <code bash> | ||
| + | chmod +x / | ||
| + | </ | ||
| + | |||
| + | A nakonec je přidej do konfiguračního souboru `myclient.conf`: | ||
| + | |||
| + | < | ||
| + | script-security 2 | ||
| + | up / | ||
| + | down / | ||
| + | </ | ||
| + | |||
| + | **Ověření po navázání tunelu:** | ||
| + | |||
| + | <code bash> | ||
| + | iptables-legacy -t nat -L -n -v | ||
| + | iptables-legacy -L -n -v | ||
| + | </ | ||