WireGuard Site-to-Site VPN mit UniFi: Dein einfacher Praxis-Guide
Na, du alter Netzwerkhase! Heute tauchen wir in ein Thema ein, das in meiner Heimlab-Umgebung Gold wert ist: Eine WireGuard Site-to-Site VPN-Verbindung zwischen zwei Standorten, die jeweils ein UniFi Gateway nutzen. Wer schon mal versucht hat, zwei Netze sicher und performant zu verbinden, weiß, dass das schnell in einem Wust aus IPsec-Parametern und Frustration enden kann. Aber keine Sorge, mit WireGuard und ein bisschen UniFi-Magie wird das Ganze erstaunlich schmerzfrei.
Mein Ziel ist hier, dir einen ehrlichen, pragmatischen Guide an die Hand zu geben, der wirklich "ohne Schnick Schnack und Spezial Einstellungen" auskommt. Ich zeige dir, wie du das bei dir zu Hause oder in deinem kleinen Büro umsetzt, basierend auf meiner eigenen Erfahrung mit Proxmox, Docker und Co., wo stabile Netzwerkanbindungen einfach das A und O sind.
Warum WireGuard? Ganz einfach: Es ist schlank, schnell und sicher. Im Vergleich zu den älteren VPN-Protokollen wie OpenVPN oder IPsec ist WireGuard ein wahrer Segen für die Performance und die Komplexität der Konfiguration. Und UniFi macht das Zusammenspiel überraschend einfach, wenn man die richtigen Stellschrauben kennt. Das hat mir persönlich schon viel Zeit gespart und so manche Kopfschmerzen erspart.
Voraussetzungen für dein WireGuard Site-to-Site VPN
Bevor wir loslegen, lass uns kurz checken, ob du alles am Start hast, was wir brauchen. Nichts ist ärgerlicher, als mitten in der Konfiguration festzustellen, dass eine Kleinigkeit fehlt. In meiner Erfahrung sind das die absoluten Basics:
- Zwei Standorte mit jeweils einem UniFi Gateway: Das kann ein UniFi Dream Machine (UDM), ein USG oder ein UXG sein. Wichtig ist, dass es sich um UniFi OS Gateways handelt, die WireGuard unterstützen. Ich gehe davon aus, dass du diese bereits eingerichtet und deine lokalen Netzwerke konfiguriert hast.
- Öffentliche, erreichbare IP-Adressen: Beide Standorte benötigen eine öffentliche IP-Adresse, unter der sie aus dem Internet erreichbar sind. Wenn du keine feste IP hast, ist ein DynDNS-Dienst wie ipv64.net (keine Sorge, das ist nur ein Beispiel für einen DynDNS, den ich selbst nutze) oder ein ähnlicher Dienst Pflicht. Einer der beiden Standorte muss als "Server" fungieren und eine Portweiterleitung für WireGuard erhalten.
- Ein Linux-Host an einem der Standorte (optional, aber empfohlen für den "Server"-Part): Obwohl UniFi WireGuard unterstützt, ist es oft flexibler, einen dedizierten Linux-Server (z.B. eine VM auf Proxmox oder ein Raspberry Pi) als einen der WireGuard-Peers zu nutzen. Dies gibt dir mehr Kontrolle und ermöglicht es, die Konfiguration direkt über die Shell zu steuern. Ich werde das Setup so erklären, dass ein Linux-Host als "Server" fungiert und dein UniFi Gateway am zweiten Standort als "Client" oder "Peer" anbindet. Das ist ein bewährtes Setup in meinem Heimlab.
- Grundlegende Netzwerkkenntnisse: Du solltest wissen, was IP-Adressen, Subnetze, Routing und Portweiterleitungen sind.
- SSH-Zugang zum Linux-Host: Für die Konfiguration des WireGuard-Servers.
- Zugriff auf den UniFi Controller: Um das UniFi Gateway zu konfigurieren.
Netzwerkplanung: Das A und O
Bevor wir auch nur einen Befehl eingeben oder eine Einstellung im UniFi Controller ändern, müssen wir unsere Netzwerke planen. Das erspart dir später viel Ärger. Stell dir vor, du hast zwei Standorte, nennen wir sie einfach Standort A und Standort B. Jeder hat sein eigenes lokales Netzwerk (LAN) und wir brauchen ein drittes, separates Netzwerk für den VPN-Tunnel selbst.
- Standort A (Server-Seite):
- Lokales LAN:
192.168.1.0/24 - WireGuard VPN IP:
10.0.0.1/24 - Öffentliche IP oder DynDNS:
dein-server.dyndns.net
- Lokales LAN:
- Standort B (UniFi-Seite):
- Lokales LAN:
192.168.2.0/24 - WireGuard VPN IP:
10.0.0.2/24 - Öffentliche IP oder DynDNS:
dein-client.dyndns.net(oder einfach die öffentliche IP, wenn Standort A als Server fungiert und Standort B den Tunnel initiiert)
- Lokales LAN:
Wichtig: Das VPN-Netzwerk (hier 10.0.0.0/24) darf sich nicht mit deinen lokalen LAN-Netzwerken überschneiden! Das klingt trivial, aber ich habe schon oft gesehen, wie Leute genau hier stolpern und sich wundern, warum nichts funktioniert.
Schritt-für-Schritt-Anleitung: WireGuard Site-to-Site
1. Schlüsselpaare generieren
WireGuard basiert auf Public-Key-Kryptographie. Jedes VPN-Endpunkt benötigt ein Paar aus privatem und öffentlichem Schlüssel. Der private Schlüssel bleibt geheim, der öffentliche wird mit den Peers ausgetauscht. Das geht am einfachsten auf einem Linux-System. Ich mache das immer direkt auf meinem WireGuard-Server, aber du könntest es auch auf deinem lokalen Rechner tun.
Verbinde dich via SSH mit deinem Linux-Host, auf dem der WireGuard-Server laufen soll. Installiere zuerst WireGuard, falls noch nicht geschehen:
sudo apt update
sudo apt install wireguard -y
Jetzt generieren wir die Schlüsselpaare. Wir brauchen je ein Paar für den Server (Standort A) und den Client (Standort B, also dein UniFi Gateway). Leg dir am besten einen Ordner an, damit du alles beisammen hast.
mkdir ~/wireguard_keys
cd ~/wireguard_keys
# Schlüssel für den Server (Standort A)
wg genkey | tee server_privatekey.key | wg pubkey > server_publickey.key
# Schlüssel für den Client (Standort B - UniFi)
wg genkey | tee client_privatekey.key | wg pubkey > client_publickey.key
# Private Schlüssel nur für Root lesbar machen (sehr wichtig!)
sudo chmod 600 server_privatekey.key client_privatekey.key
Wichtig: Die *.key Dateien enthalten die Schlüssel. Den privaten Schlüssel gibst du niemals weiter! Den öffentlichen Schlüssel teilst du mit dem jeweiligen Peer. Notier dir die Schlüssel oder kopier sie dir sicher weg. Du brauchst sie gleich.
2. WireGuard Server (Linux) Konfiguration (Standort A)
Nun konfigurieren wir den Linux-Host als WireGuard-Server. Wir erstellen eine Konfigurationsdatei für das WireGuard-Interface, üblicherweise unter /etc/wireguard/wg0.conf.
sudo nano /etc/wireguard/wg0.conf
Füge den folgenden Inhalt ein. Ersetze dabei die Platzhalter durch deine generierten Schlüssel und die geplanten IP-Adressen. Der ListenPort ist der UDP-Port, auf dem WireGuard auf eingehende Verbindungen wartet. 51820 ist hier ein gängiger Standardwert, den du aber ändern kannst.
[Interface]
PrivateKey = <server_private_key_aus_schritt_1>
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]
# Standort B (UniFi Gateway)
PublicKey = <client_public_key_aus_schritt_1>
AllowedIPs = 10.0.0.2/32, 192.168.2.0/24
Endpoint = <oeffentliche_IP_oder_DynDNS_von_Standort_B>:51820
PersistentKeepalive = 25
Erklärung der Parameter:
[Interface]: Definiert das lokale WireGuard-Interface.PrivateKey: Der private Schlüssel deines Servers.Address: Die IP-Adresse deines Servers im VPN-Netzwerk.ListenPort: Der UDP-Port, auf dem der Server lauscht.PostUp/PostDown: Diese Zeilen sind extrem wichtig! Sie aktivieren das IP-Forwarding und NAT (Masquerading), damit der Server Pakete zwischen dem VPN-Tunnel (%isteht für das WireGuard-Interface, z.B.wg0) und deinem lokalen Netzwerk (eth0ist hier ein Platzhalter für dein primäres Netzwerkinterface, musst du ggf. anpassen!) weiterleiten kann. Ohne das bleibt dein VPN eine Insel.
[Peer]: Definiert den anderen Endpunkt des VPN-Tunnels, hier dein UniFi Gateway.PublicKey: Der öffentliche Schlüssel deines UniFi Gateways (Client).AllowedIPs: Hier gibst du an, welche IP-Adressen und Netzwerke über diesen Peer erreichbar sein sollen. In unserem Fall die VPN-IP des UniFi Gateways (10.0.0.2/32) und das gesamte LAN von Standort B (192.168.2.0/24).Endpoint: Die öffentliche IP-Adresse oder der DynDNS-Name von Standort B, gefolgt vom Port, auf dem das UniFi Gateway WireGuard empfängt.PersistentKeepalive: Sendet alle 25 Sekunden ein Keepalive-Paket. Das ist nützlich, um NAT-Timeouts zu verhindern, besonders wenn einer der Peers hinter einem NAT-Router ohne Portweiterleitung sitzt (was hier aber nicht der Fall sein sollte, da der Endpoint erreichbar sein muss).
Nachdem du die Datei gespeichert hast, aktiviere und starte den WireGuard-Dienst:
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
Überprüfe den Status des Interfaces:
sudo wg show wg0
Du solltest hier die Konfiguration deines Servers und deines Peers (noch ohne Handshake) sehen. Wenn du eine Fehlermeldung bekommst, check die Logs mit sudo journalctl -u wg-quick@wg0.
3. Firewall-Regeln am Server (Standort A)
Ganz wichtig: Dein Router am Standort A (wo der Linux-Server steht) muss den WireGuard-Port (standardmäßig UDP 51820) an die interne IP-Adresse deines Linux-Servers weiterleiten. Ohne diese Portweiterleitung kann der Peer am Standort B keine Verbindung aufbauen. Das stellst du in der Konfiguration deines Internet-Routers (nicht unbedingt UniFi, wenn es ein vorgeschaltetes Modem/Router ist) ein. Such dort nach "Port Forwarding" oder "Portweiterleitung".
Zusätzlich musst du sicherstellen, dass die Firewall deines Linux-Servers den eingehenden UDP-Verkehr auf dem WireGuard-Port zulässt. Wenn du ufw nutzt:
sudo ufw allow 51820/udp
sudo ufw enable
Und ganz wichtig: Aktiviere IP-Forwarding dauerhaft auf deinem Linux-Server, falls noch nicht geschehen. Ohne das funktioniert das Routing zwischen den Netzen nicht.
sudo nano /etc/sysctl.conf
Entkommentiere oder füge diese Zeile hinzu:
net.ipv4.ip_forward = 1
Speichere und aktiviere die Einstellung:
sudo sysctl -p
4. UniFi Gateway Konfiguration (Standort B)
Jetzt kommt der UniFi-Teil. Melde dich bei deinem UniFi Controller an und navigiere zu den VPN-Einstellungen. Der genaue Pfad kann je nach UniFi OS Version leicht variieren, aber du findest es typischerweise unter Settings > VPN oder Network > VPN.
-
Neues VPN-Netzwerk erstellen: Wähle "Create New VPN Network" oder "VPN-Verbindung hinzufügen".
-
Typ "Site-to-Site WireGuard" auswählen: Gib dem VPN einen aussagekräftigen Namen, z.B. "VPN_zu_Standort_A".
-
Konfiguration des UniFi Gateways (Client-Seite):
- Private Key: Füge den
client_private_key.keyein, den du in Schritt 1 generiert hast. - IP Address: Gib die WireGuard VPN IP für Standort B ein:
10.0.0.2/24. - Listen Port: Hier kannst du den Standardport
51820belassen oder einen anderen wählen. Wichtig ist, dass dieser Port vom Server erreicht werden kann (ggf. Portweiterleitung am Router von Standort B nötig, wenn Standort B Initiator ist und Standort A einen festen Endpoint hat. Für unser Szenario, wo Standort A der Server ist, muss dieser Port von Standort A erreicht werden können, d.h. Standort B muss ihn nach außen öffnen.)
- Private Key: Füge den
-
Konfiguration des Peers (Server-Seite - Standort A):
- Public Key: Füge den
server_public_key.keyein, den du in Schritt 1 generiert hast. - Endpoint: Die öffentliche IP-Adresse oder der DynDNS-Name von Standort A, gefolgt vom Port des WireGuard-Servers:
dein-server.dyndns.net:51820. - Allowed IPs: Hier trägst du die IP-Adresse des WireGuard-Servers (
10.0.0.1/32) und das gesamte lokale Netzwerk von Standort A (192.168.1.0/24) ein. Das sagt dem UniFi Gateway, dass es Pakete für diese Ziele über den WireGuard-Tunnel schicken soll. - Persistent Keepalive: Setze diesen Wert auf
25Sekunden, wie auch auf der Server-Seite. Das hilft, die Verbindung stabil zu halten, besonders bei NAT.
- Public Key: Füge den
-
Speichern und Anwenden: Speichere die Einstellungen. Dein UniFi Gateway wird die Konfiguration übernehmen und das WireGuard-Interface starten. Das kann einen Moment dauern.
5. Firewall-Regeln am UniFi Gateway (Standort B)
Auch auf der UniFi-Seite müssen wir sicherstellen, dass der Traffic erlaubt ist. UniFi ist hier meistens recht intelligent und legt bei Site-to-Site VPNs oft passende Firewall-Regeln an. Aber ein Blick schadet nie.
- Stelle sicher, dass der UDP-Port
51820(oder dein gewählter Port) auf deinem UniFi Gateway für eingehenden Verkehr vom Standort A (dein WireGuard-Server) erlaubt ist. Wenn dein UniFi Gateway direkt am Internet hängt, ist das meistens schon erledigt, aber bei einem vorgeschalteten Router musst du auch hier eine Portweiterleitung einrichten. - Überprüfe die automatisch erstellten Firewall-Regeln im UniFi Controller (Settings > Firewall & Security > Firewall Rules). Es sollte eine Regel existieren, die den VPN-Traffic zwischen dem VPN-Interface und deinem LAN-Interface erlaubt. Falls nicht, musst du diese manuell hinzufügen, um den Datenaustausch zwischen
192.168.1.0/24und192.168.2.0/24zu ermöglichen.
Mein Tipp: Fang immer mit den einfachsten Regeln an und verfeinere sie erst, wenn alles läuft. Manchmal blockiert man sich selbst mit zu restriktiven Regeln, bevor der Tunnel überhaupt steht.
6. Testen der Verbindung
Wenn alles richtig konfiguriert ist, sollte der Tunnel jetzt stehen. So prüfe ich das immer:
- Auf dem Linux-Server (Standort A):
sudo wg show wg0Du solltest jetzt unter deinem Peer (Standort B) einen
latest handshake-Eintrag sehen. Das bedeutet, dass die Schlüssel ausgetauscht wurden und die Verbindung aktiv ist. Auch dertransfer-Wert sollte steigen. - Ping testen:
Versuche, vom Linux-Server aus eine IP-Adresse im LAN von Standort B anzupingen, z.B.
ping 192.168.2.1(das wäre das UniFi Gateway selbst oder ein anderes Gerät im LAN von Standort B). Wenn das klappt, ist das Routing durch den Tunnel schon mal da.ping 192.168.2.1 - Vom Standort B aus testen:
Versuche von einem Client im LAN von Standort B aus, eine IP-Adresse im LAN von Standort A anzupingen, z.B.
ping 192.168.1.1(das UniFi Gateway von Standort A oder ein Gerät im LAN von Standort A). Auch hier sollte ein erfolgreicher Ping die Erreichbarkeit bestätigen.
Wenn die Pings durchgehen, herzlichen Glückwunsch! Du hast eine funktionierende WireGuard Site-to-Site VPN-Verbindung!
Häufige Fehler und Lösungen
In meiner langen Zeit als Admin bin ich über so manche Hürde gestolpert. Hier sind die Klassiker, die dir bei der WireGuard-Einrichtung begegnen könnten und wie du sie fixen kannst:
Problem 1: Kein Handshake oder Verbindung kommt nicht zustande
Du siehst beim wg show wg0 Befehl keinen latest handshake oder die Transfer-Bytes bleiben bei Null.
- Lösung:
- Portweiterleitung prüfen: Das ist der absolute Hauptgrund! Ist der UDP-Port (z.B. 51820) am Router von Standort A (Server) an die interne IP deines Linux-Servers weitergeleitet? Nutzt du DynDNS, ist dieser auch aktuell?
- Firewall am Server: Blockiert die lokale Firewall deines Linux-Servers (z.B. UFW) den eingehenden UDP-Traffic auf dem WireGuard-Port? (
sudo ufw status) - Öffentliche Schlüssel vertauscht/falsch: Überprüfe akribisch, ob der öffentliche Schlüssel des Servers im Client (UniFi) und der öffentliche Schlüssel des Clients (UniFi) im Server richtig eingetragen sind. Ein einziger falscher Buchstabe und nichts geht.
- Endpoint falsch: Stimmt die öffentliche IP oder der DynDNS-Name deines Servers im UniFi Controller? Ist der Port korrekt?
- UniFi WAN-IP: Wenn dein UniFi Gateway hinter einem anderen Router sitzt (Doppel-NAT), musst du dort die Portweiterleitung für WireGuard einrichten. UniFi muss von außen erreichbar sein, wenn es als Endpoint dient.
Problem 2: Tunnel steht, aber kein Zugriff auf entfernte Netze (Pings gehen nicht durch)
Der Hand