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

334

Hostuję specjalne usługi HTTP i HTTPS odpowiednio na portach 8006 i 8007. Używam iptables do „aktywacji” serwera; tzn. aby skierować przychodzące porty 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; tzn. przywróć iptables do stanu, w jakim był przed uruchomieniem linii powyżej. Mam jednak trudności z ustaleniem składni, aby usunąć te reguły. Wydaje się, że jedyne, co działa, to całkowity 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 spowoduje to również usunięcie innych reguł iptables, co jest niepożądane.

Jeroen
źródło
2
Odkryłam, że lepiej jest używać -Izamiast -Ana ACCEPTlinii. Wynika to z tego, że zazwyczaj ostatnia linia (na INPUTprzykład łańcuch) to a DROPlub REJECTchcesz, aby reguła była wcześniejsza. -Aumieszcza nową regułę po ostatniej regule, podczas gdy -Iumieszcza ją na początku.
Mark Lakata

Odpowiedzi:

471

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

iptables -A ...

staje się

iptables -D ...
Eli Rosencruft
źródło
7
Jeśli masz kilka zasad, nie usuniesz ich wszystkich.
ETech
4
spróbuj wykonać to polecenie -D wiele razy, a usunie je wszystkie.
Zhenyu Li
4
Wykonałem to samo polecenie, ale z opcją -D zamiast -I. Ale dostaję ZŁĄ ZASADĘ (czy istnieje reguła dopasowania) ...
Ben
4
Jeśli dodałeś regułę za pomocą -Ilub -R, nadal możesz ją usunąć za pomocą -D.
David Xia
Tylko uwaga. Tworzę regułę za pomocą „iptables -A ...” i reguła pojawiła się, ale nie była skuteczna. Po użyciu „iptables -D ...” odpowiedzią była Zła reguła . Mimo to reguła została usunięta. Reguła była widoczna w przypadku „sudo iptables -nvL”. Łańcuch, którego użyłem, to „WEJŚCIE”.
Ben Paz
446

Możesz także użyć numeru reguły ( --line-numbers ):

iptables -L INPUT --line-numbers

Przykładowe dane wyjściowe:

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ą regułę:

iptables -D INPUT 2

Aktualizacja

Jeśli używasz (d) konkretnej tabeli (np. Nat), musisz dodać ją do polecenia delete (dzięki za komentarz do @ThorSummoner w celu komentarza)

sudo iptables -t nat -D PREROUTING 1
domi27
źródło
4
Oba rozwiązania są dobre, ale to nie będzie działać w ustawieniach skryptu, gdy numer linii jest nieznany. Zatem drugie rozwiązanie jest bardziej ogólne, a zatem bardziej poprawne, IMO.
Jeroen,
2
Cóż, jeśli nie znasz wiersza, możesz użyć komentarza (na przykład odpowiedzi wśród) lub zrobić grep dla swojej reguły:iptables -L INPUT --line-numbers | grep -oP "([0-9]{1,3}).*tcp.*domain" | cut -d" " -f1
domi27,
6
Jest to w porządku tylko wtedy, gdy w tabeli nie można wstawić reguł w dowolnym momencie. W przeciwnym razie numery linii mogą się zmieniać między ich obserwowaniem a wykonaniem reguły usuwania. W takim przypadku nie jest bezpieczne zakładanie, że okno czasowe jest tak krótkie, że „jest mało prawdopodobne”.
Nick
14
Pamiętaj, że jeśli usuniesz jedną regułę, numery pozostałych linii ulegną zmianie. Więc jeśli musisz usunąć regułę 5, 10 i 12 ... usuń je 12, 10, a następnie 5.
TomOnTime
2
Próbując usunąć reguły PREROUTING musiałem określić -t natnp .: sudo iptables -t nat --line-numbers -Li usunąć je -t natrównież np .: sudo iptables -t nat -D PREROUTING 1(Czy warto dodać do odpowiedzi?)
ThorSummoner
31

Najlepsze rozwiązanie, które działa dla mnie bez żadnych problemów, wygląda następująco:
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 zostanie dodana i chcesz ją usunąć (lub wszystko z tym komentarzem), wykonaj:

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

Tak więc w 100% usuniesz wszystkie reguły, które pasują do komentarza $ i pozostawisz inne wiersze nietknięte. To rozwiązanie działa przez ostatnie 2 miesiące przy około 100 zmianach zasad dziennie - bez problemów. Mam nadzieję, że pomaga

ETech
źródło
2
W przypadku, gdy nie masz iptables-save / restore:iptables -S | grep "${comment}" | sed 's/^-A //' | while read rule; do iptables -D $rule; done
Mansour
Do użytku w rzeczywistości: CRON 1) usuń stare spamhausbany iptables, 2) zgarnij spamhaus.org/drop , 3) grep dla CIDR IP iiptables -A INPUT -s $ip_cidr -j -m comment --comment "spamhaus"
Xeoncross 15.01.2015
2
@Mansour Or iptables -S | sed "/$comment/s/-A/iptables -D/e";) lubię to
hek2mgl
@ hek2mgl sed nie poddaje się, prawda? =] Dzięki, będę pamiętać o tej możliwości (zapomnę o składni za dzień).
Mansour,
sed służy do usuwania „-” z UUID. W każdym razie, kiedy już uzyskasz składnię sed - nigdy tego nie zapomnisz. ))
ETech
11

Najpierw wypisz wszystkie reguły iptables za pomocą tego polecenia:

iptables -S

zawiera listę takich jak:

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

Skopiuj żądaną linię i po prostu wymienić -Asię -Dusunąć, że:

iptables -D XYZ -p ...
Wladdy Lopez
źródło
2
Być świadomym! To jest niepełna odpowiedź. Z podręcznika na temat „-S”: „Jak każda inna komenda iptables, ma ona zastosowanie do określonej tabeli (filtr jest domyślny).”. Tak więc, w przypadku korzystania z tego przełącznika - należy powtórzyć dla wszystkich tabel: nat, mangle itp.
pmod
1
W moim przypadku otrzymuję iptables: Bad rule (does a matching rule exist in that chain?).Co teraz?
Abdull
Ach, rozgryzłem to - w moim poleceniu usuwania brakowało specyfikacji tabeli. Tak więc w przypadku, gdy lista wszystkich reguł z tabeli natz sudo iptables -S -t nati chcesz usunąć jeden z powracających zasad, kopiowanie nie jest wystarczające. Musisz dodać -t natnp sudo iptables -D ... -t nat.
Abdull
Łatwy do zrozumienia!
sknight
5

Użyj -Dpolecenia, tak manwyjaśnia strona:

-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, tak jak wszystkie inne polecenia ( -A, -I) działają na określonej tabeli. Jeśli nie pracujesz nad domyślną tabelą ( filtertabelą), użyj, -t TABLENAMEaby określić tę tabelę docelową.

Usuń regułę, aby dopasować

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

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

Usuń regułę określoną jako liczbę

iptables -D INPUT 2

Oprócz zliczania liczby można podać numer linii wraz z --line-numberparametrem, na przykład:

iptables -t nat -nL --line-number
cizixs
źródło
Znalazłem ten z --line-number jest najlepszy
Davuz
Tak! Wspaniały! Nie chcę całościiptables -F
Dev Anand Sadasivam
2

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

Wyświetl listę dołączonych adresów IP za pomocą poniższego polecenia,

# 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 tabel IP, po prostu wykonaj polecenie,

# sudo iptables -F -t nat -v

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

Następnie możesz to zweryfikować,

# sudo iptables -L -t nat -v
lakshmikandan
źródło