Zoeken op website

Hoe WireGuard VPN + Web UI op Ubuntu te installeren


Openbaarmaking: Dit artikel bevat partnerlinks. Ik kan een commissie verdienen wanneer je via deze links een aankoop doet, zonder extra kosten voor jou.

Wanneer je verbinding maakt met het WiFi-netwerk van een koffieshop of toegang krijgt tot internet via een openbaar netwerk, reist je data via infrastructuur die je niet beheert. Iedereen die zich tussen jou en de websites die je bezoekt bevindt, kan mogelijk je verkeer onderscheppen. Zelfs op je thuisnetwerk kan je internetprovider alle websites die je bezoekt zien.

Een VPN lost dit op door een versleutelde tunnel te creëren tussen je apparaat en een server die je vertrouwt. In plaats van dat je verkeer rechtstreeks naar het internet gaat, reist het eerst door deze beveiligde tunnel naar je VPN-server, die het vervolgens doorstuurt naar de bestemming. Iedereen die het netwerk in de gaten houdt, ziet alleen versleutelde gegevens die naar je VPN-server gaan, verder niets.

WireGuard is een modern VPN-protocol dat dit werk opmerkelijk goed doet. In tegenstelling tot oudere VPN-technologieën die tienduizenden regels code vereisen, bereikt WireGuard dezelfde taak met slechts ongeveer 4.000 regels, wat betekent minder bugs, betere prestaties en eenvoudigere beveiligingscontroles.

Maar hier is het punt: hoewel WireGuard zelf eenvoudig is, kan het beheren van meerdere VPN-clients, het genereren van configuratiebestanden en het bijhouden van wie toegang heeft alleen via de commandoregel al snel vermoeiend worden. Daarom is het handig om een webinterface te hebben.

In deze gids zetten we een complete WireGuard VPN-server op met een gebruiksvriendelijke webinterface waarmee je alles via je browser kunt beheren, zoals het toevoegen van nieuwe apparaten, het genereren van QR-codes voor mobiele clients en het monitoren van verbindingen zonder één configuratiebestand handmatig aan te raken.

Wat je nodig zult hebben

Voordat we beginnen, zorg ervoor dat je het volgende hebt:

  • Een Linux-server met een openbaar IP-adres (een VPS van aanbieders zoals DigitalOcean, Linode of AWS werkt prima).
  • Root-toegang of sudo-privileges op deze server.
  • Een basisbegrip van SSH (je moet weten hoe je verbinding maakt met je server).

Deze handleiding gaat ervan uit dat je Ubuntu 22.04 of Ubuntu 24.04 gebruikt, maar de stappen werken op vergelijkbare manier op Debian en andere distributies met kleine aanpassingen.

Het begrijpen van de architectuur

Laten we even de tijd nemen om te begrijpen wat we aan het bouwen zijn voordat we commando's gaan typen.

Een WireGuard-configuratie bestaat uit peers – apparaten die met elkaar kunnen communiceren via versleutelde tunnels.

In ons geval hebben we:

  • De Server: Je Linux-machine met een openbaar IP-adres, die fungeert als het centrale knooppunt waar al je apparaten verbinding mee maken.
  • De cliënten: Uw laptop, telefoon, tablet of een ander apparaat dat u wilt beschermen, elke cliënt krijgt zijn eigen cryptografische sleutelpair en configuratie.
  • De Webinterface: Een lichtgewicht webapplicatie (we gebruiken WireGuard-UI) die op je server draait en je een dashboard geeft om alles te beheren.

Wanneer een cliënt verbinding wil maken, stelt deze een directe versleutelde tunnel naar de server in en vervolgens routeert de server het internetverkeer van de cliënt of staat eenvoudig toegang toe tot bronnen op het lokale netwerk van de server, afhankelijk van hoe je het configureert.

Stap 1: WireGuard installeren op Ubuntu-server

Laten we eerst zekerstellen dat je systeem up-to-date is en de benodigde hulpmiddelen geïnstalleerd heeft door het volgende commando te gebruiken, dat je pakketlijsten bijwerkt en verouderde software upgrade.

sudo apt update && sudo apt upgrade -y

Installeer vervolgens WireGuard zelf:

sudo apt install wireguard -y

Aangezien WireGuard is ingebouwd in de Linux-kernel (voor kernels 5.6 en hoger), installeert dit commando voornamelijk de gebruikersruimtehulpmiddelen die nodig zijn om WireGuard-interfaces te configureren en beheren.

Installeer WireGuard in Ubuntu

Stap 2: IP-forwarding inschakelen op Ubuntu

Standaard stuurt Ubuntu geen pakketten door tussen netwerkinterfaces, wat een beveiligingsfunctie is zodat je server niet als router fungeert tenzij je dit expliciet aangeeft, maar voor een VPN-server hebben we deze functionaliteit nodig.

Wanneer je telefoon verbinding maakt met de VPN en probeert een website te bezoeken, moet de server dat verzoek van de WireGuard-interface naar de openbare netwerkinterface doorsturen en vervolgens de reactie terugsturen.

Om IP-forwarding permanent in te schakelen, moeten we een systeemconfiguratiebestand bewerken:

sudo nano /etc/sysctl.conf

Zoek naar deze regel (het kan zijn dat deze is uitgeschakeld met een # aan het begin):

#net.ipv4.ip_forward=1

Verwijder de # om het uit te commentariëren, of voeg de regel toe als deze niet bestaat:

net.ipv4.ip_forward=1

Sla het bestand op en pas de wijziging vervolgens toe zonder opnieuw op te starten:

sudo sysctl -p

IP-forwarding inschakelen op Ubuntu

Stap 3: Configureer Firewall en Routing voor WireGuard

Je VPN-server moet binnenkomende verbindingen accepteren op de poort die WireGuard gebruikt (standaard UDP-poort 51820). Bovendien moet het verkeer correct worden gerouteerd tussen de VPN-interface en je openbare netwerkinterface.

Laten we eerst je openbare netwerkinterface identificeren:

ip route | grep default

Je zult een uitvoer zien zoals:

default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.100 metric 100

De interfacenaam hier is `eth0`, maar deze kan op jouw systeem anders zijn, het kan `ens3`, `enp0s3` of iets vergelijkbaars zijn.

Laten we nu de ufw-firewall configureren (de standaardfirewall van Ubuntu):

# Allow SSH (if you haven't already)
sudo ufw allow 22/tcp

# Allow WireGuard
sudo ufw allow 51820/udp

# Allow the web interface (we'll use port 5000)
sudo ufw allow 5000/tcp

Vervolgens moeten we een NAT (Network Address Translation) regel toevoegen die je server vertelt VPN-verkeer te maskeren alsof het afkomstig is van de server zelf wanneer het naar het internet wordt doorgestuurd.

sudo nano /etc/ufw/before.rules

Voeg deze regels bovenaan het bestand toe, direct na de headercommentaar, maar vóór de *filter regel, en vervang eth0 door de naam van uw eigen interface:

# NAT table rules for WireGuard
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
COMMIT

Dit betekent het volgende:

  • *nat: We werken met de NAT-tabel.
  • -s 10.0.0.0/24: Voor pakketten afkomstig van ons VPN-netwerk (10.0.0.0/24 is het subnet dat we zullen toewijzen aan VPN-clients).
  • -o eth0: Verkeer gaat via de eth0-interface naar buiten.
  • -j MASQUERADE: Herschrijf het bron-IP naar het openbare IP van de server.

Opslaan en afsluiten, schakel vervolgens UFW in en laad opnieuw:

sudo ufw enable
sudo ufw reload

Stap 4: WireGuard-UI installeren op Ubuntu Server

Nu komt het interessante deel: het opzetten van de webinterface met WireGuard-UI, een overzichtelijke en eenvoudige webapplicatie geschreven in Go.

Maak eerst een map voor WireGuard-UI aan:

sudo mkdir -p /opt/wireguard-ui
cd /opt/wireguard-ui

Download vervolgens de nieuwste release van WireGuard-UI vanaf de GitHub releases-pagina, maar op het moment van schrijven haalt het wget-commando een recente stabiele versie op:

sudo wget https://github.com/ngoduykhanh/wireguard-ui/releases/download/v0.6.2/wireguard-ui-v0.6.2-linux-amd64.tar.gz

Eenmaal gedownload, pak het uit en maak het uitvoerbaar:

sudo tar -xzf wireguard-ui-v0.6.2-linux-amd64.tar.gz
sudo chmod +x wireguard-ui

Voordat we de interface starten, laten we een systemd-service aanmaken zodat deze automatisch opstart bij het opstarten.

sudo nano /etc/systemd/system/wireguard-ui.service

Plak deze configuratie:

[Unit]
Description=WireGuard UI
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/wireguard-ui
ExecStart=/opt/wireguard-ui/wireguard-ui
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Opslaan en afsluiten, schakel vervolgens de service in en start deze:

sudo systemctl daemon-reload
sudo systemctl enable wireguard-ui
sudo systemctl start wireguard-ui

Controleer of het draait:

sudo systemctl status wireguard-ui

Controleer Wireguard-UI-status

Stap 5: Toegang tot de Wireguard-UI

Open je webbrowser en ga naar de volgende URL. Zorg ervoor dat je YOUR_SERVER_IP vervangt door het daadwerkelijke openbare IP-adres van je server.

http://YOUR_SERVER_IP:5000

Je ziet een inlogpagina, waar je de volgende standaardgegevens kunt gebruiken:

Username: admin
Password: admin

Wireguard-UI Dashboard

Belangrijk: Verander deze onmiddellijk na het inloggen. Klik op je gebruikersnaam rechtsboven, vervolgens op “Instellingen” en werk je wachtwoord bij.

Stap 6: Je WireGuard-server configureren

Zodra je bent ingelogd, word je naar het WireGuard-UI-dashboard gebracht. Om te beginnen met het configureren van je server, klik je in de linkerzijbalk op „WireGuard Server” en stel je de Interface Name in op 10.0.0.1/24 (de standaard WireGuard-interface) en de Listen Port op 51820.

Voer in het Post Up Script-veld het volgende in:

iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

en voer in het Post Down-script-veld in:

iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Zorg ervoor dat je eth0 vervangt door de naam van je eigen netwerkinterface als deze anders is en stel het Address in op 10.0.0.1/24, dit wordt het interne VPN-IP-adres van de server.

Wanneer je op Config toepassen klikt, zal WireGuard de wg0-interface aanmaken, luisteren naar VPN-verbindingen op poort 51820, je server zijn VPN-IP toewijzen en firewallregels configureren om VPN-verkeer correct door te sturen.

De gebruikersinterface genereert ook automatisch de privé- en openbare sleutels van uw server. Nadat u de instellingen hebt toegepast, zou de interface als Actief moeten worden weergegeven, wat aangeeft dat uw WireGuard-server actief is en draait.

WireGuard-server configureren

Stap 7: Voeg uw eerste WireGuard-client toe

Laten we nu een apparaat aan je VPN toevoegen, wat je laptop, telefoon of een ander clientapparaat kan zijn. Klik in de linkerzijbalk op "Clients", en klik vervolgens op "Nieuwe Client Toevoegen".

Geef de client een beschrijvende naam zoals Mijn Laptop of iPhone, en voer eventueel een e-mailadres in om het apparaat later te kunnen identificeren. Klik op Auto om automatisch het volgende beschikbare IP-adres toe te wijzen (waarschijnlijk 10.0.0.2).

Voer voor Toegestane IP's 0.0.0.0/0, ::/0 in, wat ervoor zorgt dat al het verkeer van de cliënt via de VPN wordt geleid; als u alleen toegang wilt tot het interne netwerk van de server, kunt u in plaats daarvan dat subnet specificeren (bijvoorbeeld 10.0.0.0/24).

Zodra alles is ingesteld, klik op „Verzenden” en de webinterface genereert automatisch een volledige WireGuard-configuratie voor deze cliënt, inclusief zijn eigen cryptografische sleutelparen.

WireGuard-client toevoegen

Stap 8: Uw clientapparaat verbinden

Nu moet je de configuratie op je apparaat krijgen en WireGuard-UI maakt dit gemakkelijk met QR-codes voor mobiele apparaten en downloadbare configuratiebestanden voor computers.

Voor mobiele apparaten (telefoon/tablet):

  • Installeer de WireGuard-app vanuit je app store (deze is beschikbaar voor zowel iOS als Android).
  • Zoek in de WireGuard-UI webinterface je nieuw aangemaakte cliënt en klik op het QR-codepictogram.
  • Open de WireGuard-app op je telefoon, tik op de "+"-knop en selecteer Maak aan via QR-code.
  • Scan de QR-code die in je browser wordt weergegeven.
  • Geef je verbinding een naam en tik op “Tunnel maken”.

Dat is alles! Zet de schakelaar aan om verbinding te maken, en je mobiele apparaat stuurt nu al het verkeer via je VPN-server.

Voor desktop/laptop:

  • Installeer WireGuard vanaf wireguard.com/install.
  • Klik in de WireGuard-UI-interface op het downloadpictogram naast uw client om het .conf-bestand te downloaden.
  • Open de WireGuard-applicatie op je computer, klik op “Tunnel(s) importeren uit bestand“ en selecteer het gedownloade configuratiebestand.
  • Klik op ‘Activeren’ om te verbinden.

Stap 9: Je VPN testen

Laten we ervoor zorgen dat alles goed werkt. Bezoek eerst, terwijl je VPN is losgekoppeld, whatismyipaddress.com en noteer het weergegeven IP-adres.

Verbind vervolgens met je WireGuard VPN en vernieuw de pagina, je IP-adres zou nu het openbare IP van je server moeten weergeven in plaats van je oorspronkelijke, wat bevestigt dat het verkeer via de VPN wordt geleid.

Om verder te verifiëren dat DNS correct werkt, kunt u het volgende commando uitvoeren op uw verbonden apparaat:

ping google.com

Als je reacties ziet, wordt je verkeer correct via de VPN geleid.

Om actieve verbindingen op je server te zien, log in via SSH en voer uit:

sudo wg show

Je zult een uitvoer zien zoals:

interface: wg0
  public key: [your server's public key]
  private key: (hidden)
  listening port: 51820

peer: [client's public key]
  endpoint: [client's IP]:random_port
  allowed ips: 10.0.0.2/32
  latest handshake: 45 seconds ago
  transfer: 2.50 MiB received, 15.23 MiB sent

Dit laat zien dat uw cliënt verbonden is, wanneer deze voor het laatst met de server heeft gecommuniceerd en hoeveel gegevens er zijn overgedragen.

Stap 10: Gebruik HTTPS voor WireGuard-UI

Op dit moment, wanneer je toegang krijgt tot je WireGuard-webinterface op http://YOUR_SERVER_IP:5000, worden je inloggegevens en alle configuratiegegevens als platte tekst over het internet verzonden en kan iedereen die het verkeer tussen je browser en de server onderschept je admin-wachtwoord zien en mogelijk je sessie kapen.

De oplossing is om je webinterface achter een reverse proxy te plaatsen met HTTPS ingeschakeld. Een reverse proxy staat voor je applicatie, verzorgt alle versleutelde HTTPS-verbindingen van cliënten en stuurt de verzoeken vervolgens door naar je applicatie via het lokale netwerk waar afluisteren geen probleem is.

We zullen Nginx (high-performance webserver) gebruiken als onze reverse proxy en Let’s Encrypt om een gratis SSL-certificaat te verkrijgen, zodat je je WireGuard-interface kunt bereiken op https://vpn.jedomein.com in plaats van via een IP-adres met HTTP.

Installeer Nginx-webserver

Maak eerst een DNS-record aan voor je domein (https://vpn.yourdomain.com) dat naar het IP-adres van je server verwijst en installeer daarna de Nginx-webserver.

sudo apt update
sudo apt install nginx -y

Na de installatie kunt u http://vpn.yourdomain.com in uw browser bezoeken en ziet u de standaard Nginx-welkomstpagina, wat betekent dat Nginx werkt en toegankelijk is vanaf het internet.

Controleer Nginx-pagina

Installeer Certbot voor Let’s Encrypt

Installeer vervolgens Let’s Encrypt, een gratis certificaatautoriteit die SSL-certificaten levert, en certbot is een hulpmiddel dat het proces van het verkrijgen en vernieuwen van deze certificaten automatiseert.

sudo apt install certbot python3-certbot-nginx -y

Het python3-certbot-nginx-pakket bevat een plug-in die Nginx automatisch voor je kan configureren, waardoor het proces veel eenvoudiger wordt.

Nginx configureren als een reverse proxy

Laten we nu een Nginx-configuratie maken die verzoeken van https://vpn.yourdomain.com doorstuurt naar uw WireGuard-UI-applicatie die draait op localhost:5000.

Maak een nieuw configuratiebestand aan.

sudo nano /etc/nginx/sites-available/wireguard-ui

Plak deze configuratie (vervang vpn.yourdomain.com door je eigen domein):

server {
    listen 80;
    listen [::]:80;
    server_name vpn.yourdomain.com;

    # This will be used by Certbot for the SSL certificate challenge
    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }

    # Redirect all other HTTP traffic to HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name vpn.yourdomain.com;

    # SSL certificate paths (Certbot will fill these in)
    ssl_certificate /etc/letsencrypt/live/vpn.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/vpn.yourdomain.com/privkey.pem;

    # Modern SSL configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # Security headers
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;

    # Proxy settings
    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_http_version 1.1;
        
        # WebSocket support (if WireGuard-UI uses it)
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        # Forward real client information
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # Timeouts
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}

Schakel deze configuratie nu in door een symbolische link te maken:

sudo ln -s /etc/nginx/sites-available/wireguard-ui /etc/nginx/sites-enabled/

Test je Nginx-configuratie op syntaxfouten:

sudo nginx -t

Je zou moeten zien:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Als je fouten ziet, ga dan terug en controleer je configuratiebestand op typfouten.

Verkrijg een SSL-certificaat

Zodra alles correct is geconfigureerd, is het nu tijd om het certbot-commando uit te voeren, dat automatisch een SSL-certificaat van Let’s Encrypt verkrijgt en Nginx configureert om het te gebruiken.

sudo certbot --nginx -d vpn.yourdomain.com

Het hele proces duurt ongeveer 30 seconden en zodra het voltooid is, zie je een succesbericht:

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/vpn.yourdomain.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/vpn.yourdomain.com/privkey.pem

Laad Nginx nu opnieuw om alles toe te passen:

sudo systemctl reload nginx

Certificaat Automatisch Vernieuwen

Let’s Encrypt-certificaten zijn slechts 90 dagen geldig, wat opzettelijk is om regelmatige vernieuwing aan te moedigen en de mogelijke schade te beperken als een privésleutel ooit gecompromitteerd zou worden.

Gelukkig stelt Certbot automatisch een vernieuwingsschema in bij installatie, en je kunt bevestigen dat de vernieuwingsservice actief is door het volgende uit te voeren:

sudo systemctl status certbot.timer

en je zou het als actief (draaiend) moeten zien staan, deze timer controleert twee keer per dag en zal automatisch elk certificaat vernieuwen dat binnen 30 dagen verloopt.

Om te controleren of alles werkt zonder een daadwerkelijke verlenging uit te voeren, voer uit:
sudo certbot renew –dry-run

Als de test succesvol wordt voltooid, is uw automatische certificaatvernieuwing volledig ingesteld en hoeft u zich geen zorgen te maken over het verlopen van uw certificaten.

Werk uw firewall bij

Aangezien we nu WireGuard-UI via Nginx op de standaard HTTPS-poort (443) benaderen, moeten we dit in onze firewall toestaan en kunnen we optioneel directe toegang tot poort 5000 sluiten.

sudo ufw allow 443/tcp

Optioneel, als je directe toegang tot WireGuard-UI op poort 5000 wilt voorkomen (zodat iedereen de HTTPS-interface moet gebruiken), kun je die regel verwijderen:

sudo ufw delete allow 5000/tcp

Herlaad de firewall:

sudo ufw reload

Stap 11: Configureer WireGuard-UI om alleen te luisteren op localhost

Aangezien Nginx nu alle externe verbindingen afhandelt, zouden we WireGuard-UI zo moeten configureren dat het alleen verbindingen vanaf de lokale machine accepteert, waardoor niemand er direct toegang toe heeft op poort 5000, zelfs als ze ontdekken dat de poort open is.

Stop de WireGuard-UI-dienst:

sudo systemctl stop wireguard-ui

Bewerk het servicebestand:

sudo nano /etc/systemd/system/wireguard-ui.service

Pas de ExecStart-regel aan zodat deze alleen aan localhost wordt gebonden:

[Unit]
Description=WireGuard UI
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/wireguard-ui
Environment="BIND_ADDRESS=127.0.0.1:5000"
ExecStart=/opt/wireguard-ui/wireguard-ui
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Opslaan en afsluiten, laad vervolgens systemd opnieuw en start de service opnieuw:

sudo systemctl daemon-reload
sudo systemctl start wireguard-ui
sudo systemctl status wireguard-ui

Open tenslotte je browser en ga naar:

https://vpn.yourdomain.com

Je zou een hangslotpictogram in de adresbalk van je browser moeten zien. Je kunt op het hangslotpictogram klikken om de certificaatdetails te bekijken. Je zult zien dat het is uitgegeven door Let’s Encrypt en 90 dagen geldig is.

Samenvatting

Tegenwoordig heb je met succes een volledig operationele WireGuard VPN-server geïmplementeerd met een veilige webgebaseerde beheerinterface. In plaats van sleutels, configuratiebestanden en routeringsregels handmatig te beheren, biedt WireGuard-UI je een eenvoudig dashboard om nieuwe apparaten toe te voegen, QR-codes te genereren en actieve verbindingen te monitoren.