WireGuard VPN na vlastnom VPS: inštalácia a nastavenie krok za krokom
WireGuard VPN je šifrovaný tunel medzi vaším zariadením a serverom, ktorý beží v jadre Linuxu a nastavuje sa jedným konfiguračným súborom na každej strane. Na vlastnom VPS ho použijete ako súkromnú bránu do internetu: notebook alebo telefón cez ňu pošle všetku prevádzku a sieť, v ktorej sedíte, neuvidí jej obsah. Anonymitu to nedáva: weby uvidia adresu vášho servera, ktorý je prenajatý na váš účet. Postup má päť krokov: inštalácia, kľúče, server so smerovaním, klient a test.
Protokol opísal Jason Donenfeld v odbornej štúdii z konferencie NDSS 2017. Podľa jej abstraktu ide o tunel na tretej vrstve, vytvorený ako virtuálne sieťové rozhranie jadra Linuxu, ktorý sa pre Linux dá napísať v menej než 4 000 riadkoch kódu. Do jadra sa dostal vo verzii 5.6, vydanej 29. marca 2020. Spojenie vzniká výmenou verejných kľúčov, podobne ako pri SSH kľúčoch.
Kedy má vlastná VPN zmysel a kedy nie
Zmysel má pri ochrane prevádzky v cudzej sieti. Dokumentácia Ubuntu Server opisuje práve tento prípad: letisko, kaviareň, konferencia alebo hotel, teda sieť, ktorej nedôverujete. Lokálna sieť potom nevidí obsah prevádzky, lebo je zašifrovaná. Druhým dôvodom je prístup k službám na serveri, ktoré nechcete vystavovať do internetu.
Nehodí sa, ak chcete anonymitu. Dôvera sa len presúva z prevádzkovateľa Wi-Fi na poskytovateľa servera a cieľové weby vidia adresu servera, ktorý patrí vám. Projekt WireGuard sám uvádza dve obmedzenia: nezameriava sa na obfuskáciu, teda na skrytie prevádzky pred hĺbkovou inšpekciou paketov, a nepodporuje tunelovanie cez TCP. Kde je UDP zablokované, tunel preto nenabehne.
Inštalácia a kľúče
Na serveri aj na klientovi s Debianom alebo Ubuntu nainštalujte balík wireguard. Podľa stránky projektu majú používatelia Debianu staršieho než Bullseye zapnúť backports. Pre Windows, macOS, Android a iOS existuje oficiálna aplikácia.
sudo apt install wireguard
Kľúče vygenerujte na každom zariadení zvlášť. Súkromný kľúč nikdy neopúšťa svoje zariadenie, druhej strane dáte len verejný.
umask 077
wg genkey > server.key
wg pubkey < server.key > server.pub
sudo mv server.key server.pub /etc/wireguard/
Príkaz umask 077 zaistí, že nový súbor prečíta len jeho vlastník. Na klientovi urobte to isté s názvom client.
Server: konfigurácia, smerovanie a firewall
Najprv zistite názov sieťového rozhrania, ktorým server komunikuje s internetom:
ip route show default
V riadku default via ... dev eth0 je to slovo za dev. Potom vytvorte súbor /etc/wireguard/wg0.conf:
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <obsah server.key>
PostUp = iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
[Peer]
# notebook
PublicKey = <obsah client.pub>
AllowedIPs = 10.8.0.2/32
Podsieť 10.8.0.0/24 je len príklad, zvoľte takú, ktorá sa nekryje so sieťou klienta. Port 51820 je v dokumentácii obvyklý, môže byť iný. Ak sa eth0 líši od predošlého kroku, opravte ho v oboch pravidlách. Na serveri musí byť nainštalovaný balík iptables. Pravidlo MASQUERADE prepisuje adresy klientov na adresu servera a wg-quick ho pridá po vytvorení rozhrania a odstráni pri jeho zrušení. Konfigurácia obsahuje súkromný kľúč, preto ju zamknite príkazom sudo chmod 600 /etc/wireguard/wg0.conf.
Aby server posielal pakety klienta ďalej, musí fungovať ako smerovač. Zapnite forwarding trvalo cez súbor v /etc/sysctl.d:
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/70-wireguard-routing.conf
sudo sysctl --system
Hodnotu overíte príkazom cat /proc/sys/net/ipv4/ip_forward, má vypísať 1. Ak používate ufw podľa článku Prvých tridsať minút na novom VPS, otvorte UDP port tunela a povoľte presmerovanú prevádzku. Druhé pravidlo je potrebné preto, že ufw má po inštalácii predvolenú politiku pre presmerovanú prevádzku nastavenú na zamietnutie:
sudo ufw allow 51820/udp
sudo ufw route allow in on wg0 out on eth0
Ak po zapnutí ufw vypíše ip_forward opäť 0, zapnite forwarding aj v /etc/ufw/sysctl.conf, ako uvádza manuál ufw. Tunel spustíte a zapnete pri štarte jedným príkazom:
sudo systemctl enable --now wg-quick@wg0
Názov služby kopíruje názov rozhrania. Nové zariadenia načítate bez prerušenia spojení príkazom sudo systemctl reload wg-quick@wg0, po zmene Address alebo PostUp treba restart.
Klient a test
Na klientovi vytvorte /etc/wireguard/wg0.conf:
[Interface]
Address = 10.8.0.2/24
PrivateKey = <obsah client.key>
[Peer]
PublicKey = <obsah server.pub>
Endpoint = <verejná IP servera>:51820
AllowedIPs = 0.0.0.0/0
AllowedIPs je jadro konfigurácie: pri odosielaní funguje ako smerovacia tabuľka a pri prijímaní ako zoznam povolených zdrojových adries. Hodnota 0.0.0.0/0 pošle cez tunel všetku IPv4 prevádzku a wg-quick sám prepíše predvolenú trasu. IPv6 pokrýva ::/0, bez neho pôjde IPv6 prevádzka klienta mimo tunela. Ak chcete len prístup k službám na serveri, stačí v AllowedIPs podsieť 10.8.0.0/24. Tunel zapnete príkazom sudo wg-quick up wg0 a vypnete príkazom sudo wg-quick down wg0. Overenie:
- Na serveri spustite
sudo wg show. Pri peerovi musí byť riadoklatest handshake, bez neho sa klient k serveru nedostal. - Na klientovi tunel overíte príkazom
ping -c 3 10.8.0.1. - Príkaz
curl https://ifconfig.memusí vypísať verejnú adresu servera, nie vašu.
Typické chyby
| Príznak | Príčina a oprava |
|---|---|
Chýba latest handshake | Zamenené kľúče, zlý Endpoint alebo blokovaný UDP port. V [Peer] musí byť verejný kľúč druhej strany. |
| Handshake je, stránky sa nenačítajú | Zabudnutý forwarding, pravidlo MASQUERADE alebo pri ufw pravidlo route allow. |
Required key not available | Cieľová adresa nie je v AllowedIPs žiadneho peera, doplňte ju. |
| Ping ide, veľké stránky a scp visia | MTU je vyššie, než unesie cesta. |
| Weby idú, DNS ide mimo tunela | Klient používa DNS lokálnej siete. Riadok DNS = v [Interface] vyžaduje resolvconf, na Ubuntu so systemd-resolved ho nahradí resolvectl v PostUp. |
K MTU: wg-quick ho určí automaticky z cesty k endpointu alebo z predvolenej trasy a na linke s MTU 1500 vychádza 1420, teda o 80 menej. Ak je cesta užšia, napríklad pri PPPoE, pridajte na oboch stranách do [Interface] riadok MTU = s hodnotou o 80 nižšou, než je MTU cesty. Tú zistíte z klienta pri vypnutom tuneli príkazom ping -M do -s 1472 <IP servera>: veľkosť znižujte, kým odpovede neprídu, a k najväčšej úspešnej pripočítajte 28 bajtov hlavičiek.
Ďalší klient a bezpečnosť
Ďalšie zariadenie dostane vlastný pár kľúčov, vlastnú adresu, napríklad 10.8.0.3/32, a nový blok [Peer] na serveri. Voliteľný PresharedKey z príkazu wg genpsk, rovnaký v oboch blokoch [Peer], pridáva podľa manuálu wg(8) vrstvu symetrického šifrovania pre odolnosť voči kvantovým počítačom. Na fórach nikdy nevkladajte konfiguráciu so súkromným kľúčom. Dokumentácia Ubuntu radí kľúč uložiť do samostatného súboru a načítať ho riadkom PostUp = wg set %i private-key /etc/wireguard/%i.key, v konfigurácii potom PrivateKey chýba.
Časté otázky
Je WireGuard VPN na vlastnom serveri anonymný?
Nie. Prevádzku zašifruje medzi vami a serverom, takže lokálna sieť nevidí obsah, ale cieľové weby vidia adresu servera, ktorý je prenajatý na váš účet. Dôvera sa presúva z prevádzkovateľa siete na poskytovateľa VPS.
Čo znamená AllowedIPs a 0.0.0.0/0?
Pri odosielaní funguje AllowedIPs ako smerovacia tabuľka, pri prijímaní ako zoznam povolených zdrojových adries. Hodnota 0.0.0.0/0 pošle cez tunel všetku IPv4 prevádzku, IPv6 pokrýva ::/0.
Prečo sa po pripojení nenačítajú stránky?
Najčastejšie chýba forwarding (net.ipv4.ip_forward musí byť 1), pravidlo MASQUERADE alebo pri ufw pravidlo route allow. Ďalšou príčinou je vysoké MTU: ping prejde, ale veľké prenosy visia.
Aké MTU nastaviť pre WireGuard?
wg-quick ho určí automaticky z cesty k endpointu alebo z predvolenej trasy. Pri linke s MTU 1500 vychádza 1420, teda o 80 menej. Ak je cesta užšia, nastavte MTU v sekcii Interface ručne.
Aký port a protokol WireGuard používa?
Používa UDP, v príkladoch dokumentácie je port 51820 a zmeníte ho cez ListenPort. Tunelovanie cez TCP WireGuard nepodporuje, takže v sieti blokujúcej UDP nenabehne.
- Ubuntu Server dokumentácia, WireGuard VPN ako predvolená brána (forwarding a NAT)
- Ubuntu Server dokumentácia, riešenie problémov s WireGuardom
- wg-quick(8), manuálová stránka (Debian bookworm)
- wg(8), manuálová stránka (Debian bookworm)
- ufw(8), manuálová stránka Debianu (pravidlá route, forwarding)
- KernelNewbies, Linux 5.6 (WireGuard v jadre)