Diese Anleitung zeigt, wie Sie einen WireGuard VPN-Server auf einem Linux-Server einrichten und Ihr erstes Gerät verbinden. Sie installieren wireguard-tools über den Paketmanager, generieren ein Schlüsselpaar, erstellen die Server-Konfiguration unter /etc/wireguard/wg0.conf, öffnen UDP-Port 51820 und starten den Tunnel. Anschließend erstellen Sie eine Client-Konfiguration und verbinden Ihr Gerät per QR-Code oder Konfigurationsdatei. Die gesamte Einrichtung dauert unter 15 Minuten.
Warum ein eigener VPN-Server?
Ein VPN (Virtual Private Network) verschlüsselt den gesamten Netzwerkverkehr zwischen einem Gerät und dem Server. Der Internet-Provider sieht nur eine verschlüsselte Verbindung zu einer IP-Adresse, nicht welche Seiten besucht oder welche Dienste genutzt werden. In öffentlichen WLANs schützt ein VPN vor dem Mitlesen des Datenverkehrs durch andere Nutzer im selben Netzwerk.
Mit einem eigenen VPN-Server entfällt das Vertrauen in einen kommerziellen VPN-Anbieter. Die Konfiguration, die Protokollierung und der physische Standort der Infrastruktur liegen vollständig in der eigenen Hand.
Diese Anleitung beschreibt die Einrichtung eines WireGuard VPN-Servers auf einem dataforest Seed. WireGuard ist seit 2020 fester Bestandteil des Linux-Kernels, benötigt minimal Ressourcen und lässt sich in wenigen Minuten einrichten.
Voraussetzungen
- Ein Seed in der dataforest Cloud (jedes Modell ist ausreichend, da WireGuard kaum CPU oder Arbeitsspeicher verbraucht)
- SSH-Zugriff auf den Seed
- Grundlegende Kenntnisse im Umgang mit dem Terminal
Ein Seed lässt sich über die dataforest Cloud UI oder per Public API erstellen. Per API genügt ein einzelner Aufruf:
curl -X POST "https://api.dataforest.net/api/v1/public/seeds" \
-H "Authorization: Bearer <API-Token>" \
-H "Content-Type: application/json" \
-d '{
"name": "wireguard-vpn",
"plan": "lines/entry/models/entry-c1-m2-s20",
"location": "fra01",
"project_id": "<Projekt-ID>",
"ssh_keys": ["<SSH-Key-ID>"],
"source": {
"type": "image",
"ref": "images/debian/versions/debian-v13"
},
"enable_ipv4": true
}'
API-Token und Projekt-ID finden sich in den Team-Einstellungen der Cloud UI. Die verfügbaren SSH-Key-IDs lassen sich mit GET /sshkeys abrufen.
Alle Betriebssysteme der dataforest Cloud (Debian 12+, Ubuntu 22.04+, AlmaLinux 9+, RockyLinux 9+) bringen WireGuard bereits im Kernel mit. Es muss lediglich das Verwaltungstool installiert werden.
WireGuard installieren
apt update
apt install wireguard
Das Paket wireguard-tools stellt zwei Werkzeuge bereit: wg für die Schlüsselverwaltung und wg-quick für das einfache Starten und Stoppen des VPN-Tunnels.
Auf neueren Debian-Versionen (ab Debian 13) ist iptables nicht vorinstalliert, wird aber für die NAT-Konfiguration von WireGuard benötigt:
apt install iptables
Server konfigurieren
Schlüsselpaar generieren
WireGuard verwendet ein Schlüsselpaar pro Teilnehmer: einen privaten Schlüssel (bleibt auf dem Server) und einen öffentlichen Schlüssel (wird an die Clients weitergegeben).
mkdir -p /etc/wireguard
chmod 700 /etc/wireguard
wg genkey | tee /etc/wireguard/server.key | wg pubkey > /etc/wireguard/server.pub
chmod 600 /etc/wireguard/server.key
Den öffentlichen Schlüssel des Servers notieren, er wird später für die Client-Konfiguration benötigt:
cat /etc/wireguard/server.pub
Netzwerk-Interface ermitteln
Für die NAT-Konfiguration wird der Name des öffentlichen Netzwerk-Interfaces benötigt. Dieser lässt sich mit folgendem Befehl ermitteln:
ip route show default
Die Ausgabe zeigt nach dev den Interface-Namen an (z.B. eth0, ens3 oder ens18). Diesen Wert im nächsten Schritt bei eth0 einsetzen.
IP-Weiterleitung aktivieren
Damit der Server Pakete zwischen dem VPN-Tunnel und dem Internet weiterleiten kann, muss IP-Forwarding aktiviert werden:
echo 'net.ipv4.ip_forward = 1' | tee /etc/sysctl.d/99-wireguard.conf
sysctl -p /etc/sysctl.d/99-wireguard.conf
Konfigurationsdatei erstellen
Die Datei /etc/wireguard/wg0.conf mit folgendem Inhalt erstellen. eth0 dabei durch das tatsächliche Interface ersetzen und den privaten Schlüssel einsetzen:
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <Inhalt von /etc/wireguard/server.key>
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
Hinweis: Der Wert von PrivateKey ist der Inhalt der Datei (cat /etc/wireguard/server.key), nicht der Dateipfad.
Auf Debian/Ubuntu sorgen die PostUp/PostDown-Regeln dafür, dass der VPN-Traffic über die öffentliche Netzwerkschnittstelle ins Internet geroutet wird (NAT). Sie werden beim Starten des Tunnels automatisch aktiviert und beim Stoppen wieder entfernt.
Auf AlmaLinux/RockyLinux übernimmt firewalld das NAT (siehe nächster Schritt). PostUp/PostDown-Regeln dürfen hier nicht verwendet werden, da sie mit firewalld kollidieren und zum Verlust der Netzwerkverbindung führen können.
Firewall konfigurieren
WireGuard verwendet UDP Port 51820. Dieser muss in der Firewall geöffnet werden.
ufw allow 51820/udp
Falls auf Debian/Ubuntu ufw noch nicht installiert ist: apt install ufw && ufw enable. Auf einem frischen Seed ohne aktive Firewall ist dieser Schritt optional – der Port ist dann bereits erreichbar.
WireGuard starten
systemctl enable --now wg-quick@wg0
Dieser Befehl startet den Tunnel sofort und sorgt gleichzeitig dafür, dass WireGuard nach einem Neustart des Servers automatisch gestartet wird.
Peer hinzufügen
Jedes Gerät, das sich mit dem VPN verbinden soll, wird als Peer konfiguriert. Jeder Peer bekommt ein eigenes Schlüsselpaar und eine eigene IP-Adresse innerhalb des VPN-Netzwerks.
Client-Schlüsselpaar generieren
wg genkey | tee /etc/wireguard/client1.key | wg pubkey > /etc/wireguard/client1.pub
chmod 600 /etc/wireguard/client1.key
Peer zur Server-Konfiguration hinzufügen
Folgenden Block am Ende von /etc/wireguard/wg0.conf anfügen:
[Peer]
PublicKey = <Inhalt von /etc/wireguard/client1.pub>
AllowedIPs = 10.0.0.2/32
Jeder weitere Peer erhält die nächste IP-Adresse (10.0.0.3, 10.0.0.4 usw.) und einen eigenen [Peer]-Block.
Anschliessend den Tunnel neu starten, damit die Änderung aktiv wird:
systemctl restart wg-quick@wg0
Client verbinden
Konfigurationsdatei für den Client erstellen
Auf dem Server die Datei /etc/wireguard/client1.conf erstellen. Diese Datei wird anschliessend auf das Endgerät übertragen:
[Interface]
Address = 10.0.0.2/24
PrivateKey = <Inhalt von /etc/wireguard/client1.key>
DNS = 8.8.8.8
[Peer]
PublicKey = <Inhalt von /etc/wireguard/server.pub>
Endpoint = <öffentliche IP des Seeds>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
AllowedIPs bestimmt, welcher Traffic durch den Tunnel geleitet wird:
0.0.0.0/0leitet den gesamten Internetverkehr durch den VPN-Tunnel (empfohlen für den Einsatz in öffentlichen WLANs)10.0.0.0/24leitet nur den VPN-internen Traffic durch den Tunnel, der restliche Internetverkehr geht direkt ins Netz (sogenannter Split-Tunnel, sinnvoll wenn nur der Zugriff auf das Heimnetzwerk gewünscht ist)
PersistentKeepalive hält die Verbindung offen, wenn sich das Gerät hinter einem NAT-Router befindet (was bei den meisten Heimnetzwerken und Mobilfunkverbindungen der Fall ist).
DNS legt fest, welcher DNS-Server bei aktiver VPN-Verbindung verwendet wird. 8.8.8.8 ist der öffentliche DNS-Dienst von Google. Eine Alternative ist 1.1.1.1 (Cloudflare). 9.9.9.9 (Quad9) filtert Malware-Domains, was in den meisten Fällen unproblematisch ist, aber eine Einschränkung darstellt, die man kennen sollte. Auf AlmaLinux/RockyLinux setzt die DNS-Option voraus, dass systemd-resolved aktiv ist. Falls der Tunnel mit einer Fehlermeldung zu resolvconf nicht startet, die DNS-Zeile entfernen oder den Dienst mit systemctl enable --now systemd-resolved aktivieren.
Linux-Client einrichten
Auf einem Linux-System die Konfigurationsdatei nach /etc/wireguard/wg0.conf kopieren und den Tunnel starten:
apt update
apt install wireguard
# client1.conf vom Server nach /etc/wireguard/wg0.conf übertragen (z.B. per scp)
systemctl enable --now wg-quick@wg0
Hinweis: Bei Verwendung von AllowedIPs = 0.0.0.0/0 wird der gesamte Netzwerkverkehr durch den Tunnel geleitet. Eine bestehende SSH-Verbindung zum Client geht dabei verloren. Für Server-zu-Server-Verbindungen stattdessen AllowedIPs = 10.0.0.0/24 (Split-Tunnel) verwenden.
QR-Code für mobile Geräte
Statt die Konfigurationsdatei manuell auf ein Smartphone zu übertragen, lässt sich ein QR-Code generieren, der direkt in der WireGuard-App gescannt werden kann.
apt install qrencode
QR-Code im Terminal anzeigen:
qrencode -t ansiutf8 < client1.conf
Die WireGuard-App (verfügbar für iOS und Android) öffnen, auf das + tippen und QR-Code scannen wählen.
Wichtig: Der QR-Code enthält den privaten Schlüssel des Clients. Ihn nicht per E-Mail versenden, nicht abfotografieren und nicht in Chats teilen.
Verbindung testen
Auf dem Server lässt sich der Status des Tunnels jederzeit prüfen:
wg show
Wenn ein Client verbunden ist, zeigt die Ausgabe den Zeitpunkt des letzten Handshakes und die übertragene Datenmenge:
peer: <client-public-key>
endpoint: <client-ip>:12345
allowed ips: 10.0.0.2/32
latest handshake: 42 seconds ago
transfer: 1.23 MiB received, 4.56 MiB sent
Falls latest handshake nicht erscheint, wurde noch keine Verbindung hergestellt. Typische Ursachen:
- Port nicht erreichbar: Prüfen, ob UDP Port 51820 in der Firewall geöffnet ist (
ss -ulnp | grep 51820sollte den Port als lauschend anzeigen) - Schlüssel vertauscht: Die Server-Konfiguration muss den öffentlichen Schlüssel des Clients enthalten, die Client-Konfiguration den öffentlichen Schlüssel des Servers. Das Vertauschen von Schlüsseln ist der häufigste Fehler.
- IP-Weiterleitung nicht aktiv: Mit
sysctl net.ipv4.ip_forwardprüfen, ob der Wert auf1steht
Weitere Peers hinzufügen
Für jedes weitere Gerät die Schritte aus den Abschnitten Peer hinzufügen und Client verbinden wiederholen. Jeder Peer benötigt:
- Ein eigenes Schlüsselpaar
- Eine eigene IP-Adresse (10.0.0.3, 10.0.0.4 usw.)
- Einen eigenen
[Peer]-Block in der Server-Konfiguration - Eine eigene Client-Konfigurationsdatei
WireGuard setzt keine feste Obergrenze für die Anzahl verbundener Peers. Bei typischer Nutzung mit 5 bis 50 Geräten ist jedes Seed-Modell ausreichend.
Zwei Seeds per VPN verbinden
WireGuard eignet sich nicht nur für die Anbindung von Endgeräten, sondern auch für ein privates Netzwerk zwischen zwei Seeds. Ein typischer Anwendungsfall: Ein Seed mit einer Datenbank soll nicht über das öffentliche Internet erreichbar sein, sondern nur über einen VPN-Tunnel von einem zweiten Seed aus.
Ausgangssituation
- Seed A (VPN-Server): WireGuard ist wie oben beschrieben eingerichtet, IP im VPN:
10.0.0.1 - Seed B (zweiter Server): Soll sich als Peer verbinden, IP im VPN:
10.0.0.2
Seed B einrichten
Auf Seed B WireGuard installieren und die Client-Konfiguration nach /etc/wireguard/wg0.conf übertragen (siehe Client verbinden). Dabei AllowedIPs = 10.0.0.0/24 verwenden (Split-Tunnel), damit nur der VPN-interne Traffic durch den Tunnel läuft und der reguläre Internetverkehr sowie SSH-Verbindungen weiterhin direkt funktionieren:
[Interface]
Address = 10.0.0.2/24
PrivateKey = <privater Schlüssel von Seed B>
[Peer]
PublicKey = <öffentlicher Schlüssel von Seed A>
Endpoint = <öffentliche IP von Seed A>:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25
systemctl enable --now wg-quick@wg0
Verbindung prüfen
Auf beiden Seeds sollte ein Ping über die VPN-Adressen funktionieren:
# Von Seed A
ping 10.0.0.2
# Von Seed B
ping 10.0.0.1
Dienste wie Datenbanken können nun auf die VPN-Adresse gebunden werden (z.B. bind-address = 10.0.0.1 in der Datenbankkonfiguration). Der Zugriff ist dann nur über den VPN-Tunnel möglich, nicht über das öffentliche Internet.
Zusammenfassung
Nach Abschluss dieser Anleitung ist ein funktionsfähiger WireGuard VPN-Server eingerichtet. Je nach Konfiguration tunnelt er den gesamten Internetverkehr der verbundenen Geräte oder stellt ein privates Netzwerk zwischen mehreren Seeds bereit. Der Server startet automatisch nach einem Neustart, und weitere Geräte lassen sich jederzeit als neue Peers hinzufügen.
Wer den VPN-Server als Einstieg in die dataforest Cloud nutzt: Der Seed ist ein vollwertiger Linux-Server und lässt sich parallel auch für andere Dienste nutzen. Eine Übersicht weiterer Möglichkeiten bieten unsere Lösungen und Anleitungen.