Wie kann ich bestimmte Regeln aus iptables entfernen?

334

Ich hoste spezielle HTTP- und HTTPS-Dienste an den Ports 8006 bzw. 8007. Ich benutze iptables, um den Server zu "aktivieren"; dh um die eingehenden HTTP- und HTTPS-Ports weiterzuleiten:

iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8006 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8007 -j ACCEPT
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8006 
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8007  
iptables -A OUTPUT -t nat -d 127.0.0.1 -p tcp --dport 80 -j REDIRECT --to-ports 8006
iptables -A OUTPUT -t nat -d 127.0.0.1 -p tcp --dport 443 -j REDIRECT --to-ports 8007 

Das funktioniert wie ein Zauber. Ich möchte jedoch ein anderes Skript erstellen, das meinen Server wieder deaktiviert. dh iptables in dem Zustand wiederherstellen, in dem es sich befand, bevor die obigen Zeilen ausgeführt wurden. Es fällt mir jedoch schwer, die Syntax zum Entfernen dieser Regeln herauszufinden. Das einzige, was zu funktionieren scheint, ist eine vollständige Spülung:

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Dadurch werden aber auch andere unerwünschte iptables-Regeln gelöscht.

Jeroen
quelle
2
Ich habe festgestellt, dass es besser ist, -Ials -Afür ACCEPTLinien zu verwenden. Dies liegt daran, dass in der Regel die letzte Zeile (z. INPUTB. für die Kette) ein DROPoder ist REJECTund Sie möchten, dass Ihre Regel davor steht. -Asetzt die neue Regel nach der letzten Regel, während -Isie am Anfang steht.
Mark Lakata

Antworten:

471

Führen Sie die gleichen Befehle aus, ersetzen Sie jedoch "-A" durch "-D". Zum Beispiel:

iptables -A ...

wird

iptables -D ...
Eli Rosencruft
quelle
7
Wenn Sie mehrere Regeln einer Art haben, werden nicht alle entfernt.
ETech
4
Versuchen Sie, diesen -D-Befehl mehrmals auszuführen, und alle werden gelöscht.
Zhenyu Li
4
Ich habe den gleichen Befehl ausgeführt, aber mit -D anstelle von -I. Aber ich bekomme schlechte Regeln (gibt es eine passende Regel) ...
Ben
4
Wenn Sie eine Regel mit -Ioder hinzugefügt haben -R, können Sie sie trotzdem mit löschen -D.
David Xia
Nur eine Notiz. Ich erstelle eine Regel mit 'iptables -A ...' und die Regel wurde angezeigt, war aber nicht wirksam. Bei Verwendung von 'iptables -D ...' lautete die Antwort " Schlechte Regel" . Trotzdem wurde die Regel gelöscht. Die Regel war mit 'sudo iptables -nvL' sichtbar. Die Kette, die ich benutzte, war 'INPUT'.
Ben Paz
446

Sie können auch die Nummer der Regel ( - Zeilennummern ) verwenden:

iptables -L INPUT --line-numbers

Beispielausgabe:

Chain INPUT (policy ACCEPT) 
    num  target prot opt source destination
    1    ACCEPT     udp  --  anywhere  anywhere             udp dpt:domain 
    2    ACCEPT     tcp  --  anywhere  anywhere             tcp dpt:domain 
    3    ACCEPT     udp  --  anywhere  anywhere             udp dpt:bootps 
    4    ACCEPT     tcp  --  anywhere  anywhere             tcp dpt:bootps

Wenn Sie also die zweite Regel löschen möchten:

iptables -D INPUT 2

Aktualisieren

Wenn Sie (d) eine bestimmte Tabelle (z. B. nat) verwenden, müssen Sie diese dem Löschbefehl hinzufügen (danke an @ThorSummoner für den Kommentar).

sudo iptables -t nat -D PREROUTING 1
domi27
quelle
4
Beide Lösungen sind nett, aber diese funktioniert nicht in einer Skripteinstellung, wenn die Zeilennummer unbekannt ist. Die andere Lösung ist also allgemeiner und daher korrekter, IMO.
Jeroen
2
Nun, wenn Sie die Zeile nicht kennen, können Sie einen Kommentar (wie Antwort unter) verwenden oder einen Grep für Ihre Regel machen:iptables -L INPUT --line-numbers | grep -oP "([0-9]{1,3}).*tcp.*domain" | cut -d" " -f1
domi27
6
Dies ist nur dann in Ordnung, wenn zu keinem Zeitpunkt Regeln in die Tabelle eingefügt werden können. Andernfalls können sich die Zeilennummern zwischen dem Beobachten und dem Ausführen der Löschregel ändern. In einem solchen Fall ist es unsicher anzunehmen, dass das Zeitfenster so kurz ist, dass "es unwahrscheinlich ist, dass es jemals passiert".
Nick
14
Denken Sie daran, dass sich die Zeilennummern des Restes ändern, wenn Sie eine Regel löschen. Also, wenn Sie Regel 5, 10 und 12 löschen müssen ... löschen Sie sie 12, 10, dann 5.
TomOnTime
2
Beim Versuch, PREROUTING-Regeln zu löschen, musste ich angeben -t nat, zB: sudo iptables -t nat --line-numbers -Lund sie auch löschen -t nat, zB: sudo iptables -t nat -D PREROUTING 1(
Kann es
31

Die beste Lösung, die für mich ohne Probleme funktioniert, sieht folgendermaßen aus:
1. Fügen Sie eine temporäre Regel mit einem Kommentar hinzu:

comment=$(cat /proc/sys/kernel/random/uuid | sed 's/\-//g')
iptables -A ..... -m comment --comment "${comment}" -j REQUIRED_ACTION

2. Wenn die Regel hinzugefügt wurde und Sie sie entfernen möchten (oder alles mit diesem Kommentar), gehen Sie wie folgt vor:

iptables-save | grep -v "${comment}" | iptables-restore

Sie löschen also zu 100% alle Regeln, die mit dem $ -Kommentar übereinstimmen, und lassen andere Zeilen unberührt. Diese Lösung funktioniert in den letzten 2 Monaten mit etwa 100 Regeländerungen pro Tag - keine Probleme. Hoffentlich hilft sie

ETech
quelle
2
Falls Sie iptables-save / restore nicht haben:iptables -S | grep "${comment}" | sed 's/^-A //' | while read rule; do iptables -D $rule; done
Mansour
Für eine reale Verwendung: CRON 1) Löschen Sie alte spamhausIptables-Verbote, 2) greifen Sie zu spamhaus.org/drop , 3) greifen Sie nach CIDR- iptables -A INPUT -s $ip_cidr -j -m comment --comment "spamhaus"
IPs
2
@ Mansour Or iptables -S | sed "/$comment/s/-A/iptables -D/e";) so
hek2mgl
@ hek2mgl sed gibt nicht auf, oder? =] Danke, ich werde diese Funktion im Auge behalten (ich werde die Syntax in einem Tag vergessen).
Mansour
sed wird nur verwendet, um "-" aus uuid zu entfernen. In jedem Fall wird es nie vergessen, wenn Sie die Sed-Syntax einmal erhalten haben. ))
ETech
11

Listen Sie zuerst alle iptables-Regeln mit diesem Befehl auf:

iptables -S

es listet auf wie:

-A XYZ -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

Kopieren Sie dann die gewünschte Zeile und ersetzen Sie sie -Adurch -D, um diese zu löschen:

iptables -D XYZ -p ...
Wladdy Lopez
quelle
2
Sei vorsichtig! Dies ist eine unvollständige Antwort. Aus dem Handbuch zu "-S": "Wie jeder andere Befehl von iptables gilt er für die angegebene Tabelle (Filter ist die Standardeinstellung)." Also, im Falle der Verwendung dieses Schalters - sollte für alle Tabellen wiederholt werden: nat, mangle, etc
pmod
1
In meinem Fall bekomme ich iptables: Bad rule (does a matching rule exist in that chain?).jetzt was?
Abdull
Ah, habe es herausgefunden - meinem Löschbefehl fehlte die Tabellenspezifikation. Wenn Sie also alle Regeln aus der Tabelle natmit sudo iptables -S -t natauflisten und eine der zurückgegebenen Regeln löschen möchten, reicht das Kopieren nicht aus. Sie müssen hinzufügen -t nat, z sudo iptables -D ... -t nat.
Abdull
Einfach zu verstehen!
Sknight
5

Verwenden -DBefehl, das ist , wie manSeite erklärt es:

-D, --delete chain rule-specification
-D, --delete chain rulenum
    Delete  one  or more rules from the selected chain.  
    There are two versions of this command: 
    the rule can be specified as a number in the chain (starting at 1 for the first rule) or a rule to match.

Machen Sie sich klar, dass dieser Befehl wie alle anderen Befehle ( -A, -I) für bestimmte Tabellen funktioniert. Wenn Sie nicht an der Standardtabelle ( filterTabelle) arbeiten, -t TABLENAMEgeben Sie diese Zieltabelle an .

Löschen Sie eine übereinstimmende Regel

iptables -D INPUT -i eth0 -p tcp --dport 443 -j ACCEPT

Hinweis: Dadurch wird nur die erste übereinstimmende Regel gelöscht. Wenn viele Regeln übereinstimmen (dies kann in iptables vorkommen), führen Sie dies mehrmals aus.

Löschen Sie eine als Zahl angegebene Regel

iptables -D INPUT 2

Neben dem Zählen der Nummer können Sie die Zeilennummer mit --line-numberParametern auflisten, zum Beispiel:

iptables -t nat -nL --line-number
Cizixs
quelle
Ich fand dieses mit - Zeilennummer ist das Beste
Davuz
Ja! Hervorragend! Ich will nicht ganziptables -F
Dev Anand Sadasivam
2

Angenommen, wenn Sie NAT-Regeln entfernen möchten,

Listen Sie die angehängten IPtables mit dem folgenden Befehl auf:

# sudo iptables -L -t nat -v

Chain PREROUTING (policy ACCEPT 18 packets, 1382 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    7   420 DNAT       tcp  --  any    any     anywhere             saltmaster           tcp dpt:http to:172.31.5.207:80
    0     0 DNAT       tcp  --  eth0   any     anywhere             anywhere             tcp dpt:http to:172.31.5.207:8080

Wenn Sie die nat-Regel aus den IPtables entfernen möchten, führen Sie einfach den Befehl aus.

# sudo iptables -F -t nat -v

Flushing chain `PREROUTING'
Flushing chain `INPUT'
Flushing chain `OUTPUT'
Flushing chain `POSTROUTING'

Dann können Sie überprüfen, ob

# sudo iptables -L -t nat -v
Lakshmikandan
quelle