Wireguard: Náhrada IPSecu a OpenVPN v jednom
#wireguard #vpn
Na Wireguard už mě před nějakým časem navedl Michael Kaplan a chci mu za to veřejně poděkovat. I přes počáteční problémy (asi jako se vším) jsem Wireguard rozjel a je naprosto super.
Co je Wireguard
Wireguard je extrémně jednoduchá a rychlá VPN. Vlastně náhrada IPSecu a OpanVPN v jednom. Běží všude, v kernelu je jako network modul a má klienta pro Mac, iOS, Android, Windows ...
Používá moderní kryptografii (jako SSH) a nepoužívá žádné x509 certifikáty, prostě jen veřejný a privátní klíč. Konfigurace sítí, jak na straně serveru, tak na straně klienta je velmi jednoduchá. Můžete velmi jednoduše nakonfigurovat jaké rozsahy mají být přístupné z VPN na straně serveru a jaký traffic má jít přes VPN na straně klienta. A to vše v jednom souboru /etc/wireguard/wg0.conf
. Spouští se pomocí jednoho příkazu wg-quick up wg0
. Velmi jednoduché.
Podporuje také roaming, můžete měnit IP adresu a stále komunikovat se zbytkem sítě. Hezky to napsal Petr Krčmář v článku na Rootu: https://www.root.cz/clanky/wireguard-moderni-a-snadno-pouzitelna-vpn-v-linuxovem-jadre/
Super talk přímo od autora Wireguardu na Youtube: https://www.youtube.com/watch?v=eYztYCbV_8U
Setup Wireguardu
Pojďme si ukázat jak Wireguard nakonfigurovat. Máme VPN server na IP adrese vpn.sikademo.com
, firemní síť 192.168.100.0/24
kde máme server s klientem k VPN na adrese 192.168.100.101
. Dále máme notebook a telefon, které chceme také do VPN připojit.
Budu používat VPN server na Debian 10, kde je wireguard v repozitářích. Na firemní síti také poběží Debian 10, na notebooku mám Mac a telefon IPhone.
Instalace
Na serverech nainstaluju balíčky wireguard
a resolvconf
.
apt update && apt install -y wireguard resolvconf
Na Macu nainstaluju Wireguard z Mac App Store, stejně tak na iPhone z App Store.
Pokud chci i wireguard tools, musím je nainstalovat pomocí brew
brew install wireguard-tools
Setup Serveru
Na serveru (vpn.sikademo.com
) si vytvořím konfigurační soubor /etc/wireguard/wg0.conf
s tímto obsahem:
[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = Vpn/Priv=
PostUp = iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --clamp-mss-to-pmtu
PostUp = ip6tables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --clamp-mss-to-pmtu
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostUp = ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = ip6tables -A FORWARD -i %i -j ACCEPT
PostUp = sysctl -q -w net.ipv4.ip_forward=1
PostUp = sysctl -q -w net.ipv6.conf.all.forwarding=1
PostDown = sysctl -q -w net.ipv4.ip_forward=0
PostDown = sysctl -q -w net.ipv6.conf.all.forwarding=0
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = ip6tables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PostDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -t mangle -D POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --clamp-mss-to-pmtu
PostDown = ip6tables -t mangle -D POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --clamp-mss-to-pmtu
[Peer]
PublicKey = Office/Pub=
PresharedKey = Office/Preshared=
AllowedIPs = 10.10.0.101/32, 192.168.100.0/24
[Peer]
PublicKey = Mac/Pub=
PresharedKey = Mac/Preshared=
AllowedIPs = 10.10.0.201/32
[Peer]
PublicKey = Phone/Pub=
PresharedKey = Phone/Preshared=
AllowedIPs = 10.10.0.202/32
Interface popisuje jak vypadá interface wg0, co je standardní interface. Adresa 10.10.0.1/24
je adresa na VPN síti a port 51820
je standardní UDP port kde Wireguard poslouchá. Dále je tam privátní klíč (v mé ukázce nevalidní placeholder Server/Private=
), který vygenerujete příkazem wg genkey
. V skeci post up / post down je nastavení forwardu a masquarade.
Pak jsou na definice jednotlivých klientů, peeru. Budeme mít 3 klienty: server v kanceláři, počítač a telefon. Klienti jsou definováni pouze jejich veřejným klíčem, žádné certifikáty nejsou potřeba.
První klient (office) mám v allowed IPs také rozsah sítě v kanceláři abychom se na ni z VPN dostali.
Konfigrurce klientů jsou jednodušší, takhle vypadá konfigurační soubor na klientovi v kanceláři:
[Interface]
PrivateKey = Priv/Office=
Address = 10.10.0.100/32
DNS = 1.1.1.1
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -A FORWARD -o wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = sysctl -w net.ipv4.ip_forward=0
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -D FORWARD -o wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = Vpn/Pub=
PresharedKey = Office/Preshared=
AllowedIPs = 10.10.0.0/24
Endpoint = vpn.sikademo.com:51820
PersistentKeepalive = 25
Klinet má zase privátní klíč (který má server v peeru) a v peeru má veřejný klíč VPN serveru. Dále má adresu 10.10.0.100/32
na VPN a DNS nastavené na Cloudflare (něco jako 8.8.8.8
od Google).
V Peeru má potom pouze VPN server kam se připojuje.
Co se týká konfigurace na Macu a iPhone, je to ještě jednodušší.
[Interface]
PrivateKey = Mac/Priv=
Address = 10.10.0.201/24
DNS = 1.1.1.1
[Peer]
PublicKey = Vpn/Pub=
PresharedKey = Mac/Preshared=
AllowedIPs = 10.10.0.0/24, 192.168.100.0/24
Endpoint = vpn.sikademo.com:51820
PersistentKeepalive = 25
Na Macu ani na iPhone už není potřeba PostUp/PostDown, takže konfigurace je ještě přímočařejší. Když se podíváme do AllowedIPs, je tam kromě sítě VPN také adresa sitě v kanceláři, což nám říká, že packety směřující do kanceláře mají jít skrz VPN.
Pokud chceme aby všechen traffic byl skrz VPN, nastavíme AllowedIPs = 0.0.0.0/0, ::/0
.
Konfigrurce na telefonu vypadá velice podobně
[Interface]
PrivateKey = Phone/Priv=
Address = 10.10.0.202/24
DNS = 1.1.1.1
[Peer]
PublicKey = Vpn/Pub=
PresharedKey = Phone/Preshared=
AllowedIPs = 10.10.0.0/24, 192.168.100.0/24
Endpoint = vpn.sikademo.com:51820
PersistentKeepalive = 25
Start
Když chceme na Linuxu Wireguard zapnout, stačí nám k tomu wg-quick up wg0
. wg0
, co je název interface a zároveň jméno souboru v /etc/wireguard/
. Pokud jej chceme vypnout, použijeme wg-quick down wg0
. V případě potřeby spouštění při startu systému je ideální použít systemctl enable wg-quick@wg0
, tímto zapneme službu. Tímto příkazem systemctl start wg-quick@wg0
službu spustíme, a tímto příkazem zase zjistíme status služby systemctl status wg-quick@wg0
Pokud soubor změníme, musíme vždy Wiregurd vypnout a pak zapnout.
Na Macu a v telefonu to znamená jen připojit se do profilu VPN.
A je to. Wireguard je hodně robustní, takže i když se spojení rozváže, dokáže si ho velmi rychle navázat zpět bez nutnosti interakce.
Shrnutí
S Wireguardem mám velmi pozitivní zkušenost, už jej používám na všech svých projektech produkčně a žádná chyba. Rozhodně je to něco co stojí za vyzkoušení a myslím si, že si jej zamilujete (i ti, kdo nesnáší VPN a sítě jako já).
Zdroje
- https://www.wireguard.com/
- https://www.linode.com/docs/networking/vpn/set-up-wireguard-vpn-on-ubuntu
- https://staaldraad.github.io/2017/04/17/nat-to-nat-with-wireguard/
- https://www.ericlight.com/wireguard-part-two-vpn-routing.html
- https://www.youtube.com/watch?v=eYztYCbV_8U
- https://github.com/burghardt/easy-wg-quick
Ondřej Šika
Jsem freelance DevOps konzultant a lektor. Zlepšuji práci vývojářských týmu zaváděním efektivních procesů ve vývoji. Naučím Vás používat prověřené nástroje a technologie, které povedou k rychlejšímu vývoji a bezpečnějšímu provozu vašeho software.