Come posso rimuovere regole specifiche da iptables?


334

Sto ospitando servizi HTTP e HTTPS speciali sulle porte 8006 e 8007 rispettivamente. Uso iptables per "attivare" il server; cioè per instradare le porte HTTP e HTTPS in arrivo:

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 

Funziona come un fascino. Tuttavia, vorrei creare un altro script che disabilita nuovamente il mio server; cioè ripristinare iptables nello stato in cui si trovava prima di eseguire le righe sopra. Tuttavia, faccio fatica a capire la sintassi per rimuovere queste regole. L'unica cosa che sembra funzionare è un flush completo:

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

Ma ciò eliminerà anche altre regole di iptables indesiderate.


2
Ho scoperto che è meglio usare -Iinvece che -Aper le ACCEPTlinee. Questo perché in genere l'ultima riga (ad INPUTesempio per la catena) è un DROPo REJECTe vuoi che la tua regola venga prima di quella. -Amette la nuova regola dopo l'ultima regola, mentre la -Imette all'inizio.
Mark Lakata,

Risposte:


471

Esegui gli stessi comandi ma sostituisci "-A" con "-D". Per esempio:

iptables -A ...

diventa

iptables -D ...

7
Se hai diverse regole di un tipo, non verranno rimosse tutte.
ETech,

4
prova ad eseguire questo comando -D più volte e cancellerà tutti.
Zhenyu Li,

4
ho eseguito lo stesso comando, ma con -D invece di -I. Ma ottengo BAD RULE (esiste una regola corrispondente) ...
Ben

4
Se hai aggiunto una regola con -Io -R, puoi comunque eliminarla con -D.
David Xia

Solo una nota. Creo una regola con 'iptables -A ...' e la regola è apparsa ma non è stata efficace. Quando si utilizza 'iptables -D ...' la risposta è stata una regola errata . Anche così la regola è stata cancellata. La regola era visibile con 'sudo iptables -nvL'. La catena che ho usato era "INPUT".
Ben Paz,

446

Puoi anche usare il numero della regola ( --line-numbers ):

iptables -L INPUT --line-numbers

Esempio di output:

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

Quindi, se desideri eliminare la seconda regola:

iptables -D INPUT 2

Aggiornare

Se usi (d) una tabella specifica (ad es. Nat), devi aggiungerla al comando delete (grazie a @ThorSummoner per il commento)

sudo iptables -t nat -D PREROUTING 1

4
Entrambe le soluzioni sono valide, ma questa non funzionerà in un'impostazione con script quando il numero di riga è sconosciuto. Quindi l'altra soluzione è più generale, e quindi più corretta, IMO.
Jeroen,

2
Bene, se non conosci la linea puoi usare un commento (come la risposta tra) o fare un grep per la tua regola:iptables -L INPUT --line-numbers | grep -oP "([0-9]{1,3}).*tcp.*domain" | cut -d" " -f1
domi27

6
Questo va bene solo se la tabella non può avere regole inserite in qualsiasi momento. In caso contrario, i numeri di riga potrebbero cambiare tra l'osservazione e l'esecuzione della regola di eliminazione. In tal caso, non è sicuro presumere che la finestra temporale sia così breve che "è improbabile che accada mai".
Nick,

14
Ricorda che se elimini una regola, i numeri di riga del resto cambiano. Quindi, se devi eliminare la regola 5, 10 e 12 ... eliminali 12, 10, quindi 5.
TomOnTime

2
Quando ho cercato di eliminare le regole di PREROUTING ho dovuto specificare -t nat, ad esempio sudo iptables -t nat --line-numbers -L-t natsudo iptables -t nat -D PREROUTING 1
:,

31

La migliore soluzione che funziona per me senza problemi si presenta così:
1. Aggiungi una regola temporanea con qualche commento:

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

2. Quando la regola è stata aggiunta e desideri rimuoverla (o tutto ciò che contiene questo commento), fai:

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

Quindi, eliminerai il 100% di tutte le regole che corrispondono al $ comment e lascerai intatte le altre righe. Questa soluzione funziona negli ultimi 2 mesi con circa 100 modifiche delle regole al giorno - nessun problema. Spero che sia d'aiuto


2
Nel caso in cui non si disponga di iptables-save / restore:iptables -S | grep "${comment}" | sed 's/^-A //' | while read rule; do iptables -D $rule; done
Mansour

Per un utilizzo reale: CRON 1) elimina i vecchi spamhausdivieti iptables, 2) prendi spamhaus.org/drop , 3) grep per IP CIDR eiptables -A INPUT -s $ip_cidr -j -m comment --comment "spamhaus"
Xeoncross

2
@Mansour Or iptables -S | sed "/$comment/s/-A/iptables -D/e";) in questo modo
hek2mgl

@ hek2mgl sed non si arrende, vero? =] Grazie, terrò presente questa funzionalità (tra un giorno dimenticherò la sintassi).
Mansour,

sed è usato solo per rimuovere "-" da uuid. In ogni caso, una volta ottenuta la sintassi sed, non verrà mai dimenticata. ))
ETech,

11

Prima elenca tutte le regole di iptables con questo comando:

iptables -S

elenca come:

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

Quindi copia la riga desiderata e sostituiscila -Acon -Dper eliminarla:

iptables -D XYZ -p ...

2
Sii consapevole! Questa è una risposta incompleta. Dal manuale su "-S": "Come ogni altro comando iptables, si applica alla tabella specificata (il filtro è il valore predefinito).". Quindi, in caso di utilizzo di questo interruttore - dovrebbe essere ripetuto per tutte le tabelle: nat, mangle, ecc.
pmod

1
Nel mio caso, ottengo iptables: Bad rule (does a matching rule exist in that chain?).Cosa adesso?
Abdull,

Ah, ho capito - il mio comando di eliminazione mancava la specifica della tabella. Quindi, nel caso in cui elenchi tutte le regole dalla tabella natcon sudo iptables -S -t nate desideri eliminare una delle regole restituite, la copia non è sufficiente. Devi aggiungere -t nat, ad es sudo iptables -D ... -t nat.
Abdull,

Facile da capire!
sknight

5

Usa il -Dcomando, ecco come manlo spiega la pagina:

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

Realizza questo comando, come tutti gli altri comandi ( -A, -I) funziona su una certa tabella. Se non stai lavorando sulla tabella predefinita ( filtertabella), usa-t TABLENAME per specificare quella tabella di destinazione.

Elimina una regola da abbinare

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

Nota: questo elimina solo la prima regola trovata. Se hai molte regole abbinate (questo può accadere in iptables), eseguilo più volte.

Elimina una regola specificata come numero

iptables -D INPUT 2

Oltre a contare il numero è possibile elencare il numero di riga con il --line-numberparametro, ad esempio:

iptables -t nat -nL --line-number

Ho trovato questo con --line-number è il migliore
Davuz,

Sì! Stupendo! Non voglio interoiptables -F
Dev Anand Sadasivam

2

Supponiamo che, se si desidera rimuovere le regole NAT,

Elencare gli IPtables aggiunti usando il comando seguente,

# 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

Se desideri rimuovere la regola nat da IPtables, esegui semplicemente il comando,

# sudo iptables -F -t nat -v

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

Quindi, puoi verificare che,

# sudo iptables -L -t nat -v
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.