najlepszy sposób na wyczyszczenie wszystkich reguł iptables

83

Obecnie mam ten fragment kodu:

# flush all chains
iptables -F
iptables -t nat -F
iptables -t mangle -F
# delete all chains
iptables -X

Czy istnieje możliwość, że jakaś nieprzenikniona zasada pozostanie przy życiu po uruchomieniu tego?

Chodzi o to, aby mieć całkowicie czystą konfigurację iptables, którą można łatwo zastąpić nowym zestawem reguł (nieważne trasy / parametry ifconfig).

kagali-san
źródło

Odpowiedzi:

107

Aby zwięźle odpowiedzieć na twoje pytanie, nie: po opróżnieniu każdego stołu nie będzie żadnych „resztek” reguł. W trosce o dokładność możesz jednak ustawić zasady dla wbudowanych INPUTi FORWARDłańcuchów ACCEPTrównież na:

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

Wyczyść reguły ip6tables:

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

... i to powinno wystarczyć. iptables -nvLpowinien generować ten (lub bardzo podobny) wynik:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
Sam Halicke
źródło
9
zapomniałeś o 'raw': iptables -t raw -F iptables -t raw -X
kK-Storm
there would not be any "leftover" rules after flushing every tableOP nie spłukuje każdego stołu. Ani Ty. Oto jak to wygląda, jeśli chcesz być dokładny . I możesz chcieć dodać iptables -t "$table" -Z. Zauważ, że w ten sposób zakodujesz na stałe listę tabel i ich łańcuchów. Więc poważnie rozważę rozwiązanie save-restore . Lub możesz po prostu rozładować iptables .
x-yuri
23

Spowoduje to prawidłowe całkowite zresetowanie systemu iptables do bardzo podstawowego stanu:

iptables-save | awk '/^[*]/ { print $1 } 
                     /^:[A-Z]+ [^-]/ { print $1 " ACCEPT" ; }
                     /COMMIT/ { print $0; }' | iptables-restore

Wszystkie zasady zostaną zresetowane do AKCEPTUJĄ, a także opróżnią każdą bieżącą tabelę. Wszystkie łańcuchy oprócz wbudowanych nie będą już istnieć.

Jerub
źródło
1
Schludny hack! Nie byłbym jednak zależny od tego, ponieważ zawsze możliwe jest, że subtelne zmiany formatu zapisu / przywracania mogą go złamać. Prawdopodobnie najlepiej trzymać się interfejsu API iptablesudostępnionego przez narzędzie, IMO.
Steven poniedziałek,
3
Zmieniłem zdanie: format danych raczej nie zmieni się znacznie, ponieważ jest tak szeroko stosowany. +1.
Steven poniedziałek,
2
+1, interesujący hack
Sam Halicke
Udało się to pozbyć resztek łańcuchów UFW, czego nie zaakceptowała odpowiedź.
l0b0
To drobny szczegół, ale warto wymienić pierwsze print $1z print $0być spójne :)
x-Yuri
2

Ilekroć potrzebuję wyłączonej zapory ogniowej, jest to mniej więcej tak:

  • iptables-save > iptables.bak
  • service iptables stop (Jestem na Fedorze)
Realn0whereman
źródło
1

Możesz po prostu rozładować iptablesmoduły z jądra:

modprobe -r iptable_raw iptable_mangle iptable_security iptable_nat iptable_filter

UPD Niestety, zbyt piękne, aby mogło być prawdziwe. Tak długo, jak w tabeli znajduje się reguła lub łańcuch zdefiniowany przez użytkownika, liczba referencji odpowiadających modułów wynosi 1 i modprobe -rkończy się niepowodzeniem. Możesz usunąć reguły i łańcuchy zdefiniowane przez użytkownika:

echo $'*raw\nCOMMIT\n*mangle\nCOMMIT\n*security\nCOMMIT\n*nat\nCOMMIT\n*filter\nCOMMIT' | iptables-restore

lub:

iptables-save | awk '/^[*]/ { print $1 "\nCOMMIT" }' | iptables-restore

Możesz także chcieć rozładować moduły w ten sposób (bez nazw modułów na stałe):

lsmod | egrep ^iptable_ | awk '{print $1}' | xargs -rd\\n modprobe -r

Z drugiej strony, po tym iptables-savepowstaje ładna pusta moc wyjściowa :)

x-yuri
źródło
To może być młot. Dzięki.
Konrad Gajewski
0

Można to zrobić za pomocą 1 lub 2 poleceń:

 $ sudo iptables-save > iptables.bak
 $ sudo iptables -F

Wynik:

$ sudo iptables -nvL
Chain INPUT (policy ACCEPT 3138 packets, 5567K bytes)
pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 3602 packets, 6547K bytes)
pkts bytes target     prot opt in     out     source               destination         
Mugoma J. Okomba
źródło
5
Jeśli domyślne zasady są obecnie ustawione na DROP, jest to szybki sposób na zablokowanie serwera. Więc nie, nie jest to proces polecenia 1 lub 2. Musisz najpierw ustawić AKCEPTUJ, jeśli nie jest to obecnie.
RyanH
0

Niedawno musiałem zablokować wszystkie połączenia

iptables-policy INPUT DROP
iptables-policy OUTPUT DROP
iptables-policy FORWARD DROP

co do oszczędzania polecam następujące

Ubuntu:

/etc/init.d/iptables save
/sbin/service iptables save

RedHat / CentOS:

/etc/init.d/iptables save
/sbin/iptables-save

Oprócz tworzenia kopii zapasowych wszystkich obecnych reguł ufw, z których korzystałem w przeszłości

cp /lib/ufw/{user.rules,user6.rules} /<BACKUP LOCATION> 
cp /lib/ufw/{user.rules,user6.rules} ./

Myślę, że może to być przydatne w przyszłości. Myślałem, że podzielę się.

Boschko
źródło
0

Utwórz kopię zapasową konfiguracji do iptables_backup.conf i wyczyść wszystkie reguły.

iptables-save | tee iptables_backup.conf | grep -v '\-A' | iptables-restore

Aby przywrócić poprzednią konfigurację:

iptables-restore < iptables_backup.conf
Zibri
źródło