Spring naar hoofdtekst

Eindelijk VPN: WireGuard

Geplaatst op door ,
Laatste aanpassing op .

Inleiding

Vier jaar geleden revalideerde ik als slechtziende elf maanden lang bij Koninklijke Visio in Apeldoorn. Elke week een paar dagen ver van huis met alleen de (mobiele) telefoon als direct contact met het thuisfront. Met mijn laptop als bagage wilde ik ook graag een veilige digitale verbinding, maar ik had geen idee hoe ik één en ander moest aanpakken.

Het principe van een virtual private network (VPN) was me wel duidelijk, maar het lukte me niet om dit met de bestaande technieken in te richten op onze OpenWrt-router. Dit lag waarschijnlijk niet aan de software die ik op dat moment wilde gebruiken, maar aan mijn beperkte begrip van de toch wel complexe materie.

WireGuard

Hier komt het nieuwe VPN protocol WireGuard om de hoek kijken. Het maakt het (in vergelijking met OpenVPN of IPsec) bijna kinderlijk eenvoudig om twee systemen via een tunnel beveiligd met elkaar te laten communiceren.

De basis is heel eenvoudig: over één UDP-poort wordt versleutelde data overgedragen van peer naar peer en andersom. Beide partners zijn gelijkwaardig. In de configuratie worden IP-adressen en DNS-server aangegeven. Tot slot heeft elk systeem een sleutelpaar (publiek en privé), waarmee alle data wordt versleuteld. Het systeem kent zelf zijn eigen privésleutel en de publieke sleutel van de tegenpartij.

Server (OpenWrt)

Hieronder volgende stappen die ik heb doorlopen om op een router met OpenWrt (achter een provider-modem met NAT) het lokale netwerk (LAN) via WireGuard van buitenaf bereikbaar te maken.

opkg update && opkg install luci-­app-wireguard qrencode;
wg genkey | tee privatekey.txt | wg pubkey > publickey.txt;

Eerst worden de pakketlijsten bijgewerkt en de benodigde software geïnstalleerd. Daarna genereert het commando wg genkey een privésleutel. Deze wordt (tijdelijk) opgeslagen en meteen doorgegeven aan wg pubkey dat hiermee de publieke sleutel genereert. Ook deze wordt tijdelijk opgeslagen.

Let op: het nieuwe protocol wordt pas geladen na een herstart van de router.

Interface

Maak via NetworkInterfacesAdd new interface een nieuwe interface aan. Geef een naam op, bijvoorbeeld wg0. Kies bij protocol voor WireGuard VPN. Bevestig met Create interface.

Log via SSH of sFTP in en open het bestand met de privésleutel. Kopieer en plak de sleutel in het veld Private Key. Kies een poortnummer ver boven de 1024 en vul dat in bij Listen Port, bijvoorbeeld 51920. Kies een IP-reeks voor het nieuwe VPN, en geef de router bijvoorbeeld 192.168.42.1/24.

Koppel op het tabblad Firewall Settings de nieuwe interface aan de zone LAN. Later komen we nog terug voor het vullen van het tabblad Peers.

Firewall

Log via SSH in en voeg met de volgende commando's een nieuwe regel aan de vuurmuur toe, die het verkeer van buitenaf op de gekozen UDP-poort toestaat:

uci add firewall rule
uci set firewall.@rule[-1].name="Allow-Wireguard-Inbound"
uci set firewall.@rule[-1].src="wan"
uci set firewall.@rule[-1].target="ACCEPT"
uci set firewall.@rule[-1].proto="udp"
uci set firewall.@rule[-1].dest_port="51920"
uci commit firewall
/etc/init.d/firewall restart

Peers

Om gesprekspartners (peers) toe te voegen, zal voor ieder systeem een eigen instellingen­bestand worden gemaakt, met eigen IP-adres en eigen sleutelpaar. Zo'n configuratie ziet er bijvoorbeeld als volgt uit:

[Interface]
Address = 192.168.42.2/32
DNS = 192.168.1.1
ListenPort = 51920
PrivateKey = <CLIENT-PRIVATE-KEY>

[Peer]
AllowedIPs = 192.168.42.0/24, 192.168.1.0/24
Endpoint = <PUBLIC-IP-ADDRESS-OR-DYNDNS-HOSTNAME>:51920
PublicKey = <SERVER-PUBLIC-KEY>

Het stukje [Interface] beschrijft de client zelf: zijn IP-adres in het VPN, zijn ingestelde DNS-server, de gekozen UDP-poort en zijn privésleutel als base64-gecodeerde tekenreeks. Deze kun je laten genereren door wg genkey.

Het gedeelte [Peer] beschrijft in ons geval de VPN-server met OpenWrt. De toegestane IP-reeksen zijn respectivelijk die van het VPN en het LAN. Endpoint is het IP-adres of de (dynamische) domeinnaam met poortnummer waarop de router van buitenaf bereikbaar is. Tot slot volgt nog de publieke sleutel van de router.

Ga in OpenWrt terug naar het tabblad Peers van de WireGuard-interface. Geef eventueel een beschrijving (Description) van de client. Plak de publieke sleutel van de client in het veld Public Key. Vul bij Allowed IPs het IP-adres van de client in, bijvoorbeeld 192.168.42.2/32. Zet een vinkje bij Route Allowed IPs en vul bij Persistent Keep Alive een waarde van 25 in. Klik op Save en de eerste peer is een feit.

Client (Android)

De officiële app van de WireGuard-ontwikkelaars is in de Play Store te downloaden. Hiermee kun je vanuit het niets een verbinding opzetten, maar ook een bestaande configuratie inlezen uit een bestand. Plaats het bestand wg0.conf bijvoorbeeld via USB in de Download-map van Android. Daarna volgt een klik op de grote Plus-knop. Kies voor Importeren uit bestand. Daarna kan met één vingertik de VPN-verbinding worden in- en uitgeschakeld.

Client (Debian)

Op mijn Debian systeem was het inrichten iets ingewikkelder, omdat het nieuwe WireGuard-protocol nog niet in de stable-variant van het besturingssysteem is toegelaten. Met onderstaande commando's wordt het unstable-repository toegevoegd en de software daaruit geïnstalleerd.

$ echo "deb http://deb.debian.org/debian/ unstable main" | \
  sudo tee /etc/apt/sources.list.d/unstable-wireguard.list;
$ printf 'Package: *\nPin: release a=unstable\nPin-Priority: 150\n' | \
  sudo tee /etc/apt/preferences.d/limit-unstable;
$ sudo apt update && sudo apt install wireguard resolveconf;

Maak het configuratiebestand wg0.conf zoals hierboven beschreven en plaats dat bij voorkeur in de map /etc/wireguard. Daarna kun je met deze commando's de tunnel graven en na gebruik weer dichtgooien:

$ sudo wg-quick up wg0;
$ sudo wg-quick down wg0;

Conclusie

Dankzij de grote inspanningen van de WireGuard-ontwikkelaars en de mensen die daarover schrijven in de media (link 1, link 2, link 3) is het mij eindelijk gelukt om een veilig en gebruiks­vriendelijk VPN in te richten. Het heeft even geduurd, maar het was zeker de moeite waard!

Inhoudsopgave

Atom-feed Atom-feed van FWiePs weblog

Artikelen


Categorieën

Doorzoek de onderstaande categorieën om de lijst met artikelen te filteren.