UniFi WireGuard Site-to-Site VPN: UCG-Ultra hinter NAT

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

SchrittWirkung
Netzwerk-ÜbersichtÜberblick über Standorte, Netze und Tunnel-IPs
Server-KonfigurationWireGuard-Server mit Routen zu den Filial-Netzen
Client-KonfigurationWireGuard-Client mit korrekten AllowedIPs
Das KernproblemWarum bidirektionaler Traffic nicht funktioniert
Die LösungZwei Richtlinien-Regeln pro UCG-Ultra
ChecklisteKompakte Übersicht aller Einstellungen

Netzwerk-Übersicht

StandortGatewayLAN-NetzWireGuard Tunnel-IP
Hauptstandort (UDM-SE)192.168.1.1192.168.1.0/2410.10.10.1
Filiale A (UCG-Ultra)192.168.50.1192.168.50.0/2410.10.10.2
Filiale B (UCG-Ultra)192.168.60.1192.168.60.0/2410.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

EinstellungenVPNVPN-ServerNeues erstellen
  1. 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)
  2. Speichern mit Hinzufügen

Clients hinzufügen

EinstellungenVPNVPN-ServerServer öffnen
  1. Pro Filiale einen Client anlegen
  2. Beim Erstellen vor dem Speichern die Client-Konfiguration herunterladen (wird später auf dem UCG-Ultra importiert)
  3. Nach dem Speichern auf den erstellten Client klicken
  4. 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 wgsrv1

Ohne 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

EinstellungenVPNVPN-ClientNeues erstellen
  1. Bei Konfigurationsdatei auf Upload klicken und die beim Server-Setup heruntergeladene Config auswählen
  2. Beim Inhaltsassistent den Radio-Button IP auswählen
  3. IP-Adresse hinzufügen: Die Tunnel-Gateway-Adresse eintragen (10.10.10.1), im Feld Anschluss den Wert 32 setzen
  4. IP-Adressbereich hinzufügen: Das Zielnetzwerk eintragen, Starten 192.168.1.1, Beenden 192.168.1.254
  5. Ä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 wgclt1 wird 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.

EinstellungenSicherheitRichtlinien-Engine

Zwei Regeln sind nötig:

Regel 1: Extern → Gateway

Erlaubt dem Hauptstandort, den UCG-Ultra selbst zu erreichen (Management, Routing-Entscheidungen).

EinstellungWert
RichtungExtern → Gateway
AktionErlauben
QuelleIP-Adresse: 10.10.10.1/32
ZielBeliebig

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).

EinstellungWert
RichtungExtern → Intern
AktionErlauben
QuelleBeliebig
ZielNetzwerk: 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

WasWoEinstellung
WireGuard-ServerUDM-SEPort + Tunnel-Netz festlegen
Remote-Client-NetzwerkeUDM-SE, pro ClientFilial-Netz eintragen (setzt AllowedIPs + Route)
WireGuard-ClientUCG-UltraServer-Adresse + Port
InhaltsassistentUCG-Ultra, WireGuard-Client10.10.10.1/32 + 192.168.1.1-254
Richtlinie 1UCG-Ultra, Richtlinien-EngineExtern → Gateway, Quelle: 10.10.10.1/32
Richtlinie 2UCG-Ultra, Richtlinien-EngineExtern → 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.