Lösung 1:
Einführende Präsentation von Netfilter und conntrack
Zuerst das obligatorische Schema zum Paketfluss in Netfilter und General Networking:
Netfilter ist das Paketfilter-Framework, das sich über den Rest des Netzwerkstapels (dargestellt durch „Routing-Entscheidung“ und andere weiße, abgerundete Kästchenteile) fügt. Netfilter bietet Hooks und APIs für andere Subsysteme und "Clients". Zu diesen Teilen gehört conntrack (der Verbindungstracker) und iptables (oder nftables ). Die Trennung zwischen Netfilter und conntrack ist ziemlich unscharf. Sie können einfach conntrack in Betracht ziehen als integrierter Bestandteil von Netfilter.
In dem Schema, das die verschiedenen Schritte beschreibt, 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) conntrack durchläuft .
An dieser Stelle conntrack wird in seinen eigenen Lookup-Tabellen suchen (eine Mini-Lookup-Datenbank, die im Kernel-Speicher aufbewahrt wird):
- wenn die Eigenschaften dieses Pakets nicht gefunden werden (und wenn es in der Rohtabelle nicht als UNTRACKED deklariert ist), ein neues bidirektionales Conntrack-Tupel Eintrag (Protokoll, dann spezifische Familien- und Protokollinformationen:Anfangsquelle und -port, Anfangsziel und -port, Antwortquelle und -port, Antwortziel und -port (die beiden letzten sind normalerweise umgekehrt, es sei denn, es handelt sich um NAT oder einige seltsame Protokolle wie echo Antwort passender Echo-Request für ICMP)) die den Fluss beschreibt, wird mit dem Zustand NEW erstellt.
- wenn es (in irgendeiner Richtung) mit einem vorherigen Eintrag übereinstimmt und mit dem Zustand dieses Flows kompatibel ist, könnte der Flow-Status geändert werden (z. B.:Änderung von NEW zu ESTABLISHED, wenn dies vorher nicht der Fall war).
- wenn das Paket aus irgendeinem bestimmten Grund nicht mit einem vorhandenen Fluss übereinstimmen kann, obwohl es seine Eigenschaften hat (z. B.:ein spätes TCP-Paket, das nach einer bereits erfolgreichen Neuübertragung empfangen wurde, also außerhalb des Fensters in Bezug auf die Sequenz und SACK ist Werten) wird das Paket mit INVALID gekennzeichnet.
- Es gibt ein paar andere Fälle wie RELATED:Hier geht es um Pakete, die nicht Teil des Flusses selbst sind, aber mit einem neuen Fluss zusammenhängen, der einem anderen bestehenden (dh in der Datenbank) Fluss zugeordnet werden kann. Zwei Beispiele sind ein ICMP-Fehler, der beim Empfang eines Pakets entsteht (z. B.:UDP-Port nicht erreichbar) oder wenn ein spezieller Protokollhelfer wie das Kernelmodul
nf_conntrack_ftp
verwendet wird , das ein Plugin für conntrack ist Subsystem, erkennt, dass ein Paket Teil des separaten Datenflusses ist, der mit den FTP-Befehlen PASV/EPSV oder PORT/EPRT verbunden ist, die auf dem Befehlsfluss (auf Port 21) ausgeführt werden.
Beantwortung der Frage
Nach alledem sind hier die Antworten auf Ihre beiden Punkte:
-
im Hauptnetzwerk-Namespace conntrack beginnt 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 auch, dass ein anderes Subsystem darauf verweist (wie z. B. iptables von OP 's Conntrack-Modul oder einmal mit dem Befehl
conntrack
später beschrieben). Dies ist die Standardeinstellung und ein Paket muss vorher ausdrücklich als UNTRACKED markiert werden der conntrack Subsystem sieht, dass dieses Paket 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 überhaupt die Verwendung von UNTRACKED erfordert, kann immer noch verfügbar sein getan, aber nicht mit iptables . TC oder nftables kann). Um conntrack zu vermeiden Handhabung einiger Pakete, diese Art von iptables Regel 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
Die iptables 's spezifisches Kernelmodul
xt_conntrack
fragt den conntrack ab Subsystem (verwaltet von den verschiedenen relevanten Kernel-Modulennf_conntrack*
) und fragt nach dem Status dieses Pakets in seiner Lookup-Datenbank. Wenn die AntwortRELATED
ist oderESTABLISHED
das Paket stimmt überein und fährt mit dem ACCEPT-Urteil fort. Tatsächlich wird das Ergebnis bereits beim ersten Suchen im Paket zwischengespeichert (normalerweise von conntrack ), also ist dies eine billige "Suche". Dies ist somit eine generische Regel zum Umgang mit bereits zuvor akzeptierten Flüssen. Diese Flows können zunächst in Regeln akzeptiert werden, die ausdrücklich-m conntrack --ctstate NEW
erwähnen oder einfach Regeln, die es nicht erwähnen, aber hinter platziert werden diese generische Regel (aber denken Sie an den INVALID-Zustand, der normalerweise vorher gelöscht werden sollte). -
Hinzufügen eines Aufzählungszeichens:Die Behandlung eingehender Pakete und ausgehender Pakete ist ziemlich symmetrisch zwischen PREROUTING und OUTPUT (auch wenn diese nicht symmetrisch aussehen):conntrack Schnittstellen sowohl in PREROUTING als auch in OUTPUT (und an einigen anderen Stellen, wenn man NAT betrachtet arbeitet mit conntrack , mit Ausnahme des ersten Pakets im Zustand NEW, das iptables durchläuft 's Nat-Tabelle). Dies kann sich geringfügig von der Beschreibung unterscheiden, die Sie über IPFW geschrieben haben. Wenn ein Server, auf dem Anwendungen ausgeführt werden, auch ausgehende Datenströme einschränkt, benötigt er höchstwahrscheinlich dieselben generischen iptables Regel sowohl in filter/OUTPUT als auch in filter/INPUT, um ausgehende Antwortpakete von bereits akzeptiertem eingehendem Datenverkehr passieren zu lassen.
Zusätzliche Informationen
Es gibt spezielle Tools, um mit dem conntrack zu interagieren Nachschlagetabellen des Subsystems von conntrack-tools.
-
conntrack
:zum Abfragen, Löschen oder Aktualisieren des Inhalts der Lookup-Tabellen, die von conntrack verwaltet werden .Einige Beispiele.
Sie können alle verfolgten Einträge (die ohne zusätzlichen Filter groß sein können) auflisten mit:
conntrack -L
Wenn Ihr System NAT ausführt (z. B. ein Router vor einem privaten LAN oder VMs und Container ausführen), können Sie
--any-nat
verwenden ,--src-nat
oder--dst-nat
nur anzeigen bzw. alle NAT, alle Quell-NAT (Maskierung) oder alle Ziel-NAT (normalerweise für weitergeleitete Ports):Echtzeitüberwachung von conntrack Veranstaltungen:
conntrack -E
-
conntrackd
:Ein Daemon, dessen zwei Hauptzwecke (Conntrack) Flow Accounting und Statistik oder Stateful-Firewall-Cluster-State-Synchronisation mit hoher Verfügbarkeit sind.
Lösung 2:
Die Verbindungsverfolgung ist eine separate Funktion von Netfilter und wird nicht mit IPTables konfiguriert.
Auf dem Bild gibt es zwei conntrack
Schritte im INPUT-Pfad und einen im OUTPUT-Pfad. Diese Schritte ordnen einzelne Pakete bestehenden Verbindungen zu, die in der Verbindungsverfolgungstabelle verfolgt werden, oder erstellen neue Verbindungsverfolgungseinträge in der Tabelle.
Die Conntrack-Funktionalität ist ein Linux-Kernel-Modul und ist oft in der Standardkonfiguration im Kernel enthalten.
Der Conntrack-Betrieb kann durch Anpassen von net.netfilter.nf_conntrack
eingestellt werden sysctl-Werte.
Ihre zweite Alternative ist, was passiert. Die Statusinformationen werden von der Conntrack-Funktion aufgezeichnet, und die IPTables-Regel konsultiert einfach die Conntrack-Tabelle für Informationen.