411 Stimmen

Wie kann ich bestimmte Regeln aus iptables entfernen?

Ich hoste spezielle HTTP- und HTTPS-Dienste auf den Ports 8006 bzw. 8007. Ich verwende iptables, um den Server zu "aktivieren", d.h. 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 weiteres Skript erstellen, das meinen Server wieder deaktiviert, d. h. iptables in den Zustand zurückversetzt, in dem es sich vor dem Ausführen der obigen Zeilen befand. Es fällt mir jedoch schwer, die Syntax zum Entfernen dieser Regeln herauszufinden. Das einzige, was zu funktionieren scheint, ist ein kompletter Flush:

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 iptables-Regeln gelöscht, was unerwünscht ist.

579voto

Eli Rosencruft Punkte 6944

Führen Sie dieselben Befehle aus, aber ersetzen Sie das "-A" durch "-D". Zum Beispiel:

iptables -A ...

wird

iptables -D ...

537voto

domi27 Punkte 6623

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

iptables -L INPUT --line-numbers

Beispielhafte Ausgabe :

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 streichen möchten:

iptables -D INPUT 2

Update

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

sudo iptables -t nat -D PREROUTING 1

39voto

ETech Punkte 1518

Die beste Lösung, die bei mir ohne Probleme funktioniert, sieht so 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 und Sie möchten es zu entfernen (oder alles mit diesem Kommentar), tun:

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 seit 2 Monaten mit etwa 100 Regeländerungen pro Tag - ohne Probleme.

36voto

Wladdy Lopez Punkte 465

Listen Sie zunächst 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 einfach -A mit -D um das zu löschen:

iptables -D XYZ -p ...

18voto

cizixs Punkte 11153

Utilice -D Kommando, so geht es man Seite 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.

Realisieren Sie dieser Befehl, wie alle anderen Befehle( -A , -I ) funktioniert auf bestimmten Tischen. Wenn Sie nicht mit der Standardtabelle arbeiten ( filter Tabelle), verwenden Sie -t TABLENAME um diese Zieltabelle anzugeben.

Löschen Sie eine Regel zur Übereinstimmung

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

Hinweis: Dies löscht nur die erste übereinstimmende Regel. Wenn viele Regeln zutreffen (was in iptables vorkommen kann), führen Sie dies mehrmals aus.

Löschen einer als Nummer angegebenen Regel

iptables -D INPUT 2

Anstatt die Nummer zu zählen, können Sie die Zeilennummer mit --line-number Parameter, zum Beispiel:

iptables -t nat -nL --line-number

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X