Het opzetten van een VPN-server kan best een uitdaging zijn. Zeker als je volledige controle over alle parameters wenst. Gelukkig verschenen de laatste jaren veel initiatieven om het opzetten van een VPN-server te vereenvoudigen. Een goed voorbeeld is WireGuard Easy dat we in deze workshop behandelen. Dit maakt zoals de naam al aangeeft gebruik van het moderne, robuuste en snelle WireGuard. De installatie is echter sterk vereenvoudigd, waardoor jouw VPN-server snel operationeel is.
Wat gaan we doen?
We gaan een VPN-server opzetten in het netwerk. Op afstand kun je met deze VPN-server verbinden. Bijvoorbeeld met een smartphone of laptop vanaf je vakantieadres. Je kunt dan veilig internetten, omdat het verkeer via je thuisnetwerk loopt, of toepassingen op je lokale thuisnetwerk gebruiken.
Je kunt het jezelf bij het opzetten van een VPN-server doorgaans heel makkelijk óf heel moeilijk maken. Er is niet echt een tussenweg. Bij een volledig handmatige configuratie moet je veel zelf doen. Denk bijvoorbeeld aan het maken van privé en publieke sleutels, de configuratie van het netwerk en het toevoegen van gebruikers. In deze workshop kiezen we de makkelijke route, met WireGuard Easy. Het is een goed alternatief voor PiVPN, waarvan de ontwikkeling recent stop werd gezet. Voor de installatie gebruiken we Docker Compose.
Een praktisch voordeel van WireGuard Easy is dat je gebruikers via een dashboard in je browser kunt beheren. Bovendien kun je, door een QR-code te scannen, in een handomdraai de verbinding vanaf bijvoorbeeld je smartphone instellen. Om de server via een gemakkelijk te onthouden hostnaam te kunnen bereiken gaan we een gratis account bij DuckDNS gebruiken. Dat verhelpt ook meteen verbindingsproblemen als je een dynamisch IP-adres hebt.

Wat heb je nodig?
Voor de installatie van WireGuard als VPN-server gebruiken we een Linux-server met Docker Compose. Er worden geen speciale eisen aan gesteld. Je zou een recente Raspberry Pi kunnen gebruiken of een eenvoudige Intel Celeron J4125, N100 of N5105. Veel van deze systemen moeten een 500 megabit-verbinding gemakkelijk kunnen verzadigen. Bij de juiste instellingen zal de doorvoersnelheid met of zonder VPN weinig afwijken.
Voor toegang tot je VPN-server van buitenaf is het nodig om een poort in je netwerk open te zetten. Ook moet je de clients die verbinding gaan maken vooraf instellen. Het is voor WireGuard belangrijk dat je een ‘echt’ publiek ipv4-adres hebt zonder het zogeheten carrier-grade nat ofwel Cgnat. Hoewel Cgnat vooral op mobiele netwerken wordt ingezet passen enkele internetproviders, zoals Delta, het ook op het vaste netwerk toe.
Alle instructies kun je desgewenst ook op een VPS uitvoeren, ofwel een gehuurde server op internet. Je zou dat dan kunnen zien als alternatief voor een betaalde VPN-dienst.

Wat is WireGuard?
Er zijn diverse protocollen voor het opzetten van een VPN-verbinding. OpenVPN is één van de bekendste. Maar het open-source WireGuard won de laatste jaren snel terrein. Kenmerkend zijn de efficiëntere code, snellere verbindingsopbouw en hogere doorvoersnelheid. Ter illustratie: WireGuard kent maar ongeveer 4.000 regels code, tegenover zo’n 600.000 voor OpenVPN met OpenSSL. Het kreeg mede daardoor ook de goedkeuring van Linux-voorman Linus Torvalds, die de codebase in 2018 een ‘work of art’ noemde in vergelijking met de alternatieven.
WireGuard is uitgebracht onder GPLv2, dezelfde licentie als Linux. Sinds 2020 maakt WireGuard bovendien standaard deel uit van de Linux-kernel, met ingang van de 5.6-kernel.
WireGuard bereikt de hoge prestaties onder meer door moderne cryptografie toe te passen. De laatste jaren kiezen mede daardoor ook steeds meer VPN-providers voor het protocol. Je kunt het ook zelf gebruiken voor een VPN-server in je netwerk. Vind je dat toch te lastig? Er zijn ook eenvoudigere tools, die op de achtergrond gebruik maken van WireGuard. Een goed voorbeeld is Tailscale dat het opzetten van verbindingen vereenvoudigt.

Voordelen WireGuard Easy
WireGuard Easy (https://github.com/wg-easy/wg-easy), gemaakt door een Nederlander (Emile Nijssen), is één van de eenvoudigste methodes voor het opzetten van een VPN-server op basis van WireGuard. Je kunt het middels Docker of via een configuratiebestand voor Docker Compose snel installeren. Je krijgt er ook veel nuttige extra’s bij. Zo kun je via een dashboard gebruikers bekijken, toevoegen, bewerken of verwijderen. Dit vereenvoudigt het beheer enorm.
Het dashboard heeft nog een handige feature. Je kunt hier namelijk per gebruiker het configuratiebestand downloaden waarmee een verbinding kan worden opgezet. Bovendien kun je een QR-code weergeven voor een gebruiker. Als je dit scant met een smartphone en de app van WireGuard heb je daarop direct alle verbindingsgegevens. Je dashboard geeft verder ook inzicht in verbonden gebruikers en het verkeer.

Hostnaam voor verbinding
Om van buitenaf verbinding te maken met je VPN-server heb je een IP-adres of hostnaam nodig. Als je thuis een wisselend (‘dynamisch’) IP-adres hebt raden we het gebruik van een Dynamic DNS-provider zoals Duck DNS aan. Dit is een gratis dienst die zorgt dat je altijd via een eenvoudig te onthouden hostnaam (in de vorm subdomein.duckdns.org) verbinding kunt maken met je internetverbinding thuis. Als het IP-adres wisselt wordt dit automatisch bijgewerkt via een toepassing in je netwerk, die we verderop gaan installeren.
DuckDNS werkt overigens ook prima als je een vast IP-adres hebt. Maar je hebt dan ook andere opties. Zo zou je er voor kunnen kiezen om gewoon het IP-adres te gebruiken als serveradres. Heb je een domeinnaam geregistreerd, dan zou je een (sub)domein via de DNS-instellingen bij je provider kunnen laten verwijzen naar je IP-adres thuis, zodat je dat (sub)domein kunt gebruiken.
Registratie bij DuckDNS
Om Duck DNS te gebruiken ga je naar https://www.duckdns.org. Maak een account door in te loggen met één van de genoemde diensten (zoals Google, Github of Twitter) en volg de instructies. Op het laatste scherm zie je een token die je in de volgende stap van deze workshop nodig hebt, voor het bijwerken van je IP-adres. Ook kun je hier tot vijf subdomeinen toevoegen. Vul bij sub domain een eerste subdomeinnaam in en klik op add domain. Als voorbeeld gebruiken we de naam mcvpn waarmee de volledige hostnaam mcvpn.duckdns.org wordt.
Welk IP-adres in eerste instantie wordt gebruikt kun je nu aflezen. Ook kun je het controleren door een opdrachtprompt in Windows te openen en een opdracht als ping subdomein.duckdns.org
te geven. Je ziet bij zo’n ‘ping’ als het goed is het IP-adres van jouw internetverbinding als antwoord.

Installatie WireGuard Easy
We kunnen nu verder met de installatie. We installeren een toepassing om het IP-adres bij DuckDNS up-to-date te houden. Daarna installeren we WireGuard Easy. In beide gevallen gebruiken we Docker Compose. In een aparte workshop lees je desgewenst hoe je Docker en Docker Compose kunt installeren op een server met Debian of Ubuntu.
DuckDNS bijwerken via Docker Compose
Zeker bij een wisselend IP-adres is het belangrijk om je IP-adres bij DuckDNS bij te werken, zodra het IP-adres van je internetverbinding verandert. Hiervoor gaan we een toepassing installeren via Docker Compose. Op de website van DuckDNS vind je ook andere installatiemethodes. Maak daarvoor een mapje voor DuckDNS en maak vervolgens een bestand voor Docker Compose genaamd docker-compose.yml. Neem de onderstaande inhoud als uitgangspunt.
services: duckdns: image: lscr.io/linuxserver/duckdns:latest container_name: duckdns environment: - PUID=0 - PGID=0 - TZ=Europe/Amsterdam - SUBDOMAINS=mcvpn - TOKEN=068fb-fc59-468688-bca5-c65cfee72 - LOG_FILE=false volumes: - ./config:/config restart: unless-stopped
De waardes voor PUID
en PGID
kun je onder Linux achterhalen met de opdracht id
. Dit is vooral belangrijk voor toegang tot het bestandssysteem op de host. Achter TOKEN=
vul je de token in uit je account bij DuckDNS. Achter SUBDOMAINS=
vul je het subdomein bij DuckDNS in.
Start na het maken van de aanpassingen de toepassing met docker compose up -d
. Daarmee start de container op de achtergrond (‘detached’). Wil je controleren of alles goed is, dan kun je de eerste keer eventueel starten met docker compose up
. Je ziet dan alle uitvoer. Stop hierna de container met Ctrl+C en start deze alsnog op de achtergrond met de parameter -d
.

WireGuard Easy via Docker Compose
We gaan nu WireGuard via Docker Compose installeren. Hierbij nemen het Docker Compose-bestand dat je op https://github.com/wg-easy/wg-easy/blob/master/docker-compose.yml kunt vinden als basis. Daarin maken we enkele aanpassingen. Hierna ziet de volledige configuratie er als volgt uit:
version: "3.8" volumes: etc_wireguard: services: wg-easy: environment: - LANG=nl - WG_HOST=mcvpn.duckdns.org image: ghcr.io/wg-easy/wg-easy container_name: wg-easy volumes: - etc_wireguard:/etc/wireguard ports: - "51820:51820/udp" - "51821:51821/tcp" restart: unless-stopped cap_add: - NET_ADMIN - SYS_MODULE sysctls: - net.ipv4.ip_forward=1 - net.ipv4.conf.all.src_valid_mark=1
Ten opzichte van de standaard configuratie veranderen we met LANG=nl
de taal voor het dashboard naar Nederlands. Bij WG_HOST=mcvpn.duckdns.org
hebben we de hostnaam van DuckDNS ingevuld die we in een eerdere stap activeerden. Heb je thuis een vast IP-adres dan kun je dat invullen. Verwijs je een (sub)domein via de DNS-instellingen bij je provider naar je IP-adres thuis, dan vul je dat (sub)domein in.

Extra parameters
Onder environment:
kun je eventueel extra of aangepaste parameters opgeven. Voor een volledig overzicht kun je op de GitHub-pagina van het project kijken. Zo wordt als naam voor de ethernetinterface standaard eth0
gebruikt. Dat is gangbaar op Linux-systemen. Controleer dit eventueel voor jouw situatie met ip a
. Je kunt het veranderen via de parameter WG_DEVICE=eth0
.
Standaard wordt de DNS-server van Cloudflare op het adres 1.1.1.1
gebruikt. Dit kun je wijzigen via WG_DEFAULT_DNS=1.1.1.1
. Gebruik bijvoorbeeld 8.8.8.8
voor Google. Verder is het raadzaam een wachtwoord in te stellen voor het dashboard. Dat kan met bijvoorbeeld PASSWORD=geheim
. Je kunt met WG_ALLOWED_IPS=
verder nog beperken welk verkeer vanaf de client over de vpn-tunnel moet worden gestuurd. Standaard gaat al het verkeer door de tunnel.

Poort doorsturen in modem
Voordat je WireGuard kunt starten is het nog nodig om een poort via je router door te sturen naar de server met WireGuard. De procedure verschilt per router. Eventueel kun je de instructies op https://portforward.com raadplegen. Voor het WireGuard-verkeer wordt standaard UDP-poort 51820 gebruikt. Je hoeft daarom alleen het UDP-verkeer naar poort 51820 door te sturen naar diezelfde poort op de server met WireGuard.
Overigens: de poort ‘aan de buitenkant’ zou je eventueel kunnen veranderen naar een andere poort, als deze bijvoorbeeld door bepaalde netwerken wordt geblokkeerd.
Voor het dashboard gebruikt WireGuard Easy standaard TCP-poort 51821. Voor die poort is geen port forwarding nodig. Het dashboard is dan weliswaar alleen vanaf je lokale netwerk bereikbaar, maar dat is om veiligheidsredenen wel zo verstandig. Als je klaar bent met het maken van alle aanpassingen en doorsturen van de poort start je WireGuard Easy met docker compose up -d
.

Gebruikers toevoegen
Het meeste werk is eigenlijk al gedaan. We hoeven alleen nog gebruikers toe te voegen. Daarvoor open je je dashboard, door je browser te verwijzen naar http://ipadres:51821. Hierbij gebruik je het IP-adres van de server. Als je een wachtwoord hebt ingesteld moet je dat nu eerst invullen.
Op je dashboards kun je nu een eerste gebruiker toevoegen via Nieuwe client. Vul een naam in voor de gebruiker en klik op Creëren. Je ziet een vinkje waarmee je de bewuste gebruiker eventueel kunt (de)activeren. Ook kun je de verbindingsgegevens ophalen.
Er zijn twee manieren om verbinding met je VPN-server op te zetten. Je kunt hier de QR-code weergeven die je kunt scannen met de app op de smartphone. Dit is de makkelijkste optie. Ook kun je het configuratiebestand downloaden dat je kunt gebruiken. Dit is wat gangbaarder voor verbindingen vanaf een pc of laptop.

Verbinding maken vanaf smartphone
Als voorbeeld zetten we een verbinding op vanaf een Android-smartphone. Dit werkt heel eenvoudig. Installeer daarvoor eerst de WireGuard-app. De app is niet alleen voor Android verkrijgbaar maar vind je ook in de App Store voor iPhone en iPad.
Start de WireGuard-app en klik op het plusteken om een verbinding toe te voegen. Kies dan de optie Scan van QR-code. Maak de QR-code zichtbaar in je dashboard voor de gewenste gebruiker en scan deze vervolgens met de camera van je smartphone. Geef de tunnel hierna een naam.
Met een vinkje kun je de verbinding actief maken. Al het verkeer zal dan over de VPN worden gestuurd. Je kunt ook alle toepassingen op je thuisnetwerk gebruiken. Probeer het maar eens door het lokale IP-adres van een bepaald apparaat in te voeren, zoals een NAS. Zorg er hierbij uiteraard voor dat de smartphone alleen met het mobiele netwerk is verbonden en niet met je WiFi-netwerk.