Introduzione
Iptables è un firewall che svolge un ruolo essenziale nella sicurezza della rete per la maggior parte dei sistemi Linux. Questo tutorial si concentrerà su un aspetto diverso della gestione del firewall: elencare ed eliminare delle regole.
In questo tutorial, tratteremo come eseguire le seguenti attività di iptables:
- Elenco delle regole
- Cancella contatori di pacchetti e byte
- Elimina regole
- Svuota catene (elimina tutte le regole in una catena)
- Svuota tutte le catene e le tabelle, elimina tutte le catene e accetta tutto il traffico
Nota: quando si lavora con i firewall, fare attenzione a non bloccarsi dal proprio server bloccando il traffico SSH (porta 22, per impostazione predefinita). Se si perde l'accesso a causa delle impostazioni del firewall, potrebbe essere necessario connettersi ad esso tramite la console del proprio provider. Una volta connesso tramite la console, è possibile modificare le regole del firewall per consentire l'accesso SSH (o consentire tutto il traffico). Se le regole del firewall salvate consentono l'accesso SSH, un altro metodo è riavviare il server.
Prerequisiti
Prima di iniziare a utilizzare questa esercitazione, è necessario disporre di un account superutente non root separato, un utente con privilegi di sudo, impostato sul server. Se è necessario configurarlo, seguire la guida appropriata:
Vediamo come elencare prima le regole. Esistono due modi diversi per visualizzare le regole di iptables attive: in una tabella o come elenco di specifiche delle regole. Entrambi i metodi forniscono all'incirca le stesse informazioni in diversi formati.
Elencare le regole per specifica
Per elencare tutte le regole di iptables attive in base alle specifiche, eseguire il comando iptables
con l'opzione -S
:
sudo iptables -S
-P FORWARD DROP
-P OUTPUT ACCEPT
-N ICMP
-N TCP
-N UDP
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT
Come puoi vedere, l'output assomiglia ai comandi utilizzati per crearli. Questo sarà anche simile ai file di configurazione delle regole di iptables, se lo hai mai usato iptables-persistent
o iptables save
.
Elencare una catena specifica
Se si desidera limitare l'output a una catena specifica (INPUT
, OUTPUT
, TCP
e così via), è possibile specificare il nome della catena subito dopo l'opzione -S
. Ad esempio, per mostrare tutte le specifiche della regola nella catena TCP
, eseguire questo comando:
sudo iptables -S TCP
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT
Diamo un'occhiata al modo alternativo di visualizzare le regole di iptables attive, come una tabella di regole.
Elencare le regole come tabelle
Elencare le regole di iptables nella vista tabella può essere utile per confrontare regole diverse tra loro,
Per generare tutte le regole di iptables attive in una tabella, eseguire il comando iptables
con l'opzione -L
:
sudo iptables -L
Questo produrrà tutte le regole attuali ordinate per catena.
Se si desidera limitare l'output a una catena specifica (INPUT
, OUTPUT
, TCP
e così via), è possibile specificare il nome della catena subito dopo l'opzione -L
.
Diamo un'occhiata a una catena INPUT di esempio:
sudo iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere
DROP all -- anywhere anywhere ctstate INVALID
UDP udp -- anywhere anywhere ctstate NEW
TCP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
ICMP icmp -- anywhere anywhere ctstate NEW
REJECT udp -- anywhere anywhere reject-with icmp-port-unreachable
REJECT tcp -- anywhere anywhere reject-with tcp-reset
REJECT all -- anywhere anywhere reject-with icmp-proto-unreachable
La prima riga di output indica il nome della catena (INPUT, in questo caso), seguito dalla sua politica di default (DROP). La riga successiva è composta dalle intestazioni di ciascuna colonna della tabella ed è seguita dalle regole della catena. Vediamo cosa indica ogni intestazione:
- target: se un pacchetto corrisponde alla regola, il target specifica cosa deve essere fatto con esso. Ad esempio, un pacchetto può essere accettato, eliminato, registrato o inviato a un'altra catena per essere confrontato con più regole
- prot: Il protocollo, come ad esempio
tcp
,udp
,icmp
, oall
- opt: Raramente utilizzato, questa colonna indica le opzioni IP
- source: l'indirizzo IP di origine o sottorete del traffico, oppure
anywhere
- destinazione: l'indirizzo IP o la sottorete del traffico di destinazione, oppure
anywhere
L'ultima colonna, che non è etichettata, indica le opzioni di una regola. Cioè, qualsiasi parte della regola che non è indicata dalle colonne precedenti. Potrebbe trattarsi di qualsiasi cosa, dalle porte di origine e di destinazione, allo stato di connessione del pacchetto.
Mostra conteggi pacchetti e dimensione aggregata
Quando si elencano le regole di iptables, è anche possibile mostrare il numero di pacchetti e la dimensione aggregata dei pacchetti in byte, corrispondenti a ciascuna regola particolare. Ciò è spesso utile quando si cerca di farsi un'idea approssimativa di quali regole corrispondono ai pacchetti. Per fare ciò, basta usare insieme l'opzione -L
e -v
.
Ad esempio, diamo un'occhiata alla catena INPUT di nuovo, con l'opzione -v
:
sudo iptables -L INPUT -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
284K 42M ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 DROP all -- any any anywhere anywhere ctstate INVALID
396 63275 UDP udp -- any any anywhere anywhere ctstate NEW
17067 1005K TCP tcp -- any any anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
2410 154K ICMP icmp -- any any anywhere anywhere ctstate NEW
396 63275 REJECT udp -- any any anywhere anywhere reject-with icmp-port-unreachable
2916 179K REJECT all -- any any anywhere anywhere reject-with icmp-proto-unreachable
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh ctstate NEW,ESTABLISHED
Si noti che l'elenco ora ha due colonne aggiuntive pkts
e bytes
.
Ora che sai come elencare le regole del firewall attivo in vari modi, diamo un'occhiata a come resettare i contatori di pacchetti e byte.
Ripristinare conteggi pacchetti e dimensioni aggregate
Se vuoi cancellare, o azzerare, i contatori di pacchetti e byte per le tue regole, usa l'opzione -Z
. Si resettano anche se si verifica un riavvio. Questo è utile se vuoi vedere se il tuo server sta ricevendo nuovo traffico che corrisponde alle tue regole esistenti.
Per cancellare i contatori per tutte le catene e le regole, utilizzare l'opzione -Z
da sola:
sudo iptables -Z
Per cancellare i contatori per tutte le regole in una catena specifica, utilizzare l'opzione -Z
e specificare la catena. Ad esempio, per cancellare i contatori di catene INPUT eseguire questo comando:
sudo iptables -Z INPUT
Se si desidera cancellare i contatori per una regola specifica, specificare il nome della catena e il numero della regola. Ad esempio, per azzerare i contatori per la prima regola nella catena INPUT, eseguire questo:
sudo iptables -Z INPUT 1
Ora che sai come resettare il pacchetto iptables e i contatori di byte, diamo un'occhiata ai due metodi che possono essere usati per eliminarli.
Eliminare una regola per Specification
Uno dei modi per eliminare le regole di iptables è è per rule Specification. Per fare ciò, è possibile eseguire il comando iptables
con l'opzione -D
seguita dalla specifica della regola. Se si desidera eliminare le regole utilizzando questo metodo, è possibile utilizzare l'output dell'elenco delle regole iptables -S
per un aiuto.
Ad esempio, se si desidera eliminare la regola che elimina i pacchetti in entrata non validi (-A INPUT -m conntrack --ctstate INVALID -j DROP
), è possibile eseguire questo comando:
sudo iptables -D INPUT -m conntrack --ctstate INVALID -j DROP
Si noti che l'opzione -A
, che viene utilizzata per indicare la posizione della regola al momento della creazione, deve essere esclusa qui.
Eliminare una regola per catena e numero
L'altro modo per eliminare le regole di iptables è tramite la sua catena e il numero di riga . Per determinare il numero di riga di una regola, elencare le regole nel formato tabella e aggiungere l'opzione --line-numbers
:
sudo iptables -L --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
2 ACCEPT all -- anywhere anywhere
3 DROP all -- anywhere anywhere ctstate INVALID
4 UDP udp -- anywhere anywhere ctstate NEW
5 TCP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
6 ICMP icmp -- anywhere anywhere ctstate NEW
7 REJECT udp -- anywhere anywhere reject-with icmp-port-unreachable
8 REJECT tcp -- anywhere anywhere reject-with tcp-reset
9 REJECT all -- anywhere anywhere reject-with icmp-proto-unreachable
10 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ctstate NEW,ESTABLISHED
...
Ciò aggiunge il numero di riga a ciascuna riga della regola, indicata dall'intestazione num.
Una volta che sai quale regola vuoi eliminare, annota la catena e il numero di riga della regola. Quindi eseguire il comando iptables -D
seguito dalla catena e dal numero della regola.
Ad esempio, se vogliamo eliminare la regola di input che elimina i pacchetti non validi, possiamo vedere che è la regola 3
della catena INPUT
. Quindi dovremmo eseguire questo comando:
sudo iptables -D INPUT 3
Ora che sai come eliminare le singole regole del firewall, esaminiamo come è possibile svuotare catene di regole.
Catene Flush (svuotare)
Iptables offre un modo per eliminare tutte le regole in una catena o svuotare una catena. Questa sezione tratterà la varietà di modi per farlo.
Nota: fare attenzione a non bloccarsi fuori dal server, tramite SSH, svuotando una catena con una politica predefinita di drop o deny . In tal caso, potrebbe essere necessario connettersi ad esso tramite la console per correggere l'accesso.
Svuotare una catena singola
Per svuotare una catena specifica, che eliminerà tutte le regole nella catena, è possibile utilizzare l'opzione -F
o l'equivalente --flush
e il nome della catena per svuotare.
Ad esempio, per eliminare tutte le regole della catena INPUT
, eseguire questo comando:
sudo iptables -F INPUT
Svuotare tutte le catene
Per svuotare tutte le catene, che elimineranno tutte le regole del firewall, è possibile utilizzare l'opzione -F
, o l'equivalente --flush
, da solo:
sudo iptables -F
Svuotare tutte le regole, Eliminare tutte le catene e Accettare tutto
Questa sezione ti mostrerà come svuotare tutte le regole, le tabelle e le catene del firewall e consentire tutto il traffico di rete.
Nota: questo disabiliterà il tuo firewall. Seguire questa sezione solo se si desidera ricominciare da capo la configurazione del firewall.
Innanzitutto, impostare i criteri predefiniti per ciascuna delle catene integrate su ACCEPT
. Il motivo principale per farlo è assicurarsi che non si verrà bloccati dal server tramite SSH:
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
Quindi svuota le tabelle nat
e mangle
, svuota tutte le catene (-F
) ed elimina tutte le catene non predefinite (-X
):
sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -F
sudo iptables -X
Il firewall consentirà ora tutto il traffico di rete. Se elenchi ora le tue regole, vedrai che non ce ne sono e restano solo le tre catene predefinite (INPUT, FORWARD e OUTPUT).
Conclusione
Dopo aver seguito questo tutorial, dovresti conoscere come elencare ed eliminare le regole del tuo firewall iptables.
Ricorda che qualsiasi modifica di iptables tramite il comando iptables
è temporanea e deve essere salvata per persistere attraverso i riavvii del server.