WireGuard ist ein modernes VPN-Protokoll, das einfacher und schneller als OpenVPN ist. Es ist seit 2020 im Linux-Kernel integriert.

Vorteile von WireGuard

  • Schnell: Bessere Performance als OpenVPN/IPsec
  • Einfach: Minimale Konfiguration
  • Modern: Aktuelle Kryptographie
  • Schlank: ~4000 Zeilen Code (vs. 100.000+ bei OpenVPN)
  • Kernel-Integration: Seit Linux 5.6 im Kernel

Installation

Ubuntu/Debian

apt update
apt install wireguard

CentOS/AlmaLinux

dnf install epel-release elrepo-release
dnf install kmod-wireguard wireguard-tools

Kernel-Modul laden

modprobe wireguard

Server einrichten

Schlüsselpaar generieren

cd /etc/wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey

Server-Konfiguration

Erstellen Sie /etc/wireguard/wg0.conf:

[Interface]
PrivateKey = SERVER_PRIVATE_KEY
Address = 10.0.0.1/24
ListenPort = 51820
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]
# Client 1
PublicKey = CLIENT1_PUBLIC_KEY
AllowedIPs = 10.0.0.2/32

Ersetzen Sie:

  • SERVER_PRIVATE_KEY mit Inhalt von /etc/wireguard/privatekey
  • eth0 mit Ihrem Netzwerk-Interface

IP-Forwarding aktivieren

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

Firewall

ufw allow 51820/udp

WireGuard starten

wg-quick up wg0
systemctl enable wg-quick@wg0

Status prüfen

wg show

Client einrichten

Linux-Client

Schlüssel generieren:

cd /etc/wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey

Client-Konfiguration /etc/wireguard/wg0.conf:

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = server-ip:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Client zum Server hinzufügen:

# Auf dem Server
wg set wg0 peer CLIENT_PUBLIC_KEY allowed-ips 10.0.0.2/32

Windows-Client

1. WireGuard von wireguard.com/install installieren 2. "Tunnel hinzufügen" → "Leeren Tunnel hinzufügen" 3. Konfiguration eintragen 4. Aktivieren

macOS-Client

1. WireGuard aus dem App Store 2. "Tunnel aus Datei importieren" oder manuell erstellen

Android/iOS

1. WireGuard App installieren 2. "+" → "Von Datei importieren" oder QR-Code scannen

Weitere Clients hinzufügen

Für jeden Client:

1. Schlüsselpaar generieren 2. Eindeutige IP zuweisen (10.0.0.3, 10.0.0.4, ...) 3. Peer auf Server hinzufügen

Schnelles Hinzufügen

# Client-Keys generieren
CLIENT_PRIV=$(wg genkey)
CLIENT_PUB=$(echo $CLIENT_PRIV | wg pubkey)

# Auf Server hinzufügen
wg set wg0 peer $CLIENT_PUB allowed-ips 10.0.0.3/32

# Client-Config ausgeben
cat << EOF
[Interface]
PrivateKey = $CLIENT_PRIV
Address = 10.0.0.3/24
DNS = 1.1.1.1

[Peer]
PublicKey = $(cat /etc/wireguard/publickey)
Endpoint = $(curl -s ifconfig.me):51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
EOF

QR-Code für Mobile

apt install qrencode

qrencode -t ansiutf8 < client.conf

Konfigurationsoptionen

AllowedIPs

  • 0.0.0.0/0 - Gesamter Traffic über VPN (Full Tunnel)
  • 10.0.0.0/24 - Nur VPN-Netzwerk (Split Tunnel)
  • 10.0.0.0/24, 192.168.1.0/24 - VPN und bestimmte Netze

PersistentKeepalive

Wichtig für Clients hinter NAT:

PersistentKeepalive = 25

Sendet alle 25 Sekunden ein Paket, um die Verbindung offen zu halten.

DNS

DNS-Server für Clients:

DNS = 1.1.1.1, 1.0.0.1

Verwaltungsbefehle

# Interface starten
wg-quick up wg0

# Interface stoppen
wg-quick down wg0

# Status anzeigen
wg show

# Peer hinzufügen (ohne Neustart)
wg set wg0 peer PUBLIC_KEY allowed-ips 10.0.0.5/32

# Peer entfernen
wg set wg0 peer PUBLIC_KEY remove

# Konfiguration speichern
wg-quick save wg0

Automatisiertes Setup

Mit dem wg-easy Docker-Container:

docker run -d \
  --name wg-easy \
  -e WG_HOST=ihre-domain.de \
  -e PASSWORD=admin-passwort \
  -v ~/.wg-easy:/etc/wireguard \
  -p 51820:51820/udp \
  -p 51821:51821/tcp \
  --cap-add NET_ADMIN \
  --cap-add SYS_MODULE \
  --sysctl net.ipv4.ip_forward=1 \
  --restart unless-stopped \
  ghcr.io/wg-easy/wg-easy

Web-Interface unter http://server:51821.

Site-to-Site VPN

Zwei Netzwerke verbinden:

Server A (Netz 192.168.1.0/24)

[Interface]
PrivateKey = SERVER_A_PRIVATE
Address = 10.0.0.1/24
ListenPort = 51820

[Peer]
PublicKey = SERVER_B_PUBLIC
Endpoint = server-b.example.com:51820
AllowedIPs = 10.0.0.2/32, 192.168.2.0/24

Server B (Netz 192.168.2.0/24)

[Interface]
PrivateKey = SERVER_B_PRIVATE
Address = 10.0.0.2/24
ListenPort = 51820

[Peer]
PublicKey = SERVER_A_PUBLIC
Endpoint = server-a.example.com:51820
AllowedIPs = 10.0.0.1/32, 192.168.1.0/24

Troubleshooting

Keine Verbindung

# Server erreichbar?
ping server-ip
nc -vzu server-ip 51820

# WireGuard läuft?
wg show

# Firewall?
ufw status
iptables -L

Kein Internet über VPN

# IP-Forwarding aktiv?
cat /proc/sys/net/ipv4/ip_forward

# NAT-Regel vorhanden?
iptables -t nat -L

Handshake schlägt fehl

  • Public/Private Keys überprüfen
  • Endpoint-Adresse prüfen
  • Firewall Port 51820/UDP

WireGuard vs. OpenVPN

| Aspekt | WireGuard | OpenVPN | |--------|-----------|---------| | Geschwindigkeit | Schneller | Langsamer | | Konfiguration | Einfach | Komplex | | Code | ~4.000 Zeilen | ~100.000 Zeilen | | Protokoll | UDP | UDP oder TCP | | Verschlüsselung | ChaCha20, Poly1305 | Flexibel (OpenSSL) | | Kernel-Support | Ja (seit 5.6) | Nein |

Fazit

WireGuard ist die moderne Wahl für VPN. Die Einrichtung ist deutlich einfacher als bei OpenVPN, und die Performance ist besser. Für die meisten Anwendungsfälle ist WireGuard die bessere Wahl.