
Ich habe eine Reihe von Skripten entwickelt, die ich zur Netzwerküberwachung, -steuerung usw. entwickelt habe. In diesen Skripten erstelle ich unter anderem eine iptables-Kette wie iptables -N mychain
. Dann füge ich nach Bedarf Regeln in die Haupttabellen ein, um Pakete für den von mir gewünschten Zweck in meine benutzerdefinierte Kette zu bringen.
Meine Frage ist: Ich habe ein Skript, das eine „Aktualisierung“ durchführt – mit anderen Worten, es entfernt alle Regeln und beginnt von vorne. Das ist nützlich, wenn irgendwelche seltsamen Anomalien auftreten. Die Leute verwalten iptables oft noch manuell, selbst wenn es etwas gibt, das einen Teil davon verwaltet. (Aus diesem Grund wollte ich, dass meine gesamte Arbeit in einer separaten Tabelle erledigt wird.)
Wenn ich meine Kette löschen möchte, ist das einfach: iptables -F mychain
. Aber was ichnichtIch weiß, wie das geht, indem ich alle Regeln entferne, die ich möglicherweise erstellt habe und die auf diese Kette in den integrierten Ketten (INPUT, OUTPUT usw.) verweisen.
Nehmen wir an, es gab einen Fehler in meiner App oder ein Benutzer hat die Tabellen manipuliert und dadurch die Regel zweimal zur INPUT-Kette hinzugefügt. Jetzt durchlaufen die Pakete die Kette zweimal – werden zweimal gezählt, zweimal weitergeleitet usw.
Die offensichtliche Lösung hierfür besteht darin, die Hauptketten durchzugehen und alle Regeln zu entfernen, deren Sprungziel meine benutzerdefinierte Kette ist. Aber ich weiß nicht, wie das geht.
Hier ist ein Beispiel für eine Worst-Case-Situation, die wir einrichten könnten:
iptables -N TEST
iptables -A INPUT -j TEST
iptables -I INPUT 1 -p tcp --dport 1234 -j TEST
iptables -I INPUT 1 -p tcp --dport 1234 -j TEST # again, for doubling error
iptables -I INPUT -p icmp -j TEST
Nehmen wir an, dass ein skrupelloser oder uninformierter Administrator die drei untersten Regeln erstellt hat.
Ich könnte jetzt also eine Regel erlassen iptables -D INPUT -j TEST
und die von mir erstellte Regel würde verschwinden. Die anderen Regeln würden jedoch nicht gelöscht, da die Parameter bei der Verwendung -D
übereinstimmen müssen. Selbst wenn ich meine eigene Regel also sorgfältig entferne, könnten die Pakete aus verschiedenen Gründen trotzdem mehr als einmal dort landen.
Das Leeren der Hauptketten ist nicht unbedingt angebracht. Auch hier ist die Verwendung von iptables in der Befehlszeile üblich (ich mache das selbst ständig), also einfach blindes LeerenjedenEine Regel könnte etwas löschen, das jemand aus gutem Grund hinzugefügt hat, selbst wenn es sich um eine temporäre Regel handelt.
Die offensichtliche Lösung ist, irgendwie zu entfernenbeliebigRegel, deren Ziel die TEST
Kette ist, und entferne diese Regeln. Ich habe jedoch auf der Manpage von iptables keine Befehle gesehen, mit denen dies möglich wäre.
Das Nächstliegende, was ich von einem beliebigen Benutzer sehen konnte, ist iptables -S
. Ich könnte iptables -S
einen Parser erstellen und verwenden, um die Ausgabe zu interpretieren, aber das ist ein bisschen mehr Arbeit. Ich habe mich nur gefragt, ob es eine korrektere Möglichkeit gibt, Regeln mit einer Art Platzhalter zu löschen. Entfernen Sie erneut alle Regeln, deren Sprungziel die von mir gewünschte Kette ist.
Eine ähnliche Situation kann auftreten, wenn ich eine Kette habe, die ich loswerden möchte, die aber an einer anderen Stelle einen Verweis enthält. Ich möchte herausfinden können, wo sich dieser Verweis befindet, und ihn höchstwahrscheinlich auch löschen.
Ist das möglich? Oder muss ich am Ende einen Parser schreiben, um die iptables -S
Ausgabe zu interpretieren?
Antwort1
Dies sollte ziemlich einfach sein. Verwenden Sie iptables-save, um den aktuellen Regelsatz in eine Datei oder auf Standardausgabe zu schreiben, entfernen Sie alles mit -j YOURCHAIN
und laden Sie das Ergebnis mit iptables-restore zurück.
Dies ist verlockend, als Rohr zu tun
iptables-save | grep -v -- '-j YOURCHAIN' | iptables-restore
Ich bin mir jedoch nicht sicher, ob das gleichzeitige Ausführen von Speichern und Wiederherstellen gut funktionieren würde. Es wäre sicherer, das Speichern vom Wiederherstellen zu trennen. Es wird einen kleinen kritischen Bereich geben, in dem eine dazwischenliegende Aktualisierung des Regelsatzes verloren gehen würde.
Antwort2
Ich glaube nicht, dass es eine einfache Lösung für dieses Problem gibt, außer vielleicht die gesamte Konfiguration neu zu laden.
Sie sollten vielleicht darüber nachdenken, Ihrer Kette eine Drop-Policy hinzuzufügen. Auf diese Weise verursacht es zumindest bei weniger gewissenhaften Benutzern Probleme und provoziert vielleicht einige Diskussionen.
Wenn Sie die Ausgabe verschiedener Befehle analysieren müssen, ist --line-num aus technischer Sicht möglicherweise hilfreich. Denken Sie jedoch daran, in umgekehrter Reihenfolge (von hoch nach niedrig) zu löschen, damit sich der Index nicht jedes Mal ändert.
Antwort3
Wenn Sie erweiterte Manipulationen benötigen iptables
, eine ausgezeichnete Python-Bibliothekhttp://ldx.github.io/python-iptables/könnte einen Blick wert sein. Es bietet eine Programmierschnittstelle (sowohl Lesen als auch Ändern) für netfilter
. Die Interoperabilität mit iptables
wird durch die Verwendung der iptables
C-Bibliotheken ( libiptc
, libxtables
, und die iptables
Erweiterungen) erreicht, nicht durch Aufrufen der iptables
Binärdatei und Analysieren ihrer Ausgabe.