WireGuard PersistentKeepalive: NAT-Zuordnung am Leben halten
Wenn die Rückverbindung nur direkt nach dem Senden des Peers funktioniert, läuft die Zuordnung ab. Setzen Sie Keepalive hinter dem Router und lesen Sie dann den echten Timeout.
Die Heimbox öffnet den Tunnel und erreicht den Cloud-Server ohne Probleme. Der Cloud-Server kann die Heim-Anwendung noch ein oder zwei Minuten erreichen, nachdem die Heimbox zuletzt etwas gesendet hat, und dann hört es auf. Im WireGuard-Log erscheint nichts, es wird kein Handshake-Fehler gemeldet, und ein Neustart des Tunnels behebt es kurzzeitig. Dieses Muster ist eine ablaufende Zuordnung, kein defekter Tunnel, und das Runbook unten bestätigt es, bevor irgendetwas geändert wird.
Bestätigen Sie, dass das Muster ein Ablauf im Leerlauf ist
Das entscheidende Detail ist der Zeitpunkt. Wenn die Rückverbindung direkt nach dem Senden des Heim-Peers funktioniert und nach einem ruhigen Intervall scheitert, ist der Pfad in Ordnung und der Zustand in der Mitte nicht. Wenn sie nie funktioniert hat, selbst direkt nach Verkehr, ist das die falsche Diagnose.
sudo wg show wg0 latest-handshakes
sudo wg show wg0 endpoints
sudo wg show wg0 transfer
Führen Sie die ersten beiden Befehle direkt aus, nachdem der Heim-Peer etwas gesendet hat, warten Sie fünf Minuten und führen Sie sie erneut aus. Ein Handshake-Zeitstempel, der sich planmäßig erneuert, ohne neuen Endpunkt, sagt Ihnen, dass der Tunnel lebt. Geändert hat sich die Fähigkeit unaufgeforderter Pakete, von außen anzukommen, was eine Eigenschaft des Pfades und nicht des Tunnels ist.
Machen Sie dann einen Rückversuch und beobachten Sie die Übertragungszähler. Wenn die Cloud-Seite Bytes sendet und die Heimseite keine empfängt, hat das Paket die Cloud verlassen und ist unterwegs in einem zustandsbehafteten Gerät gestorben. Das ist die Signatur, nach der Sie suchen. Wenn sich beide Zähler bewegen, hat der Tunnel das Paket zugestellt, und die Anwendung ist verdächtig.
Setzen Sie das Keepalive auf den Peer hinter dem Router
Persistente Keepalives halten eine NAT-Zuordnung und jeden Firewall-Zustand am Leben, indem sie planmäßig ein kleines authentifiziertes Paket senden. Die Einstellung gehört auf die Maschine hinter dem Router, in ihren Eintrag für den entfernten Peer, denn das ist die Seite, deren ausgehendes Paket den Zustand erzeugt.
[Peer]
PublicKey = <cloud peer public key>
AllowedIPs = 10.71.0.1/32
PersistentKeepalive = 25
Fügen Sie sie in den bestehenden Peer-Abschnitt ein. Einen zweiten Block mit demselben öffentlichen Schlüssel hinzuzufügen ist kein gültiger Weg, Optionen hinzuzufügen, und wg-quick wird sie nicht für Sie zusammenführen. Die dokumentierten 25 Sekunden sind ein Beispiel, gewählt, um unter gängigen UDP-Timeouts zu liegen, kein Wert mit besonderer Bedeutung.
Dieselbe Direktive auf der Cloud-Seite zu setzen, hilft bei diesem Problem nicht. Die Pakete dieses Peers kommen bereits von einer öffentlichen Adresse, es gibt also keine Zuordnung zu erhalten, in der Richtung, die zählt. Es fügt Verkehr hinzu und ändert nichts.
Lesen Sie die Timer, statt ein Intervall zu raten
Keepalives funktionieren, weil sie häufiger ankommen, als der Zustand abläuft. Das macht den Timeout zur Zahl, die Sie tatsächlich brauchen, und unter Linux ist er auf dem Gerät lesbar, das die Übersetzung vornimmt:
sysctl net.netfilter.nf_conntrack_udp_timeout
sysctl net.netfilter.nf_conntrack_udp_timeout_stream
sudo conntrack -L -p udp --dport 51820
Der erste Wert ist der Timeout für einen UDP-Fluss, der nur in eine Richtung gesehen wurde, und der zweite gilt, sobald Antworten beobachtet wurden. Beide sind üblicherweise kurz, und eine Zuordnung, die verstummt, folgt dem, was für Ihren Fluss gilt.
Vergleichen Sie diese Zahl mit Ihrem Intervall. Ein Keepalive von 25 Sekunden unter einem Timeout von 30 Sekunden funktioniert; dasselbe Keepalive unter einem Timeout von 15 Sekunden nicht. Keine Menge an Wiederholung ändert diese Arithmetik. Manche Consumer-Router und Mobilfunknetze verwenden viel kürzere Werte als der Linux-Standard, weshalb eine Konfiguration, die in einem Netz funktioniert, in einem anderen scheitert.
| Observation | What it means | Reasonable response |
|---|---|---|
| Works after traffic, dies when idle | Mapping or firewall state expiring | Lower the keepalive interval |
| Never works, even immediately | No return route, listener or firewall | Stop tuning keepalive |
| Works for hours, then dies once | Carrier-side translation or address change | Check the endpoint and logs together |
Prüfen Sie Listener und Firewall getrennt
Eine lebende Zuordnung ist notwendig und nicht ausreichend. Die Anwendung auf der Heimbox muss auf der richtigen Adresse lauschen, und die Host-Firewall muss das Paket nach der Entschlüsselung zulassen.
sudo ss -lntup | grep 8080
sudo wg show wg0 allowed-ips
curl -sS -m 5 http://10.71.0.2:8080/health
Wenn der Socket nur an die Adresse der physischen Schnittstelle gebunden ist und nicht an die Tunneladresse, werden auf dem Tunnel ankommende Pakete verworfen, bevor die Firewall überhaupt befragt wird. Dieser Fehler sieht von der Cloud-Seite identisch aus wie ein Zuordnungsproblem, und er übersteht jede Keepalive-Anpassung.
Die Prüfung der erlaubten Liste ist in der anderen Richtung genauso wichtig. Der Cloud-Peer muss die Heim-Tunneladresse als Quelle zulassen, wenn er antworten soll, und der Heim-Peer muss die Cloud-Adresse als Ziel zulassen. Keepalive-Pakete sind authentifizierter Verkehr und wenden dieselben Regeln an, weshalb ein Keepalive, das zu funktionieren scheint, mit einer Anwendung koexistieren kann, die es nicht tut.
Rollen Sie die Änderung aus und kennen Sie ihre Grenzen
Wenden Sie die Einstellung an, starten Sie die Schnittstelle neu, wenn das Ihre Aktualisierungsmethode ist, und wiederholen Sie dann den Leerlauftest statt des sofortigen Tests. Warten Sie länger als der Timeout, den Sie vorher gelesen haben, stellen Sie eine Rückanfrage und bestätigen Sie, dass sich die Zähler an beiden Enden bewegt haben.
Notieren Sie das Intervall und den gemessenen Timeout daneben. Eine spätere Änderung der Router-Firmware oder ein Wechsel auf eine Mobilfunkverbindung kann den Timeout verändern. Die Notiz ist das, was jemandem erlaubt, den Wert erneut abzuleiten, statt ihn zu kopieren. Zwei Zahlen in einer Zeile sparen später eine ganze Untersuchung.
Persistente Keepalives schützen Zustand. Sie öffnen keinen Port, sie fügen keinen Eintrag in die erlaubte Liste ein, und sie lassen keinen Listener erscheinen. Wenn die Rückverbindung überhaupt nicht funktioniert, liegt der Fehler in einem dieser drei, und der WireGuard-Schnellstart beschreibt die Keepalive-Einstellung in denselben engen Begriffen.