UniFi WireGuard Site-to-Site VPN: UCG-Ultra hinter NAT
Ein Hauptstandort mit UDM-SE, zwei Filialen mit UCG-Ultra hinter NAT ohne eigene öffentliche IP, verbunden per WireGuard. Klingt einfach. Die UniFi-Oberfläche macht das Einrichten in wenigen Klicks möglich. Aber sobald du versuchst, vom Hauptstandort aus auf einen Drucker oder PC in der Filiale zuzugreifen, passiert: nichts. Der Tunnel steht, Ping geht in eine Richtung, aber bidirektionaler Traffic wird still gedroppt.
Die Ursache ist ein undokumentiertes Verhalten der UniFi-Firmware: WireGuard-Client-Interfaces werden als Extern/WAN statt als VPN klassifiziert. Die Lösung liegt in der Richtlinien-Engine der UCG-Ultras. Dieser Beitrag dokumentiert das Problem und die Lösung, damit du dir die Fehlersuche sparst.
Alle IP-Adressen in diesem Beitrag sind Beispieladressen.
Zusammenfassung
| Schritt | Wirkung |
|---|---|
| Netzwerk-Übersicht | Überblick über Standorte, Netze und Tunnel-IPs |
| Server-Konfiguration | WireGuard-Server mit Routen zu den Filial-Netzen |
| Client-Konfiguration | WireGuard-Client mit korrekten AllowedIPs |
| Das Kernproblem | Warum bidirektionaler Traffic nicht funktioniert |
| Die Lösung | Zwei Richtlinien-Regeln pro UCG-Ultra |
| Checkliste | Kompakte Übersicht aller Einstellungen |
Netzwerk-Übersicht
| Standort | Gateway | LAN-Netz | WireGuard Tunnel-IP |
|---|---|---|---|
| Hauptstandort (UDM-SE) | 192.168.1.1 | 192.168.1.0/24 | 10.10.10.1 |
| Filiale A (UCG-Ultra) | 192.168.50.1 | 192.168.50.0/24 | 10.10.10.2 |
| Filiale B (UCG-Ultra) | 192.168.60.1 | 192.168.60.0/24 | 10.10.10.3 |
Die UCG-Ultras hängen hinter einem Provider-Router ohne Portweiterleitung. Eine eingehende Verbindung ist also nicht möglich. Der WireGuard-Client-Modus baut die Verbindung ausgehend zum UDM-SE auf.
Server-Konfiguration (UDM-SE)
WireGuard-Server anlegen
- Protokoll WireGuard auswählen, die öffentliche Adresse des UDM-SE als Gateway eintragen (statische IP oder DynDNS), Port und Tunnel-Netz festlegen (10.10.10.0/24)
- Speichern mit Hinzufügen
Clients hinzufügen
- Pro Filiale einen Client anlegen
- Beim Erstellen vor dem Speichern die Client-Konfiguration herunterladen (wird später auf dem UCG-Ultra importiert)
- Nach dem Speichern auf den erstellten Client klicken
- Haken bei Remote-Client-Netzwerke setzen und das jeweilige Filial-Netz eintragen (192.168.50.0/24 für Filiale A)
Remote-Client-Netzwerke bestimmt, welche Netze über diesen Peer geroutet werden. UniFi setzt damit die AllowedIPs in der WireGuard-Konfiguration und erstellt automatisch Routen auf dem UDM-SE:
# Automatisch erstellt auf dem UDM-SE:
ip route add 192.168.50.0/24 dev wgsrv1
ip route add 192.168.60.0/24 dev wgsrv1Ohne diese Einstellung weiß der UDM-SE nicht, wohin Traffic für die Filial-Netze geroutet werden soll. Pakete an 192.168.50.x würden am Default-Gateway ins Internet gehen statt durch den Tunnel.
Client-Konfiguration (UCG-Ultra)
WireGuard-Client anlegen
- Bei Konfigurationsdatei auf Upload klicken und die beim Server-Setup heruntergeladene Config auswählen
- Beim Inhaltsassistent den Radio-Button IP auswählen
- IP-Adresse hinzufügen: Die Tunnel-Gateway-Adresse eintragen (10.10.10.1), im Feld Anschluss den Wert 32 setzen
- IP-Adressbereich hinzufügen: Das Zielnetzwerk eintragen, Starten 192.168.1.1, Beenden 192.168.1.254
- Änderungen anwenden
Der Inhaltsassistent steuert die AllowedIPs auf der Client-Seite. Damit wird festgelegt, welcher Traffic durch den Tunnel geroutet wird statt über das reguläre WAN-Interface.
Warum die Tunnel-Gateway-IP nötig ist
Ohne 10.10.10.1/32 in den AllowedIPs fehlt die Route zur Tunnel-Gateway-IP. Traffic an 10.10.10.1 geht dann über das WAN-Interface des UCG-Ultra ins Internet statt durch den Tunnel. Das lässt sich verifizieren:
# Ohne Tunnel-Gateway in AllowedIPs:
ip route get 10.10.10.1
# → ... dev eth* ... (WAN, falsch)
# Mit Tunnel-Gateway in AllowedIPs:
ip route get 10.10.10.1
# → ... dev wgclt1 ... (Tunnel, korrekt)Das Kernproblem: WireGuard-Client = “Extern” statt “VPN”
Bis hierhin steht der Tunnel und das Routing stimmt auf beiden Seiten. Geräte in der Filiale können Geräte am Hauptstandort erreichen, weil die Filiale die Verbindung initiiert. Aber: Der Hauptstandort kann keine Verbindung zu Geräten in der Filiale initiieren. RDP von der Filiale zum Hauptstandort geht, umgekehrt nicht.
Zwei WireGuard-Modi in UniFi
UniFi bietet zwei WireGuard-Varianten:
- Site-to-Site: Eine Seite ist Server, die andere Client. Das Interface wird als VPN klassifiziert. Erfordert aber, dass beide Seiten auf einem konfigurierten Port erreichbar sind. Bei NAT ohne Portweiterleitung nicht möglich.
- Client: Der UCG-Ultra baut die Verbindung ausgehend zum Server auf. Funktioniert hinter NAT. Aber: Das Interface
wgclt1wird als WAN/Extern klassifiziert.
Zum Vergleich: OpenVPN-Interfaces (tun+) und Teleport-Interfaces (tlprt+) werden korrekt als VPN behandelt. WireGuard-Client-Interfaces sind die Ausnahme.
Konsequenz für die Firewall
Die UniFi-Firewall unterscheidet zwischen Interface-Zonen: Intern (LAN), VPN und Extern (WAN). Für jede Kombination gibt es eigene iptables-Chains.
Weil wgclt1 als Extern klassifiziert wird, landen eingehende Pakete in den WAN-Chains:
# Auf dem UCG-Ultra:
iptables -S | grep wgclt1
# wgclt1 wird behandelt wie ein WAN-Interface:
# -A UBIOS_WAN_LOCAL_USER -i wgclt1 ...
# -A UBIOS_WAN_IN_USER -i wgclt1 ...Die Standard-WAN-Regeln erlauben nur RELATED,ESTABLISHED, also Antwortpakete auf ausgehende Verbindungen. Neue eingehende Verbindungen werden gedroppt. Genau das, was man für ein echtes WAN-Interface möchte, aber fatal für einen VPN-Tunnel.
Symptom: RDP von der Filiale zum Hauptstandort funktioniert (die Filiale initiiert die Verbindung, Antworten kommen als ESTABLISHED zurück). Aber der Hauptstandort kann keine Verbindung zu Filial-Geräten aufbauen. Das SYN-Paket wird am UCG-Ultra als neue eingehende WAN-Verbindung gedroppt.
Die Lösung: Richtlinien-Engine
Da die Interface-Klassifizierung nicht geändert werden kann, muss der Traffic explizit erlaubt werden. Das geht über die Richtlinien-Engine auf jedem UCG-Ultra.
Zwei Regeln sind nötig:
Regel 1: Extern → Gateway
Erlaubt dem Hauptstandort, den UCG-Ultra selbst zu erreichen (Management, Routing-Entscheidungen).
| Einstellung | Wert |
|---|---|
| Richtung | Extern → Gateway |
| Aktion | Erlauben |
| Quelle | IP-Adresse: 10.10.10.1/32 |
| Ziel | Beliebig |
Wichtig: Die Quelle auf 10.10.10.1/32 beschränken, also nur die Tunnel-IP des WireGuard-Servers. Damit bekommt nicht jeder VPN-Client Gateway-Zugriff auf den UCG-Ultra, sondern ausschließlich der Hauptstandort.
Regel 2: Extern → Intern
Erlaubt Traffic vom Hauptstandort zu den lokalen Geräten in der Filiale (Drucker, Scanner, PCs).
| Einstellung | Wert |
|---|---|
| Richtung | Extern → Intern |
| Aktion | Erlauben |
| Quelle | Beliebig |
| Ziel | Netzwerk: Lokales LAN (192.168.50.0/24) |
Alternativ kann die Quelle auf 192.168.1.0/24 und 10.10.10.1/32 eingeschränkt werden. Dann ist nur Traffic vom Hauptstandort-LAN und der Tunnel-Gateway-IP erlaubt.
Hinweis: Das Ziel muss das lokale Netz sein, nicht die Quelle. UniFi matcht Richtlinien-Regeln über ipsets auf den Destination-IPs. Wenn du versehentlich Quelle und Ziel vertauschst, greift die Regel nicht.
Beide Regeln auf jedem UCG-Ultra anlegen
Die Regeln müssen auf jedem UCG-Ultra separat konfiguriert werden. Sie sind lokal, nicht zentral verwaltbar.
Checkliste
| Was | Wo | Einstellung |
|---|---|---|
| WireGuard-Server | UDM-SE | Port + Tunnel-Netz festlegen |
| Remote-Client-Netzwerke | UDM-SE, pro Client | Filial-Netz eintragen (setzt AllowedIPs + Route) |
| WireGuard-Client | UCG-Ultra | Server-Adresse + Port |
| Inhaltsassistent | UCG-Ultra, WireGuard-Client | 10.10.10.1/32 + 192.168.1.1-254 |
| Richtlinie 1 | UCG-Ultra, Richtlinien-Engine | Extern → Gateway, Quelle: 10.10.10.1/32 |
| Richtlinie 2 | UCG-Ultra, Richtlinien-Engine | Extern → Intern, Ziel: lokales LAN |
Hinweise
- Die AllowedIPs auf dem Client werden über den Inhaltsassistenten in der UniFi-Oberfläche gesteuert. Du bearbeitest sie nicht direkt in einer WireGuard-.conf-Datei.
- Die Richtlinien-Engine heißt in der englischen Oberfläche Traffic & Firewall Rules und befindet sich unter Einstellungen → Sicherheit (bzw. Settings → Security).
- Der WireGuard-Client-Modus baut die Verbindung ausgehend auf und hält sie über Keepalives offen. Solange der UCG-Ultra läuft und Internet hat, steht der Tunnel, auch ohne Portweiterleitung.
Fazit
Das eigentliche Problem ist kein Konfigurationsfehler, sondern eine Designentscheidung in der UniFi-Firmware: WireGuard-Client-Interfaces werden als Extern klassifiziert. Solange Ubiquiti das nicht ändert, sind die zwei Richtlinien-Regeln der einzige Weg zu bidirektionalem Traffic. Einmal eingerichtet, läuft das Setup stabil. Aber man muss erstmal wissen, dass man in der Richtlinien-Engine suchen muss.