Zum Inhalt springen
EuroVPSEuroVPS

Conntrack, wenn Health Checks bestehen und der Verkehr stoppt

Eine Stateful Firewall entscheidet den Pfad einer Verbindung einmal, bei ihrer Entstehung. Ein langlebiger Flow kann deshalb eine veraltete Entscheidung behalten, während jeder frische Probe besteht.

Von EuroVPS EngineeringDer Maschinenraum

5 Min. Lesezeit
In diesem Artikel 5 Abschnitte
Kurz gesagt
  • Eine Stateful Firewall trifft die Forwarding- und NAT-Entscheidung für eine Verbindung mit deren erstem Paket und hält sie für die Lebensdauer des Flows in der State-Tabelle. Änderungen an Routing und Policy werden auf Flows, die bereits existieren, nicht angewendet.
  • Ein kontinuierlicher Stream wie Syslog über TCP, Datenbankreplikation, ein Metrics Forwarder oder ein Tunnel kann eine Verbindung wochenlang halten. Ändert sich das Netzwerk darunter, behält dieser Flow die alte Entscheidung, während Pings und neue Verbindungen die neue bekommen, und jede Prüfung besteht.
  • Überwachen Sie, was ankommt, nicht, was läuft: Byte-Zähler gegen das erwartete Volumen, Belegung der State-Tabelle und eine Ende-zu-Ende-Prüfung, dass die Daten angekommen sind. Ein eingefrorener Flow wird durch Löschen seines State-Eintrags behoben, nicht durch einen Neustart der Firewall.

Die Entscheidung fällt einmal

Connection Tracking existiert, damit eine Firewall die Policy einmal pro Flow auswertet statt einmal pro Paket. Das erste Paket wird gegen die Regeln geprüft, das Forwarding- und NAT-Ergebnis in die State-Tabelle geschrieben, und jedes spätere Paket dieses Flows ist ein Hash-Lookup. netfilter conntrack, die pf-State-Tabelle in OPNsense und die Connection Table in Cisco Firepower arbeiten alle so. Der Eintrag lebt, bis der Flow schließt oder sein Idle-Timeout abläuft, und für eine etablierte TCP-Verbindung wird dieses Timeout in Tagen gemessen.

Die Konsequenz übersieht man leicht: Eine Änderung am Routing, an einer NAT-Regel oder an einem Interface wirkt auf den nächsten Flow, nicht auf die Flows, die bereits in der Tabelle stehen.

Zwei Wege, auf denen das leise Verkehr verwirft

Der veraltete Pfad. Eine Route ändert sich, ein Interface wandert, ein NAT-Pool wird bearbeitet. Neue Verbindungen nehmen den neuen Pfad. Ein langlebiger Stream behält sein ursprüngliches Egress-Interface oder NAT-Binding, also verlassen seine Pakete das System auf dem alten Weg, in Richtung eines Next Hop, der sie nicht mehr weiterleitet, oder ohne die Übersetzung, die die Gegenseite jetzt erwartet. Der TCP-Stack des Absenders sendet geduldig erneut auf einer Verbindung, die er weiterhin für etabliert hält, der Empfänger sieht nichts, und auf keiner der beiden Seiten ist ein Prozess ausgefallen.

Die volle Tabelle. nf_conntrack_max wird erreicht, meist wegen eines Scanners, eines Clients hinter NAT mit Tausenden kurzer Flows oder langer Timeouts auf einer stark belasteten Maschine. Der Kernel protokolliert eine Zeile und beginnt, das erste Paket neuer Verbindungen zu verwerfen, während bestehende Flows weiterlaufen. Ein Health Check, der eine offene Verbindung wiederverwendet, besteht weiterhin. Nutzer, die neue öffnen, bekommen Timeouts.

Keines von beiden zeigt sich im Prozess-Monitoring. Der Daemon läuft, der Listener ist gebunden, die Regel ist vorhanden.

Warum die Health Checks bestehen

Ein Ping, ein TCP-Connect-Probe und der Pfadsimulator einer Firewall erzeugen jeweils einen neuen Flow oder werten die Policy frisch aus, also erhält jeder die aktuelle, korrekte Entscheidung. Die grüne Anzeige ist wahr, aber für das falsche Objekt. Die Frage an die Firewall lautet nicht, was sie mit einem neuen Paket täte, sondern was sie mit den Flows tut, die sie bereits hält.

TERMINAL
# the live flows from one source, with their state and NAT binding
conntrack -L -s <source>

# how full the table is
sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max

# the kernel's own report of a full table
journalctl -k | grep -i 'nf_conntrack: table full'

Ein Flow, der älter ist als die letzte Routing-Änderung und einen Egress oder eine Übersetzung zeigt, die keine aktuelle Regel erzeugen würde, ist der Eintrag, den Sie sich ansehen müssen.

Was zu überwachen ist

Ankunft, nicht Lebenszeichen. Zeilen pro Minute, die in der Datenbank des Collectors landen, Nachrichten pro Minute am Syslog-Empfänger, eine Replikationsposition, die voranschreitet. Eine flache Linie ist der Alarm, was auch immer der Prozessstatus sagt.

Zähler gegen Erwartung. Der Byte-Zähler auf der Regel, die einen Stream trägt, wächst ungefähr mit der Rate des Streams. Eine Regel, die beschäftigt sein sollte und nahezu flach ist, bedeutet, dass die Pakete auf eine andere Regel treffen oder gar nicht ankommen.

Belegung der State-Tabelle. Alarmieren Sie auf nf_conntrack_count als Anteil von nf_conntrack_max lange bevor sie voll ist, und auf die Table-full-Meldung des Kernels, die sonst ungelesen im Log sitzt.

Synthetische Prüfungen in der Form des echten Verkehrs. Ein Probe, der eine langlebige Verbindung hält und in Abständen einen Datensatz hindurchschiebt, verifiziert am anderen Ende, prüft das, was kaputtgeht. Ein frischer Ping prüft das, was nicht kaputtgeht.

Listen Sie nach jeder Routing- oder NAT-Änderung die Flows auf, die älter sind als die Änderung, und entscheiden Sie bewusst, ob Sie sie leeren.

Die Korrektur ist ein Skalpell

Löschen Sie den State für die betroffene Quelle. Das nächste Paket erzeugt einen frischen Eintrag mit der aktuellen Entscheidung, und der Stream läuft weiter.

TERMINAL
conntrack -D -s <source>

Ein Neustart oder ein vollständiger Flush funktioniert auch, und reißt jede andere lebende Verbindung mit. Bei einer vollen Tabelle besteht die Korrektur darin, nf_conntrack_max zusammen mit der Hash-Größe zu erhöhen, das Established-Timeout zu verkürzen, wo keine Tage nötig sind, und den Client zu finden, der die Flows erzeugt.

Klare Antworten

Warum sagt die Firewall allow, aber es kommt kein Verkehr durch?+

Der Pfadsimulator berechnet, was ein neues Paket bekäme. Ein bestehender Flow ist an die Entscheidung gebunden, die bei seiner Entstehung getroffen wurde, und der Simulator liest die State-Tabelle nicht. Geben Sie die lebenden Flows für diese Quelle aus und vergleichen Sie deren Egress und Übersetzung mit dem, was die aktuellen Regeln erzeugen würden.

Warum funktioniert Ping, während der Stream der Anwendung nicht funktioniert?+

Ping erzeugt kurzlebige Flows, die in Sekunden ablaufen, also erhält jeder eine frische Entscheidung. Der Stream hält einen einzigen langlebigen Flow und behält die Entscheidung, mit der er entstanden ist.

Wie finde ich eine Verbindung, die auf dem falschen Interface feststeckt?+

conntrack -L nach Quelle gefiltert bei netfilter, die Ansicht der State-Tabelle bei pf oder Firepower. Suchen Sie nach Flows, die älter sind als die letzte Netzwerkänderung und deren Egress oder NAT-Binding ihnen keine aktuelle Regel geben würde.

Wie behebe ich es, ohne die Firewall neu zu starten?+

Löschen Sie die State-Einträge für diese Quelle mit conntrack -D. Das nächste Paket wird frisch ausgewertet. Alles andere in der Tabelle bleibt unberührt.

Ein Stream ist verstummt, während jede Prüfung grün ist?

Sprechen Sie mit einem Ingenieur, der die State-Tabelle liest, nicht den Simulator.

Mit einem Ingenieur sprechen

Sie haben das Ende erreicht.

Setzen Sie das Gelesene um

Was betreiben Sie?

Erzählen Sie uns von Workload, Traffic und Anforderungen an die Wiederherstellung. Beginnen Sie mit dem Server-Konfigurator oder besprechen Sie die Details mit einem Ingenieur.

Geschrieben von den Ingenieuren, die die beschriebene Infrastruktur bauen und betreiben.
Mit einem Ingenieur sprechen
XIn

Noch 5 Min.