Zwei gesunde VPN-Ausgänge, ein langer Upload, der bereits läuft, und die Anforderung, dass die nächste Verbindung den anderen Tunnel nutzt. Dafür gibt es zwei Wege, und nur einer davon ist auf einem produktiven Gateway sicher. Der Tausch der Standardroute verschiebt jedes Paket, auch die des Uploads. Ein geplantes Drain ändert die Wahl für neue Verbindungen und lässt die verfolgten Flüsse auf dem Pfad, auf dem sie begonnen haben.

Zwei Wege, einen Ausgang zu wechseln

Der Routentausch ist ein Befehl und in Sekunden rückgängig zu machen, weshalb er bei Störungen verwendet wird. Er ist auch unterschiedslos: Pakete des bestehenden Uploads verlassen plötzlich einen anderen Tunnel, mit einer anderen öffentlichen Quelladresse und separatem Übersetzungszustand.

Verfolgt die Gegenseite Flüsse nach Quelladresse, wird der Upload womöglich einfach nicht mehr erkannt. Das Drain vermeidet das, indem es die Entscheidung einmal pro Verbindung trifft und speichert, sodass der alte Upload seinen Ausgang behält, bis er fertig ist. Das ist der ganze Wert der Übung: Die Gegenseite sieht keine Änderung, die sie deuten müsste. Sie erhält weiter Pakete, die zu der Verbindung passen, die sie bereits kennt.

Der Preis ist Komplexität: zwei Routingtabellen, ein Klassifizierer, der am richtigen Hook läuft, und Markierungen, die mit allem anderen auf der Maschine abgestimmt werden müssen, was sie nutzt.

Geben Sie jedem Ausgang seine eigene Tabelle

Reservieren Sie eine Routingtabelle pro Ausgang und unterschiedliche Markierungswerte oder Bits für die beiden Optionen. Jede Tabelle braucht die zu ihrer Rolle passenden Routen, nicht nur einen Namen, und sie braucht ein bewusstes Fehlerergebnis für den fehlenden Fall. Eine leere Tabelle, die still in die Haupttabelle durchfällt — so verlässt Verkehr einen Ausgang, den niemand gewählt hat.

ip rule add fwmark 0x10/0x10 table 101
ip rule add fwmark 0x20/0x20 table 102
ip route add default via 192.0.2.1 dev wg-a table 101
ip route add default via 198.51.100.1 dev wg-b table 102

Setzen Sie ans Ende jeder Tabelle eine Blackhole-Route, damit eine Suche ohne Treffer laut scheitert, statt zu einem Standard zu entweichen, den Sie nicht gewählt haben.

Wählen Sie einmal, beim ersten Paket

Klassifizieren Sie, nachdem es Verbindungsverfolgung gibt und bevor die entscheidende Routensuche stattfindet. Für eine neue, unklassifizierte LAN-Verbindung wählen Sie den Ausgang und speichern ihn im Verbindungszustand. Bei späteren Paketen stellen Sie den gespeicherten Wert in der Paketmarkierung wieder her, die das Policy-Routing liest.

Der feine Punkt ist, was neu bedeutet. Conntrack kann für frühe Pakete und Neuübertragungen noch NEW melden, bevor eine Antwort zu sehen ist, sodass ein Klassifizierer, der nur auf diesen Zustand schaut, eine bereits getroffene Wahl überschreiben kann. Prüfen Sie, dass für die Verbindung kein Ausgang gespeichert ist, bevor Sie einen zuweisen.

nftables hält Paket- und Verbindungsmarkierungen getrennt, und die Anleitung zu Metainformationen dokumentiert die ausdrückliche Kopie zwischen ihnen. Eine Verbindungsmarkierung wird nicht von selbst zur Paketmarkierung, auf die Ihre Regel passt, und das ist der häufigste Grund, warum ein sorgfältig geschriebener Klassifizierer keine Wirkung hat.

Begrenzen Sie die Wiederherstellung auf die Richtung und den Verkehr, den Sie meinen. Eine Internet-Ausgangsmarkierung auf Rückspakete anzuwenden, kann Antworten zum Ausgang statt zum LAN schicken, und das Symptom ist eine einseitige Verbindung, die wie ein Firewallproblem aussieht. Lesen Sie den Antwortpfad, bevor Sie eine Firewallregel anfassen, denn das Paket wird geroutet, nur nicht zurück zum Absender.

Vier Phasen eines Drains

  1. Bereiten Sie B vor, ohne A anzufassen: Routing, Weiterleitung, Autorisierung, NAT und Rückweg. Installieren Sie seine Tabelle und Auswahlrichtlinie über den bestehenden Konfigurationseigentümer des Gateways.

  2. Schalten Sie den Klassifizierer um, sodass neue, unklassifizierte Verbindungen B wählen, während gespeicherte Wahlen erhalten bleiben. Eine atomare nftables-Transaktion vermeidet ein Fenster, in dem alter Zustand gelöscht werden muss.

  3. Lassen Sie A laufen, während seine Flüsse fertig werden. Seine Schnittstelle, Tabelle, der entfernte Ausgang und die NAT-Zuordnungen sind weiterhin Teil dieser Flüsse, und das Bearbeiten einer NAT-Regel baut bestehende Bindungen nicht neu auf.

  4. Nehmen Sie A außer Betrieb, wenn die Drain-Bedingung erfüllt ist, beurteilt nach Verbindungszustand und Anwendungsverhalten statt nach einem einzelnen ruhigen Intervall.

Was ein Drain nicht versprechen kann

Eine Browseranfrage ist keine neue Transportverbindung; das Pooling schickt Anfragen weiterhin über die alte. Umgekehrt kann ein UDP-Fluss aus conntrack altern, und ein späteres Paket wird frisch klassifiziert. Das Drain folgt verfolgten Flüssen, nicht der Vorstellung einer Anwendung von einer Sitzung.

Fällt A aus, bevor seine Flüsse fertig sind, rettet die gespeicherte Markierung sie nicht. Sie verbinden sich über B neu, oder sie verbinden sich gar nicht neu. Ein geplantes Drain kauft Kontinuität, solange der ursprüngliche Pfad gesund ist; es ist keine Zustandsreplikation zwischen unabhängigen Ausgängen.

Prüfen Sie beide Hälften

Starten Sie vor der Änderung eine langlebige erlaubte Verbindung und danach eine wirklich neue. Bestätigen Sie, welchen Tunnel jede nutzt und welche öffentliche Quelladresse die Gegenseite sieht, und prüfen Sie dann, dass der Rückverkehr zurückkommt.

Leeren Sie nicht die conntrack-Tabelle, damit die neue Wahl sichtbar wird. Das zerstört genau den Zustand, den das Drain bewahren soll, und macht aus einer kontrollierten Migration einen Ausfall mit sauber wirkendem Test.

Ähnliche Artikel