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

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.

Ondrej Sika

ondrej@sika.io 📋
skoleni@sika.io 📋
+420 773 452 376 📋

Company ID
88114163 📋

VAT ID
CZ9302252102 📋

Zajímají Vás novinky?

Odebírejte můj newsletter a budete v obraze!

Website by Zuzana Jeschke