Per predisporre le regole che consentono al kernel di filtrare i pacchetti, bisogna eseguire il comando iptables. Se si usa il comando iptables occorre specificare le opzioni seguenti:
Tipo di pacchetto — Indica quale tipo di pacchetto filtra il comando.
Fonte del pacchetto/destinazione — Indica al comando quali pacchetti filtrare in base alla loro provenienza o destinazione.
Target — Indica quali azioni vengono adottate sui pacchetti che rispondono ai criteri elencati sopra.
Percé una regola iptables sia valida, le opzioni a essa applicate devono essere raggruppate in modo logico, in base allo scopo e alle condizioni delle regole in generale.
Un aspetto davvero importante di iptables è la possibilità di utilizzare molteplici tabelle per decidere del destino di un determinato pacchetto, in base al tipo di pacchetto preso in considerazione e a seconda di cosa se ne intende fare. Grazie alla natura di iptables, si possono creare tabelle specifiche che vengono poi memorizzate nella directory /etc/modules/<versione-kernel>/kernel/net/ipv4/netfilter, dove <versione-kernel> corrisponde al numero della versione del kernel.
La tabella di default, chiamata filter, contiene le catene standard integrate INPUT, OUTPUT e FORWARD, che sono pressoche´ identiche alle catene standard in uso con ipchains. iptables, però, per default contiene altre due tabelle che si occupano di specifici processi del filtraggio dei pacchetti. La tabella nat può essere usata per modificare gli indirizzi di provenienza e di destinazione registrati nei pacchetti; la tabella mangle consente di effettuare manipolazioni particolari sui pacchetti.
Ogni tabella contiene catene predefinite che svolgono le operazioni necessarie a seconda dello scopo prefisso; tuttavia, si possono facilmente configurare nuove catene all'interno di ciascuna tabella.
Molti comandi di iptables presentano la struttura seguente:
iptables [-t <table-name>] <command> <chain-name> <parameter-1> \
<option-1> <parameter-n> <option-n> |
In questo esempio, l'opzione <nome-tabella> permette all'utente di selezionare una tabella diversa da quella di default (filter) da utilizzare con il comando. L'opzione <comando> è il centro del comando e ordina un'azione specifica da svolgere, come per esempio aggiungere o cancellare un regola da una determinata catena, la quale viene specificata dall'opzione <nome-catena>. Questa opzione è seguita da coppie di parametri e opzioni che determinano come funziona la regola e cosa accade quando un pacchetto la soddisfa.
Per quanto riguarda la struttura di un comando iptables, è importante ricordare che, diversamente dalla maggior parte degli altri comandi, la sua lunghezza e la sua complessità possono cambiare a seconda dello scopo prefisso. Un semplice comando per rimuovere una regola da una catena può essere molto corto, mentre un comando creato per filtrare pacchetti da una determinata sottorete per mezzo di parametri e opzioni particolari può raggiungere una discreta lunghezza. Nel creare comandi di iptables, è utile tener presente che l'impiego di alcuni parametri e di alcune opzioni può comportare la necessità di utilizzare ulteriori parametri e opzioni per specificare più dettagliatamente la precedente richiesta di opzione. Per creare una regola che sia valida, dovete continuare in questo modo finché non avrete soddisfatto tutti i parametri e tutte le opzioni che richiedono ulteriori gruppi di opzioni.
Per vedere un elenco esauriente delle strutture del comando iptables, digitate iptables -h.
I comandi indicano a iptables di svolgere un'azione specifica. Per ogni stringa di comando di iptables è consentito un solo comando. Fatta eccezione per il comando help, tutti i comandi sono scritti con i caratteri maiuscoli.
I comandi di iptables sono i seguenti:
-A — aggiunge la regola di iptables alla fine della catena specificata. Questo comando viene utilizzato per aggiungere semplicemente una regola, nei casi in cui l'ordine delle regole nella catena è indifferente.
-C — verifica una particolare regola prima di aggiungerla alla catena specificata dall'utente. Questo comando vi può aiutare nella creazione di regole di iptables complicate, indicandovi di volta in volta i parametri e le opzioni da aggiungere.
-D — cancella una regola da una determinata catena in base al numero (per esempio il 5 per cancellare la quinta regola contenuta nella catena). Potete anche digitare l'intera regola e iptables cancellerà la regola nella catena corrispondente.
-E — Rinomina una catena definita dall'utente, senza intaccare la struttura della tabella.
-F — svuota la catena selezionata, cancellando di fatto tutte le regole in essa contenute. Se non viene specificata alcuna catena, questo comando cancella tutte le regole di ogni catena.
-h — Fornisce un elenco di strutture di comando molto utili e un breve compendio di parametri e opzioni.
-I — Inserisce una nuova regola in un determinato punto di una catena. Se non specificate alcun numero, iptables inserirà il vostro comando all'inizio dell'elenco.
![]() | Attenzione |
|---|---|
Quando aggiungete una regola, assicuratevi di sapere con certezza quale opzione state utilizzando (-A oppure -I). L'ordine delle regole può essere molto importante per determinare se un certo pacchetto soddisfa una regola piuttosto che un'altra. |
-L — elenca tutte le regole contenute nella catena specificata dopo il comando. Per ottenere un elenco di tutte le regole di tutte le catene contenute nella tabella di default filter, non specificate alcuna catena o tabella. Per elencare tutte le regole di una specifica catena contenuta in una determinata tabella, dovete utilizzare la seguente sintassi:
iptables -L <chain-name> -t <table-name> |
Nella Sezione 16.3.7, troverete la descrizione delle interessanti opzioni per il comando -L che, tra l'altro, forniscono i numeri delle regole e consentono descrizioni più complesse delle regole.
-N — crea una nuova catena con un nome specificato dall'utente.
-P — imposta la policy di default per una determinata catena: se un pacchetto arriva alla fine di una catena e nessuna delle regole è soddisfatta, la policy di default fa in modo che gli venga attribuito un particolare target, per esempio ACCEPT o DROP.
-R — sostituisce una regola presente in una certa posizione di una catena. Dopo il nome della catena dovete inserire il numero della regola da sostituire. Alla prima regola presente in una catena corrisponde il numero uno.
-X — cancella una catena specificata dall'utente. In nessun caso è permesso cancellare una catena integrata di una tabella.
-Z — azzera i contatori dei byte e dei pacchetti in tutte le catene di una determinata tabella.
Dopo aver specificato certi comandi di iptables, compresi quelli utilizzati per aggiungere, cancellare, inserire o sostituire delle regole all'interno di una determinata catena, vi occorrono alcuni parametri per procedere con la creazione della regola di filtraggio dei pacchetti.
-c — azzera i contatori per una particolare regola. Questo parametro accetta le opzioni PKTS e BYTES per specificare quale contatore azzerare.
-d — Imposta l'host, l'indirizzo IP o la rete di destinazione del pacchetto che soddisferà la regola. Nello specificare una rete, i seguenti formati di indirizzo IP/maschera di rete sono supportati:
N.N.N.N/M.M.M.M — Dove N.N.N.N é la portata dell'indirizzo IP e M.M.M.M é la maschera di rete.
N.N.N.N/M — Dove N.N.N.N é la portata dell'indirizzo IP e M é la maschera di rete..
-f — fa sì che questa regola sia valida solo per i pacchetti frammentati.
Se specificate l'opzione ! dopo questo parametro, la regola varrà solo per i pacchetti non frammentati.
-i — Serve per impostare l'interfaccia di rete per i pacchetti in ingresso (per esempio eth0 o ppp0), da utilizzare con una particolare regola. Con iptables, questo parametro opzionale può essere utilizzato solo per le catene INPUT e FORWARD se si opera nella tabella filter e con la catena PREROUTING se si opera nelle tabelle nat e mangle.
Questo parametro supporta anche le seguenti opzioni speciali:
! — indica al parametro di "non corrispondere", ovvero fa in modo che tutte le interfacce così specificate vengano escluse da questa regola.
+ — serve per indicare tutte le interfacce che corrispondono a una determinata stringa. Per esempio, il parametro -i eth+ applica questa regola a tutte le interfacce ethernet presenti sul vostro sistema, escludendo qualsiasi altra interfaccia per esempio ppp0.
Se utilizzate il parametro -i senza specificare alcuna interfaccia, la regola riguarderà tutte le interfacce.
-j — indica a iptables di saltare direttamente a un particolare target quando un pacchetto soddisfa una certa regola. Target validi da utilizzare dopo l'opzione -j includono le opzioni standard (ACCEPT, DROP, QUEUE e RETURN) e anche opzioni estese reperibili attraverso i moduli caricati per default con il pacchetto RPM iptables di Red Hat Linux (per esempio, LOG, MARK e REJECT, per citarne alcune). Per maggiori informazioni consultate la pagina man di iptables.
Potete anche indirizzare un pacchetto che soddisfa questa regola a una catena definita dall'utente al di fuori della catena attuale. Questo vi permette di utilizzare altre regole per il controllo di tale pacchetto
Se non viene specificato alcun target, il pacchetto oltrepassa la regola senza che succeda nulla. Tuttavia, il contatore per questa regola sale di un'unità, poiché è stata comunque soddisfatta dal pacchetto.
-o — Serve per impostare l'interfaccia di rete per i pacchetti in uscita, da utilizzare con un regola. Può essere usato solo con le catene OUTPUT e FORWARD se si opera nella tabella filter e con la catena POSTROUTING se si opera nelle tabelle nat e mangle. Le opzioni di questo parametro sono le stesse del parametro relativo all'interfaccia di rete per i pacchetti in ingresso (-i).
-p — Imposta il protocollo IP per la regola, che può essere icmp, tcp, udp o all, per coprire ogni possibile protocollo. Inoltre, si possono utilizzare anche altri protocolli meno diffusi, di cui è disponibile un elenco in /etc/protocols. Se non viene specificata questa opzione durante la creazione della regola, l'opzione di default è all.
-s — Imposta l'indirizzo sorgente per un particolare pacchetto, utilizzando la stessa sintassi del parametro di destinazione (-d).
Diversi protocolli di rete forniscono speciali opzioni configurabili in modi particolari per corrispondere a un determinato pacchetto che utilizza, appunto, uno di quei protocolli. Naturalmente, bisogna prima specificare il protocollo nel comando iptables, per esempio usando -p tcp<nome-protocollo>, (dove <nome-protocollo> é il protocollo target), per rendere disponibili le opzioni relative a quel protocollo.
Le opzioni speciali disponibili per il protocollo TCP (-p tcp) sono:
--dport — definisce la porta di destinazione per il pacchetto. Per configurare questa opzione, potete usare il nome di un servizio di rete (come www o smtp), un numero di porta o un range di numeri di porta. Nel file /etc/services potete trovare i nomi e gli alias dei servizi di rete e i numeri di porta che utilizzano. Per specificare questa opzione potete usare anche --dport.
Per indicare una specifica gamma di numeri di porta, scrivete i due numeri separati dai due punti (:). Per esempio potete specificare -p tcp --dport 3000:3200. La gamma massima consentita è 0:65535.
Potete anche utilizzare il punto esclamativo (!), scrivendolo dopo l'opzione --dport, per indicare a iptables di prendere in considerazione tutti i pacchetti che non utilizzano quel servizio di rete o quella porta.
--sport — determina la porta sorgente del pacchetto, utilizzando le stesse opzioni di --dport. Per specificare questa opzione potete usare anche --source-port.
--syn — rende la regola applicabile a tutti i pacchetti TCP adibiti all'apertura di una connessione (più noti come pacchetti SYN). Il punto esclamativo (!) posto come flag dopo l'opzione --syn indica che devono essere esaminati tutti pacchetti non SYN.
--tcp-flags — permette di filtrare i pacchetti TCP in base a particolari bit o flag, impostati per corrispondere con una regola. L'opzione --tcp-flags accetta due parametri. Il primo parametro è la maschera, che indica i flag da esaminare per quel pacchetto. Il secondo parametro si riferisce ai flag che devono essere impostate per poter corrispondere.
I flag possono essere:
ACK
FIN
PSH
RST
SYN
URG
ALL
NONE
Per esempio, una regola di iptables contenente l'opzione -p tcp --tcp-flags ACK,FIN,SYN SYN prende in considerazione solo i pacchetti TCP in cui è impostato il flag SYN, ma non i flag ACK e FIN.
Il punto esclamativo (!) posto dopo --tcp-flags viene utilizzato per invertire l'effetto dell'opzione di corrispondenza (match)
--tcp-option — cerca la corrispondenza con un particolare pacchetto in cui sono impostate delle opzioni TCP specifiche. Anche in questo caso si può invertire l'effetto mediante il punto esclamativo (!).
Le opzioni estese disponibili per il protocollo UDP (-p udp) sono:
--dport — Specifica la porta di destinazione del pacchetto UDP, usando il nome di un servizio, un numero di porta o un range di numeri di porta. L'opzione di corrispondenza --destination-port é sinonimo di --dport. Per conoscere i vari modi di impiego relativi all'opzione --dport, leggete la Sezione 16.3.5.1.
--sport — Specifica la porta sorgente del pacchetto UDP, utilizzando il nome di un servizio, un numero di porta o un range di numeri di porta. In sostituzione, potete anche usare l'opzione --source-port. Per conoscere i vari modi di impiego relativi all'opzione --sport, leggete la la Sezione 16.3.5.1. option.
Queste opzioni sono disponibili per l'Internet Control Message Protocol (ICMP) (-p icmp):
--icmp-type — determina il nome o il numero del tipo di ICMP che soddisfa la regola. Potete visualizzare un elenco di nomi validi per i tipi di ICMP digitando il comando iptables -p icmp -h.
Ulteriori opzioni speciali, si possono reperire attraverso i moduli che si caricano tramite il comando iptables. Per usare uno di questi moduli, dovete caricarlo per nome inserendo l'opzione -m <nome-modulo> (sostituendo <module-name> con il nome del modulo).
Molti di questi moduli sono disponibili per default. Potete persino creare da voi dei moduli aggiuntivi per ottenere altre opzioni.
Poichè i moduli esistenti sono numerosi, andiamo a presentarvi solo quelli più famosi e diffusi.
Il modulo limit vi consente di porre un limite al numero di pacchetti che soddisfano una certa regola. Questo risulta particolarmente utile nelle registrazioni per ridurre la quantità di pacchetti da esaminare, onde impedire l'arrivo di un'ondata di messaggi di log e un consumo eccessivo di risorse di sistema.
Il modulo limit abilita le seguenti opzioni:
--limit — stabilisce il numero massimo di confronti da effettuare sui pacchetti in un determinato lasso di tempo, specificato da un numero e da un'unità di tempo nel formato <numero>/<tempo>. Per esempio, --limit 5/hour indica che in un'ora sono consentiti al massimo cinque confronti.
Se il numero e l'unità di tempo non vengono specificati, il valore predefinito è 3/hour.
--limit-burst — impone un limite al numero di pacchetti che possono soddisfare una determinata regola. Questa opzione va associata all'opzione --limit e può essere associata a un numero per impostare il limite sopracitato.
Se non viene specificato alcun numero, soltanto cinque pacchetti potranno soddisfare la regola.
Il modulo state — Abilita la corrispondenza dello stato.
Il modulo state abilita le seguenti opzioni:
Il modulo --state — prende in considerazione pacchetti con i seguenti stati di connessione:
ESTABLISHED — il pacchetto è associato ad altri pacchetti in una connessione stabilita.
INVALID — il pacchetto non corrisponde ad alcuna connessione conosciuta.
NEW — il pacchetto sta creando una nuova connessione oppure fa parte di una connessione bidirezionale non vista in precedenza.
RELATED — il pacchetto sta creando una nuova connessione in qualche modo legata a una connessione esistente.
Questi stati di connessione possono essere combinati tra loro e usati in contemporanea. Occorre scriverli separati da una virgola, come in questo esempio: -m state --state INVALID,NEW.
Il modulo mac — Abilita la corrispondenza dell'indirizzo dell'hardware MAC.
Il modulo mac abilita la seguente opzione:
--mac-source — É il corrispondente di un indirizzo MAC della scheda dell'interfaccia di rete, che ha inviato il pacchetto. Per escludere un indirizzo MAC da una regola, posizionare un punto esclamativo (!) dopo l'opzione --mac-source.
Per conoscere le altre opzioni aggiuntive reperibili attraverso i moduli, consultate la pagina man di iptables.
Vi sono molti target attribuibili a un pacchetto dopo che ha soddisfato una determinata regola. Il loro compito è quello di decidere che cosa fare del pacchetto e di svolgere, se necessario, ulteriori operazioni, come per esempio registrare l'azione. Inoltre, ogni catena ha un suo target di default, che entra in gioco nel caso in cui un pacchetto non soddisfi nessuna delle regole in essa contenute o quando nessuna della regole che il pacchetto ha soddisfato specificano un target.
Ecco riportati i target standard:
<catena-definita-dall'utente> — Sostituire <catena-definita-dall'utente> con il nome di una catena all'interno di questa tabella. Questo target invia il pacchetto alla catena del target.
ACCEPT — autorizza il pacchetto a procedere verso la propria destinazione o verso un'altra catena.
DROP — Abbandona il pacchetto, senza informare il richiedente. Il sistema che ha inviato il pacchetto non riceve alcun messaggio di mancata accettazione.
QUEUE — accoda il pacchetto verso lo spazio utente.
RETURN — arresta il controllo del pacchetto mediante le regole della catena corrente. Se un pacchetto con target RETURN soddisfa una regola contenuta in una catena chiamata da un'altra catena, allora viene rimandato alla prima catena, dove la regola riprende il controllo da dove l'aveva lasciato. Se la regola RETURN è utilizzata all'interno di una catena integrata e il pacchetto non può tornare alla catena precedente, il target predefinito per la catena corrente decide quale azione intraprendere.
In aggiunta a questi target standard vi sono altri target che si possono utilizzare con delle estensioni chiamate moduli dei target. Per maggiori informazioni in merito a questi ultimi, leggete la Sezione 16.3.5.4.
Vi sono numerose estensioni di moduli di target, molte delle quali si adattano solo a specifiche tabelle o situazioni. Quelli che seguono sono due dei moduli di target più diffusi, inclusi per default in Red Hat Linux:
LOG — Registra tutti i pacchetti che soddisfano questa regola. Poiché i pacchetti sono registrati dal kernel, il file /etc/syslog.conf determina dove vengono memorizzate queste voci di log (per default, nel file /var/log/messages.
Dopo il target LOG si possono specificare varie opzioni per determinare il modo in cui deve avvenire la registrazione:
--log-level — Stabilisce il livello di priorità di una registrazione. Potete trovare un elenco dei livelli di priorità nella pagina man syslog.conf.
--log-ip-options — vengono registrate tutte le opzioni impostate nell'intestazione di un pacchetto IP.
--log-prefix — Antepone una stringa che puó arrivare fino a 29 caratteri. É utile anche per scrivere filtri per il syslog da usare insieme alla registrazione dei pacchetti.
--log-tcp-options — Vengono registrate tutte le opzioni impostate nell'intestazione di un pacchetto TCP.
--log-tcp-sequence — scrive nel log il numero di sequenza TCP per il pacchetto.
REJECT — Rispedisce un pacchetto di errore al sistema che l'ha inviato, dopodiché abbandona il pacchetto (DROP).
Il target REJECT accetta un'opzione del --reject-with <type> (dove <type> é il tipo di rigetto) il quale abilita l'aggiunta di ulteriori informazioni al pacchetto di errore da inviare. Il messaggio port-unreachable è il <tipo> di errore fornito per default quando non è stata specificata alcuna opzione. Per ottenere un elenco completo delle opzioni <tipo> disponibili, consultate la pagina man di iptables.
Sempre nella pagina man di iptables potete trovare altre estensioni di target, tra cui alcune molto utili per eseguire il masquerading mediante la tabella nat o per alterare i pacchetti mediante la tabella mangle.
Il comando elenco di default, iptables -L, fornisce una panoramica di base delle catene di regole correnti della tabella predefinita filter. Altre opzioni consentono di ottenere ulteriori informazioni:
-v — visualizza output complessi, come per esempio il numero di pacchetti e di byte che hanno attraversato ciascuna catena, il numero di pacchetti e di byte che hanno soddisfatto ciascuna regola e le interfacce disponibili per quella regola.
-x — espande i numeri fino a visualizzare il loro valore esatto. Se il sistema è occupato, il contatore di pacchetti e byte relativo a una certa catena mostra un output abbreviato, ponendo K (per le migliaia), M (per i milioni) o G (per i miliardi) alla fine del numero. Questa opzione impone la visualizzazione completa del numero.
-n — visualizza gli indirizzi IP e i numeri di porta in formato numerico invece che nel formato di default (con hostname e servizio di rete).
--line-numbers — elenca le regole contenute in ogni catena vicino al loro ordine numerico nella catena. Questa opzione è utile se si vuole cancellare una determinata regola di una catena o stabilire in quale posizione della catena inserire una certa regola.
-t — Specifica un nome della tabella.