Hvad er WireGuard, og hvorfor ikke bare OpenVPN?

WireGuard er skrevet af Jason Donenfeld og offentliggjort i 2015. Protokollen kører i kernespace (ikke brugerspace som OpenVPN) og det kan mærkes på ydelsen. På en Raspberry Pi 4 kan du forvente 200–300 Mbit/s igennem WireGuard mod typisk 50–80 Mbit/s med OpenVPN på samme hardware.

Kryptografien er ikke til forhandling. WireGuard bruger Curve25519 til nøgleudveksling, ChaCha20-Poly1305 til kryptering og BLAKE2s til hashing. OpenVPN lader dig vælge algoritmer, hvilket lyder fleksibelt, men det betyder i praksis at folk regelmæssigt konfigurerer det med svagere indstillinger. WireGuard har ingen svage konfigurationsmuligheder.

Kodebasen er lille nok til at blive auditeret af et enkelt menneske. Det er en egenskab, ikke et uheld.

⚠️ Kun på din egen infrastruktur. At opsætte en VPN-server på din Raspberry Pi på dit eget netværk er lovligt og fornuftigt. At bruge WireGuard til at tilgå andres systemer uden tilladelse er strafbart under straffelovens § 263. Denne guide handler om en server på dit eget netværk.

Forudsætninger

Tjek din kernel-version:

uname -r
# Skal returnere 5.15 eller højere

Installation

sudo apt update && sudo apt install -y wireguard

Det er det. Fordi WireGuard er i kernen, installerer denne kommando kun user-space værktøjerne: wg og wg-quick. Ingen kompilering, ingen DKMS, ingen kerne-moduler der skal bygges.

wg --version
# f.eks.: wireguard-tools v1.0.20210914

Generer nøgler

WireGuard bruger statiske Curve25519-nøglepar til autentificering. Hvert peer (server og klient) har sit eget par.

# Generer serverens nøglepar
wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key

# Sæt rigtige filrettigheder
sudo chmod 600 /etc/wireguard/server_private.key

# Generer klientens nøglepar (gentag for hver ny klient)
wg genkey | tee client1_private.key | wg pubkey > client1_public.key

# Vis nøglerne — du skal bruge dem i konfigurationsfilerne
sudo cat /etc/wireguard/server_private.key
sudo cat /etc/wireguard/server_public.key
cat client1_private.key
cat client1_public.key
📝 Note: Den private nøgle forlader aldrig den enhed den er genereret på. Serverens offentlige nøgle bruges i klientkonfigurationen. Klientens offentlige nøgle bruges i serverkonfigurationen.

Serverkonfiguration

Opret /etc/wireguard/wg0.conf. Erstat SERVER_PRIVATE_KEY med indholdet af /etc/wireguard/server_private.key og CLIENT1_PUBLIC_KEY med indholdet af client1_public.key.

sudo nano /etc/wireguard/wg0.conf
[Interface]
# Serverens private nøgle
PrivateKey = SERVER_PRIVATE_KEY

# VPN-serverens IP i tunnellen
Address = 10.0.0.1/24

# UDP-port WireGuard lytter på
ListenPort = 51820

# iptables-regler køres automatisk ved opstart/nedlukning
# Erstat eth0 med dit interface — tjek med: ip link show
PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# Klient 1
PublicKey  = CLIENT1_PUBLIC_KEY
AllowedIPs = 10.0.0.2/32
sudo chmod 600 /etc/wireguard/wg0.conf
💡 Tip: Find dit netværksinterface med ip link show. Det er typisk eth0 ved kabelforbindelse og wlan0 ved WiFi på Pi OS. Erstat eth0 i PostUp/PostDown-linjerne.

Aktivér IP-forwarding

For at Pi'en kan route trafik videre frem for at stoppe den, skal IP-forwarding slås til. Åbn /etc/sysctl.conf og find linjen:

#net.ipv4.ip_forward=1

Fjern #-tegnet. Aktivér uden reboot:

sudo sysctl -p

# Verificér — skal returnere 1
cat /proc/sys/net/ipv4/ip_forward

Start og aktivér WireGuard

# Start wg0
sudo wg-quick up wg0

# Aktivér automatisk start ved boot
sudo systemctl enable wg-quick@wg0

# Tjek hvad der kører
sudo wg show

wg show viser interface, lyttende port og tilføjede peers. Ser du interface: wg0 med din ListenPort, kører serveren. Endnu ingen handshake-tidsstempel. Det dukker op når en klient forbinder.

Klientkonfiguration

WireGuard-klienter til Windows, macOS, iOS og Android bruger alle det samme format. Download den officielle app fra wireguard.com/install. På Linux: sudo apt install wireguard.

Opret wg0-client1.conf:

[Interface]
# Klientens private nøgle (indholdet af client1_private.key)
PrivateKey = CLIENT1_PRIVATE_KEY

# Klientens IP i tunnellen — skal matche AllowedIPs på serveren
Address = 10.0.0.2/32

# Valgfrit: brug VPN-serverens IP som DNS
DNS = 10.0.0.1

[Peer]
# Serverens offentlige nøgle
PublicKey = SERVER_PUBLIC_KEY

# Serverens offentlige IP eller DDNS-hostname
Endpoint = DIN_IP_ELLER_DDNS:51820

# 0.0.0.0/0 = full tunnel (al trafik via VPN)
# Brug 10.0.0.0/24, 192.168.1.0/24 for split tunnel i stedet
AllowedIPs = 0.0.0.0/0, ::/0

# Hold forbindelsen åben bag NAT
PersistentKeepalive = 25
📝 Full tunnel vs split tunnel: Med AllowedIPs = 0.0.0.0/0 routes al internettrafik igennem din Pi. Vil du kun tilgå hjemmenetværket, brug AllowedIPs = 10.0.0.0/24, 192.168.1.0/24 i stedet. Split tunnel er hurtigere men lader anden trafik gå udenom VPN.

Tilføj klient til en kørende server

Du behøver ikke genstarte WireGuard for at tilføje en ny klient:

sudo wg set wg0 peer CLIENT1_PUBLIC_KEY allowed-ips 10.0.0.2/32

Gem ændringen permanent til wg0.conf:

sudo wg-quick save wg0

Verificér forbindelsen

# På klienten: aktivér tunnellen
sudo wg-quick up wg0-client1

# Ping serveren
ping 10.0.0.1

# På serveren: tjek peers og handshake-tidsstempel
sudo wg show

Under sudo wg show ser du nu klienten med et latest handshake-tidsstempel. Er det nyere end et par sekunder, er tunnellen oppe og krypteret.

Fejlfinding

Port forwarding virker ikke

Det mest almindelige problem. Log ind på din router og sæt UDP 51820 → Pi'ens LAN-IP. Test at porten er åben udefra (brug en mobilforbindelse, ikke WiFi):

nc -zvu DIN_OFFENTLIGE_IP 51820

UFW blokerer traffikken

Bruger du UFW på Pi'en:

sudo ufw allow 51820/udp
sudo ufw allow OpenSSH
sudo ufw enable

# Aktivér forwarding i UFW
sudo nano /etc/default/ufw
# Sæt: DEFAULT_FORWARD_POLICY="ACCEPT"

MTU-problemer

PPPoE-forbindelser (typisk ældre xDSL) har en MTU på 1492 i stedet for 1500. WireGuard bruger som standard 1420. Oplever du afbrudte forbindelser eller at store filer ikke kan overføres, tilføj til [Interface] i serverkonfigurationen:

MTU = 1380

Se fejllog

sudo journalctl -u wg-quick@wg0 -f

Tilføj flere klienter

Gentag nøglegenerering for hver klient. Tilføj en ny [Peer]-blok til serverkonfigurationen med klientens offentlige nøgle og en unik IP (10.0.0.3/32, 10.0.0.4/32 osv.). Klientkonfigurationen følger det samme format som vist ovenfor.

Hurtig reference: Server port: UDP 51820 · Subnet: 10.0.0.0/24 · Serverens VPN-IP: 10.0.0.1 · Klienternes IPs: 10.0.0.2/32, 10.0.0.3/32 ... · Config: /etc/wireguard/wg0.conf

Ofte stillede spørgsmål

Hvad er forskellen på WireGuard og OpenVPN?

WireGuard er hurtigere, bruger færre ressourcer og har en kodebase på ca. 4.000 linjer mod OpenVPNs ~100.000. Færre linjer betyder færre potentielle sårbarheder. OpenVPN er ældre og mere gennemtestet i virksomhedsmiljøer. Til hjemmelabbet vinder WireGuard på alle parametre.

Kan jeg have WireGuard og Pi-hole på samme Pi?

Ja. Sæt Pi-holes LAN-IP som DNS i WireGuard-klientkonfigurationen under DNS =. Al DNS-trafik via VPN filtreres så af Pi-hole, også fra din telefon på mobilnettet.

Virker WireGuard bag CG-NAT?

CG-NAT giver problemer fordi du mangler en statisk offentlig IP. To løsninger: en billig VPS som jumphost (f.eks. Hetzner CAX11), eller brug Cloudflare Tunnel der ikke kræver nogen åben port.

Kilder