Jak mogę usunąć określone reguły z iptables?

Hostuję specjalne usługi HTTP i HTTPS odpowiednio na portach 8006 i 8007. Używam iptables do "aktywacji" serwera; tzn. do przekierowania przychodzących portów HTTP i HTTPS:

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 
To działa jak urok. Chciałbym jednak utworzyć kolejny skrypt, który ponownie wyłącza mój serwer; tj. przywrócić iptables do stanu, w którym był przed uruchomieniem powyższych linii. Jednak mam trudności z wymyśleniem składni, aby usunąć te zasady. Jedyne, co wydaje się działać, to Pełny kolor:
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

Ale to również usunie inne reguły iptables, które są niepożądane.

Author: alexwlchan, 2012-04-17

6 answers

Wykonaj te same polecenia, ale zamień " - A "na"- D". Na przykład:

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

Staje się

iptables -D INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
 381
Author: Eli Rosencruft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-17 19:04:26

Można również użyć numeru reguły (--line-numbers):

iptables -L INPUT --line-numbers

Przykładowe wyjście:

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

Więc jeśli chcesz usunąć drugą zasadę:

iptables -D INPUT 2

Update

Jeśli używasz (d) konkretnej tabeli (np. nat), musisz dodać ją do polecenia delete (thx do @ThorSummoner za komentarz)

sudo iptables -t nat -D PREROUTING 1
 382
Author: domi27,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 08:01:59

Najlepsze rozwiązanie, które działa dla mnie bez żadnych problemów wygląda tak:
1. Dodaj tymczasową regułę z komentarzem:

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

2. Gdy reguła dodana i chcesz ją usunąć (lub wszystko z tym komentarzem), zrób:

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

Więc w 100% usuniesz wszystkie reguły pasujące do $comment i pozostawisz inne linie nietknięte. To rozwiązanie działa przez ostatnie 2 miesiące z około 100 zmianami zasad dziennie - bez problemów.Hope, it helps

 27
Author: ETech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-23 11:09:38

Pierwsza lista wszystkich reguł iptables za pomocą tego polecenia:

iptables -S
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

Następnie skopiuj konkretną regułę, którą chcesz usunąć.

Na koniec usuń regułę tym poleceniem:

iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
 3
Author: Wladdy Lopez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-21 21:54:38

Użyj polecenia -D, tak to wyjaśnia strona man:

-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.

Wykonaj to polecenie, podobnie jak wszystkie inne polecenia(-A, -I) działa na pewnym stole. Jeśli nie pracujesz nad domyślną tabelą (filter table), użyj -t TABLENAME, aby określić tę tabelę docelową.

Usuń regułę, aby dopasować

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

Uwaga: to usuwa tylko pierwszą dopasowaną regułę. Jeśli masz wiele dopasowanych reguł(może się to zdarzyć w iptables), uruchom to kilka razy.

Usuń regułę określona jako liczba

iptables -D INPUT 2

Poza zliczaniem liczby można wypisać numer linii z parametrem --line-number, na przykład:

iptables -t nat -nL --line-number
 2
Author: cizixs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-07 09:32:50

Załóżmy, że jeśli chcesz usunąć reguły NAT,

Lista dołączonych IPtables za pomocą polecenia poniżej,

# 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

Jeśli chcesz usunąć regułę nat z IPtables, po prostu wykonaj polecenie

# sudo iptables -F -t nat -v

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

Wtedy możesz to zweryfikować,

# sudo iptables -L -t nat -v
 0
Author: lakshmikandan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-28 11:26:34