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.


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

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

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


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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.