Wann verfolgt das Conntrack-Modul von iptable die Zustände von Paketen?

Wann verfolgt das Conntrack-Modul von iptable die Zustände von Paketen?

Zuerst müssen Zustände gespeichert werden. Bei einer alten BSD-Firewall, die ich verwendet habe und die vermutlich IPFW hieß, habe ich eine Regel festgelegt, die lautete: „Verfolgen Sie den Zustand des ausgehenden Pakets“, und diese wurde in die ausgehende Richtung der Schnittstellen eingefügt. Dann gab es eine weitere Regel in die eingehende Richtung, die sie mit den Zuständen vergleicht, die durch die Regel in der ausgehenden Richtung erstellt wurden. Es gab also zwei Regeln: (1) zum Auffüllen der Zustandstabelle, dies war in der ausgehenden Richtung, und (2) zum Nachschlagen der Zustandstabelle, dies war in der eingehenden Richtung.

Aber mit connntrack sehe ich, dass es auf die INPUT-Kette angewendet wird, beispielsweise mit dieser Regel:

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Da frage ich mich, was diese Aussage eigentlich bewirkt.

  • Bedeutet dies, dass mit der Verfolgung von Paketen begonnen wird, die dieser Regel entsprechen, indem deren Informationen in die Statustabelle eingetragen werden?
  • Oder bedeutet es, dass es bereits über die Statusinformationen verfügt und auf dieser Grundlage gegen eingehende Nachrichten vorgehen wird? (z. B. akzeptieren, wenn sie zu einer zuvor akzeptierten Verbindung gehörten?). Aber wo wurde in diesem Fall die Statustabelle ausgefüllt? Welche Regel tut das? Oder ist sie regellos und implizit?

Antwort1

Einführende Präsentation von Netfilter und Conntrack

Zuerst das obligatorische Schema zum Paketfluss in Netfilter und allgemeinen Netzwerken:

Paketfluss in Netfilter und allgemeinem Networking

Netfilter ist das Paketfilter-Framework, das sich über den Rest des Netzwerkstapels legt (dargestellt durch „Routing-Entscheidung“ und andere weiße, abgerundete Kastenteile). Netfilter bietet Hooks und APIs für andere Subsysteme und „Clients“. Zu diesen Teilen gehörenKontakt(der Verbindungs-Tracker) undiptables(oderNftables). Die Trennung zwischen Netfilter undKontaktist ziemlich schwammig. Man kann einfach überlegenKontaktals integrierter Bestandteil von Netfilter.

In der schematischen Darstellung der verschiedenen Schritte, die ein Paket durchläuft, können Sie sehen, dass das Paket an einem bestimmten Punkt (zwischen raw/PREROUTING und mangle/PREROUTING oder zwischen raw/OUTPUT und mangle/OUTPUT)Kontakt.

An dieser Stelle,Kontaktsucht in seinen eigenen Nachschlagetabellen (einer kleinen Nachschlagedatenbank im Kernelspeicher):

  • Wenn die Eigenschaften dieses Pakets nicht gefunden werden (und wenn es in der Rohtabelle nicht als UNTRACKED deklariert ist), wird ein neuer Conntrack bidirektionalTupelEintrag (Protokoll, dann spezifische Familien- und Protokollinformationen: ursprüngliche Quelle und Port, ursprüngliches Ziel und Port, Antwortquelle und Port, Antwortziel und Port (die letzten beiden sind normalerweise umgekehrt, es sei denn, es sind NAT oder einige seltsame Protokolle beteiligt, wie z. B. Echo-Antwort, die der Echo-Anforderung für ICMP entspricht)), der den Fluss beschreibt, wird mit dem Status NEU erstellt.
  • Wenn es (in beliebiger Richtung) mit einem vorherigen Eintrag übereinstimmt und mit dem Status dieses Flusses kompatibel ist, kann der Flussstatus geändert werden (z. B.: Änderung von NEU zu ETABLIERT, wenn dies zuvor nicht der Fall war).
  • Wenn das Paket aus irgendeinem bestimmten Grund trotz seiner Eigenschaften nicht mit einem vorhandenen Fluss übereinstimmen kann (z. B. ein verspätetes TCP-Paket, das nach einer bereits erfolgreich begonnenen erneuten Übertragung empfangen wurde und sich daher hinsichtlich der Sequenz- und SACK-Werte außerhalb des Zeitfensters befindet), wird das Paket als UNZULÄSSIG gekennzeichnet.
  • es gibt noch ein paar andere Fälle wie RELATED: hier geht es um Pakete, die nicht Teil des Flows selbst sind, sondern mit einem neuen Flow in Zusammenhang stehen, der mit einem anderen bestehenden (d. h. in der Datenbank) Flow verknüpft werden kann. Zwei Beispiele sind ein ICMP-Fehler, der beim Empfangen eines Pakets entsteht (z. B.: UDP-Port nicht erreichbar) oder wenn ein spezieller Protokollhelfer wie das Kernelmodul nf_conntrack_ftp, ein Plugin für dasKontaktDas Subsystem erkennt, dass ein Paket Teil des separaten Datenflusses ist, der mit den FTP-Befehlen PASV/EPSV oder PORT/EPRT verknüpft ist, die im Befehlsfluss (auf Port 21) ausgeführt werden.

Beantwortung der Frage

Nachdem dies alles gesagt ist, sind hier die Antworten auf Ihre beiden Punkte:

  • im Hauptnetzwerk-NamespaceKontaktbeginnt mit der Verfolgung von Verbindungen, sobald seine Module (einschließlich möglicher relevanter protokollspezifischer Untermodule) geladen sind. Für nicht-initiale Netzwerk-Namespaces (Container...) erfordert dies außerdem, dass ein anderes Subsystem darauf verweist (wie etwa OPsiptabless conntrack-Modul oder einmalig den conntrackspäter beschriebenen Befehl). Dies ist die Standardeinstellung und ein Paket muss ausdrücklich als UNTRACKED markiert werden.VorDieKontaktSubsystem sieht es für dieses Paket so, dass es nicht verfolgt wird. Unter Linux gibt es nur wenige Fälle, in denen kein Tracking erforderlich wäre, aber dann sind natürlich Stateful Firewalling und Stateful/Dynamic NAT nicht mehr verfügbar (Steless NAT, das möglicherweise sogar die Verwendung von UNTRACKED erfordert, kann immer noch durchgeführt werden, aber nicht mitiptables.tcoderNftableskönnen). Um zu vermeidenKontakteinige Pakete zu verarbeiten, diese Art voniptablesRegel kann verwendet werden (zB: Port 80/TCP):

    iptables -t raw -A PREROUTING -p tcp --dport 80 -j CT --notrack
    iptables -t raw -A OUTPUT -p tcp --sport 80 -j CT --notrack
    
  • Wenn das Paket Filter/INPUT durchläuft und diese Regel erreicht:

     iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    

    DeriptablesDas spezifische Kernelmodul xt_conntrackfragt dieKontaktSubsystem (das von den verschiedenen relevanten Kernelmodulen verwaltet wird nf_conntrack*) und fragt in seiner Lookup-Datenbank nach dem Status dieses Pakets. Wenn die Antwort lautet RELATEDoder ESTABLISHEDdas Paket übereinstimmt, geht es zum ACCEPT-Urteil über. Tatsächlich ist das Ergebnis bereitszwischengespeichert indas Paketdas erste Mal, dass die Suche durchgeführt wurde (normalerweise durchKontakt), also ist dies ein billiges „Lookup“. Dies ist also eine generische Regel, um bereits zuvor akzeptierte Flows zu handhaben. Diese Flows können zunächst in Regeln akzeptiert werden, die dies explizit erwähnen, -m conntrack --ctstate NEWoder einfach in Regeln, die dies nicht erwähnen, sondern innachdiese allgemeine Regel (denken Sie jedoch an den Status INVALID, der normalerweise gelöscht werden sollte, bevor Sie dies tun).

  • Hinzufügen eines Aufzählungspunkts: Die Handhabung eingehender und ausgehender Pakete ist zwischen PREROUTING und OUTPUT ziemlich symmetrisch (auch wenn diese nicht symmetrisch aussehen):KontaktSchnittstellen sowohl im PREROUTING als auch im OUTPUT (und an einigen anderen Stellen, wenn man bedenktNATarbeitet mitKontakt, mit Ausnahme des ersten Pakets im Status NEW, dasiptables's nat-Tabelle). Dies kann etwas anders sein als die Beschreibung, die Sie über IPFW geschrieben haben. Wenn ein Server, auf dem Anwendungen laufen, auch ausgehende Datenflüsse einschränkt, dann benötigt er höchstwahrscheinlich dieselbe generischeiptablesRegel sowohl im Filter/OUTPUT als auch im Filter/INPUT, um ausgehende Antwortpakete des bereits akzeptierten eingehenden Datenverkehrs passieren zu lassen.


Weitere Informationen

Es gibt spezielle Tools zur Interaktion mit demKontaktNachschlagetabellen des Subsystems ausConntrack-Werkzeuge.

  • conntrack: zum Abfragen, Löschen oder Aktualisieren des Inhalts der Nachschlagetabellen, die vonKontakt.

    Einige Beispiele.

    Sie können alle verfolgten Einträge auflisten (die ohne zusätzlichen Filter groß sein können) mit:

    conntrack -L
    

    Wenn Ihr System NAT verwendet (z. B. ein Router vor einem privaten LAN oder laufende VMs und Container), können Sie oder verwenden --any-nat, um jeweils nur das gesamte NAT, das gesamte Quell-NAT (Masquerade) oder das gesamte Ziel-NAT (normalerweise für weitergeleitete Ports) anzuzeigen:--src-nat--dst-nat

    Echtzeitüberwachung vonKontaktVeranstaltungen:

    conntrack -E
    
  • conntrackd: ein Daemon, dessen zwei Hauptzwecke die Flussabrechnung und Statistik (conntrack) sind, oderHochverfügbarer Stateful-Firewall-ClusterZustandssynchronisierung.

Antwort2

Die Verbindungsverfolgung ist eine separate Funktion von Netfilter und wird nicht mit IPTables konfiguriert.

Bildbeschreibung hier eingeben

In der Abbildung gibt es zwei conntrackSchritte im INPUT-Pfad und einen im OUTPUT-Pfad. Diese Schritte verknüpfen einzelne Pakete mit vorhandenen Verbindungen, die in der Verbindungsverfolgungstabelle verfolgt werden, oder erstellen neue Verbindungsverfolgungseinträge in der Tabelle.

Die Conntrack-Funktionalität ist ein Linux-Kernelmodul und ist häufig in der Standardkonfiguration im Kernel enthalten.

Der Conntrack-Betrieb kann durch Anpassen net.netfilter.nf_conntrackvon Sysctl-Werten optimiert werden.

Ihre zweite Alternative ist das, was passiert. Die Statusinformationen werden von der Conntrack-Funktion aufgezeichnet, und die IPTables-Regel konsultiert einfach die Conntrack-Tabelle für Informationen.

verwandte Informationen