Ich muss iptables eine Regel hinzufügen, um Verbindungen zu einem TCP-Port aus dem Internet zu blockieren.
Da mein Skript möglicherweise mehrmals aufgerufen wird und es kein Skript zum Löschen der Regel gibt, möchte ich vor dem Einfügen überprüfen, ob bereits eine iptables-Regel vorhanden ist. Andernfalls enthält die INPUT-Kette viele Dup-Regeln.
Wie kann ich überprüfen, ob bereits eine iptables-Regel existiert?
Antworten:
-C --check
In den letzten iptables-Versionen gibt es eine neue Option.Für ältere iptables-Versionen würde ich den Garrett-Vorschlag verwenden:
quelle
Die neue
-C
Option ist nicht zufriedenstellend, da sie für eine TOCTTOU-Rennbedingung (Time-of-Check-to-Time-of-Use) offen ist. Wenn zwei Prozesse versuchen, dieselbe Regel ungefähr zur selben Zeit hinzuzufügen,-C
werden sie nicht davor geschützt, sie zweimal hinzuzufügen.Es ist also wirklich nicht besser als die
grep
Lösung. Ein genauer Textverarbeitungsjob über die Ausgabe voniptables-save
kann genauso zuverlässig arbeiten-C
, da diese Ausgabe eine zuverlässige Momentaufnahme des Status der Tabellen ist.Was benötigt wird, ist eine
--ensure
Option, die eine Regel atomar prüft und nur hinzufügt, wenn sie noch nicht existiert. Außerdem wäre es schön, wenn die Regel an die richtige Position verschoben würde, an der eine neue Regel eingefügt würde, wenn sie noch nicht vorhanden wäre (--ensure-move
). Wenn beispielsweiseiptables -I 1
zum Erstellen einer Regel am Anfang einer Kette verwendet wird, diese Regel jedoch bereits an der siebten Position vorhanden ist, sollte die vorhandene Regel an die erste Position verschoben werden.Ohne diese Funktionen besteht meiner Meinung nach eine praktikable Problemumgehung darin, eine Shell-Skriptschleife zu schreiben, die auf diesem Pseudocode basiert:
Dieser Code könnte sich drehen; Dies garantiert nicht, dass zwei oder mehr Fahrer innerhalb einer festgelegten Anzahl von Iterationen ausfallen. Einige randomisierte exponentielle Backoff-Schlafzustände könnten hinzugefügt werden, um dies zu unterstützen.
quelle
Dies mag ein bisschen rückwärts erscheinen, aber es funktioniert bei mir. Versuchen Sie zuerst, die Regel zu löschen.
iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP;
Sie sollten eine Nachricht erhalten, die der folgenden ähnelt:
iptables: Bad rule (Gibt es in dieser Kette eine passende Regel?)
Dann fügen Sie einfach Ihre Regel wie gewohnt hinzu:
iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP;
quelle
Einfach auflisten und danach suchen?
... oder aber Sie haben die Regel angegeben. Wenn Sie es verwenden
grep -q
, wird nichts ausgegeben, und Sie können einfach den Rückgabewert mit überprüfen$?
quelle
iptables-save|grep $ip
stattdessen vorschlagen, da es ein einfacher zu analysierendes Format ist, insbesondere in einem Skript. Sie können auch die genaue Syntax des Befehls überprüfen, wenn Sie möchten.iptables-save|grep $ip
sehr gut mehrere Regeln übereinstimmen könnten . Möglicherweiseiptables-save
könnte die vollständige Regelspezifikation überprüft werden , aber das ist immer noch ein bisschen hackig: Das von zurückgegebene Format stimmtiptables-save
möglicherweise nicht genau mit der Regel im Skript überein.iptables-save
kann die Optionen in einer anderen Reihenfolge generieren, Dinge (wie-m tcp
) hinzufügen und so weiter.iptables --list
versucht wird, bekannte Ports aufzulösen. Stellen Sie dies sicher, bevor Sie nach einem Port suchen.Wie wäre es, wenn Sie zuerst Duplikate hinzufügen und dann entfernen, wie in https://serverfault.com/questions/628590/duplicate-iptable-rules beschrieben . Am einfachsten (für benachbarte Zeilen) scheint es zu sein
quelle
Fügen Sie die folgende Zeile hinzu, um doppelte Regeln aus Ihrem Skript zu vermeiden.
Wenn der obige Befehl zum ersten Mal ausgeführt wird, wird die folgende Meldung angezeigt
Dies ist nur zur Information. Die zweite Hälfte des Befehls würde jedoch sicherstellen, dass die Regel hinzugefügt wird.
quelle