nftables-Markierungen und VPN-Routing: welche Regel wirklich gewinnt
Eine im Firewall gesetzte Markierung kann die Routingregel trotzdem verfehlen. Prüfen Sie die Maske der Regel, den Objekttyp und die anderen Schreiber, bevor Sie einen vierten hinzufügen.
Eine in nftables gesetzte Markierung soll eine Klasse von Verkehr durch den Tunnel schicken, und der Verkehr verlässt das System weiterhin über die physische Schnittstelle. Das Regelset sieht isoliert betrachtet korrekt aus. Meist ist Folgendes passiert: etwas anderes hat dieselbe Markierung geschrieben, oder die Routingregel passt auf eine Maske, die der neue Wert nicht mehr erfüllt.
Prüfung 1: Lesen Sie die Regel, auf die der Kernel passt
Beginnen Sie mit der Policy-Regel und nicht mit der Firewall. Der Kernel prüft Regeln in Prioritätsreihenfolge, und der erste Treffer entscheidet über die Tabelle. Lesen Sie den fwmark-Wert und die Maske aus der Regel selbst und bestätigen Sie dann, dass ein Paket mit der gesetzten Markierung tatsächlich darauf passt. Eine Regel, die einen vollen 32-Bit-Wert erwartet, passt nicht auf ein Paket, das nur ein einzelnes Bit trägt.
Bestätigen Sie dann, welche Tabelle diese Regel auswählt und was die Tabelle enthält. Eine Regel, die auf eine leere Tabelle zeigt, erzeugt einen fehlgeschlagenen Lookup, was auf vielen Systemen bedeutet, dass das Paket zur nächsten Regel durchfällt und über die physische Schnittstelle hinausgeht.
Zwei Befehle klären das: die Regelliste und der Routen-Lookup für das Ziel in dieser Tabelle.
Prüfung 2: Paketmarkierung oder Verbindungsmarkierung
nftables kann eine Markierung am Paket und eine Markierung am Connection-Tracking-Eintrag setzen, und das sind verschiedene Objekte. Die Paketmarkierung lebt für den Verarbeitungsdurchlauf des Pakets, während die Verbindungsmarkierung für den Flow bestehen bleibt und bewusst kopiert werden muss. Eine zu setzen und die andere zu erwarten, ist ein verbreiteter halber Fix.
Wenn die Routingregel auf der Paketmarkierung beruht, bewirkt das Wiederherstellen der Verbindungsmarkierung später im Pfad nichts für diese Entscheidung, weil die Entscheidung bereits gefallen ist.
Legen Sie fest, welches Objekt das Routingsignal besitzt, und setzen Sie es dann an der Stelle, an der die Routingentscheidung getroffen wird.
Prüfung 3: Wer schreibt diese Markierung noch
Die eigenen Werkzeuge von WireGuard markieren ihre UDP-Pakete, damit der verschlüsselte Transport nicht zurück in den Tunnel geroutet wird, zu dem er gehört. Wenn Ihr Regelset demselben Feld einen unabhängigen Wert zuweist, verschwindet diese Ausnahme, und der äußere Verkehr des Tunnels versucht, in sich selbst einzutreten. Das Symptom ist ein Tunnel, der aufgebaut wird und dann aufhört, Verkehr durchzulassen.
Markierungen werden auch von anderen Firewall-Werkzeugen, von Container-Netzwerken und vom Policy-Routing für andere Zwecke verwendet, daher ist das Schreiben des ganzen Feldes durch zwei Subsysteme ein Konflikt, selbst wenn jedes für sich korrekt ist.
Listen Sie die Schreiber auf, bevor Sie einen weiteren hinzufügen.
Prüfung 4: Die Maske entscheidet, was Sie behalten
Eine Markierung ist ein 32-Bit-Feld, und Masken sind der Weg, wie mehrere Eigentümer es teilen. Ein Setzen mit Maske bewahrt die Bits, die Ihnen nicht gehören; ein Setzen des ganzen Feldes zerstört die aller anderen. Lesen Sie die Maske in jeder Regel, die das Feld berührt, auch in denen, die Sie nicht geschrieben haben.
Dokumentieren Sie die Bitaufteilung neben dem Regelset.
Sonst verwendet die nächste Person einen Wert wieder, der bereits einen Eigentümer hat, und ein Konflikt hier sieht wie ein Routingfehler aus, während er ein Adressierungsfehler ist. Die nftables-Dokumentation zu Paket-Metadaten beschreibt die Markierungsoperationen selbst.
Prüfung 5: Prüfen Sie mit einem echten Flow, nicht mit einem Lookup
Ein einfacher Routen-Lookup trägt keine Markierung, kann also einen anderen Pfad zeigen als das echte Paket. Erzeugen Sie den Verkehr, der Ihnen wichtig ist, und beobachten Sie die Zähler, den Connection-Tracking-Eintrag und die Schnittstelle, über die er tatsächlich hinausgeht. Testen Sie sowohl die eingeschlossene als auch die ausgeschlossene Klasse, denn eine zu breite Markierung zerstört den Ausschluss, während sie erfolgreich aussieht. Wenn die eingeschlossene Klasse funktioniert und die ausgeschlossene Klasse ebenfalls in den Tunnel gelangt, ist die Markierung zu breit und nicht zu schmal.
Vermeiden Sie es, den Verbindungszustand zu leeren, um während einer laufenden Sitzung eine Aktualisierung zu erzwingen, da neue und bestehende Flows legitimerweise verschiedene Pfade nehmen können.
Halten Sie Markierung, Maske und Tabelle an einer Stelle fest, dann wird die nächste Änderung überprüfbar.