Netfilter è un'infrastruttura presente nel kernel, realizzata nel 1998 da Rusty Russell e Michael Neuling, che consente di scrivere dei moduli appositi per gestire il filtraggio, il manipolamento dei pacchetti, il NAT (Network Address Translation) e di caricarli quando necessario con il comando insmod o modprobe.
E' possibile compilarli e integrarli nel kernel, creare nuovi moduli, aggiungere nuove funzionalità a quelle esistenti e perfino utilizzare i tool ipfwadm e ipchains, utilizzati rispettivamente con le versioni 2.0 e 2.2 del kernel, presenti anch'essi come moduli per garantire compatibilità con il passato. Naturalmente ipfwadm e ipchains non saranno supportati ancora a lungo, a partire dal 2004 il tool ufficiale sarà iptables, già disponibile, ma ancora in fase di sviluppo.
Le prime novità riguardano la gestione del passaggio dei pacchetti attraverso il sistema di filtraggio. Nei kernel 2.0 e 2.2 il pacchetto in arrivo è sottoposto innanzi tutto alle regole della catena INPUT (prima del routing) quindi successivamente, se destinato alla rete locale, alla catena forward e poi output, se destinato invece al firewall è inviato ai processi locali. I pacchetti in uscita dal firewall invece sono sottoposti alla sola catena output.
__ +-------+ +-------+ +---------+ +---------+ __ |__| --->| input | ---> |Routing| ---> | forward | ---> | output | ---> |__| +-------+ +-------+ +---------+ +---------+^ | ^ | | V | +------ processi locali ------+
L'impostazione classica del firewall prevede quindi di inserire le regole di filtraggio nella catena input e di usare eventualmente la catena forward per il mascheramento.
Nel prossimo kernel 2.4, a differenza della versione 2.2, quando un pacchetto arriva dalla rete viene innanzi tutto sottoposto al codice di routing e quindi se destinato o proveniente dalla rete locale e diretto all'esterno, è sottoposto esclusivamente alle regole della catena FORWARD. Alla catena INPUT sono destinati tutti i pacchetti diretti esclusivamente al firewall. Mentre i pacchetti che sono sottoposti alle regole della catena OUTPUT sono solo quelli generati esclusivamente dal firewall e in uscita.
__ +-------+ +---------+ __ |__| ---> |Routing| ---> | FORWARD | -->.-----> |__| +-------+ +---------+ ^ | | | | V | +-------+ +--------+ | INPUT | | OUTPUT | +-------+ +--------+ | ^ V | +---- processi locali ----+
Questa modifica permette di avere maggior efficienza, ogni pacchetto è sottoposto alle regole di una SOLA catena (INPUT o FORWARD o OUTPUT), e semplicità di utilizzo. E' possibile utilizzare la catena INPUT per filtrare i pacchetti diretti al firewall, la catena OUTPUT per filtrare i pacchetti creati dal firewall e in uscita, la catena FORWARD per filtrare i pacchetti che transitano attraverso il firewall diretti o provenienti dalla rete locale.
Per poter utilizzare correttamente Netfilter e iptables è necessario compilare il kernel selezionando le seguenti voci:
Networking options ---> ... [*] Network packet filtering (replaces ipchains) [CONFIG_NETFILTER] [ ] Network packet filtering debugging [CONFIG_NETFILTER_DEBUG] ... IP: Netfilter Configuration ---> <M> Connection tracking (required for masq/NAT) [CONFIG_IP_NF_CONNTRACK] <M> FTP protocol support [CONFIG_IP_NF_FTP] <M> Userspace queueing via NETLINK (EXPERIMENTAL) (NEW) [CONFIG_IP_NF_QUEUE] <M> Iptables support (required for filtering/masq/NAT) [CONFIG_IP_NF_IPTABLES] <M> limit match support [CONFIG_IP_NF_MATCH_LIMIT] <M> MAC address match support [CONFIG_IP_NF_MATCH_MAC] <M> netfilter MARK match support [CONFIG_IP_NF_MATCH_MARK] <M> Multiple port match support [CONFIG_IP_NF_MATCH_MULTIPORT] <M> TOS match support [CONFIG_IP_NF_MATCH_TOS] <M> Connection state match support [CONFIG_IP_NF_MATCH_STATE] <M> Packet filtering [CONFIG_IP_NF_FILTER] <M> REJECT target support [CONFIG_IP_NF_TARGET_REJECT] <M> MIRROR target support (EXPERIMENTAL) [CONFIG_IP_NF_TARGET_MIRROR] <M> Full NAT [CONFIG_IP_NF_NAT] <M> MASQUERADE target support [CONFIG_IP_NF_TARGET_MASQUERADE] <M> REDIRECT target support [CONFIG_IP_NF_TARGET_REDIRECT] <M> Packet mangling [CONFIG_IP_NF_MANGLE] <M> TOS target support [CONFIG_IP_NF_TARGET_TOS] <M> MARK target support [CONFIG_IP_NF_TARGET_MARK] <M> LOG target support [CONFIG_IP_NF_TARGET_LOG]
Le voci relative a "IP: Netfilter Configuration" sono state tutte impostate come moduli (M), ma possono essere selezionate anche in modo da essere incluse direttamente nel kernel (*), o non essere proprio selezionate (sconsigliato). E' inoltre possibile includere solo una parte nel kernel e il resto compilarli come moduli, appena necessari potranno essere caricati con i comandi modprobe o insmod.
Selezionare questa voce se si desidera che la Linux box possa operare come firewall, e quindi filtrare, mascherare, manipolare i pacchetti usando l'infrastruttura netfilter e il nuovo programma iptables, sostituto di ipchains nel kernel 2.4.
Selezionare questa voce nel caso si debba effettuare il debug del codice di netfilter e si vogliano maggiori informazioni.
Menu principale per la selezione dei moduli.
Il connection tracking tiene traccia delle connessioni stabilite in modo da riconoscere quali pacchetti ne fanno parte e quali no. Richiesto per il mascheramento (masquerading) e altre forme di NAT (Network Address Translation). Può essere utilizzato anche per supportare il filtraggio dei pacchetti.
Selezionare questa voce se la macchina effettua il masquerading o altra forma di NAT, e se si intende usare FTP. FTP causa alcuni problemi con il connection tracking quindi è necessario includere questo modulo per risolverli.
Netfilter è in grado di accodare e passare i pacchetti allo userspace. Il dispositivo netlink può poi essere utilizzato per accedere a questi dati.
Selezionare questa voce per filtrare i pacchetti e/o per effettuare il NAT, utilizzando il nuovo tool iptables.
Selezionare questa voce per poter limitare il numero di confronti. Utile se usato in combinazione con il modulo LOG per limitare la registrazione dei messaggi e per aggirare alcuni attacchi DoS (Denial of Service).
Selezionare questa voce se si vogliono confrontare i pacchetti in base all'indirizzo ethernet associato.
Selezionare questa voce se si vogliono confrontare i pacchetti in base al valore 'nfmark'. Questo valore può essere impostato attraverso il target MARK (vedere iptables).
Selezionare questa voce se si vogliono confrontare i pacchetti TCP o UDP in base ad una serie di porte sorgenti o destinazione. Nota che normalmente una regola può confrontare solo un singolo intervallo di porte.
Selezionare questa voce se si vogliono confrontare i pacchetti in base ai campi TOS (Type Of Service) dei pacchetti IP.
Selezionare questa voce se si vogliono confrontare i pacchetti in base all'appartenenza o meno ad una connessione tracciata (pacchetti precedenti). Se si decide di includere questo modulo nel kernel tutte le connessioni saranno automaticamente tracciate.
Selezionare questa voce se si vogliono confrontare i pacchetti in base ad una serie di campi delle intestazioni IP, TCP, UDP, ICMP, utile per verificare la validità dei pacchetti.
Selezionare questa voce se si vogliono confrontare i pacchetti generati localmente in base a chi li ha creati: utente, gruppo, processo, sessione.
Definisce una tabella 'filter', in cui è possibile inserire le regole per il filtraggio dei pacchetti.
Selezionare questa voce se si vuole utilizzare il target REJECT, che permette di inviare un pacchetto ICMP error in risposta.
Selezionare questa voce se si vuole permettere ad una regola di rispedire indietro un pacchetto ricevuto.
Selezionare questa voce se si vuole implementare il masquerading, il port forwarding o altre forme di NAT (Network Address Translation). Queste forme di NAT si possono impostare utilizzando iptables e l'opzione '-t nat'.
Selezionare questa voce se si desidera utilizzare questa forma specializzata di mascheramento, implementata specificatamente per supportare i collegamenti PPP dialup.
Selezionare questa voce se si desidera utilizzare il proxy trasparente, un'altra forma di NAT.
Selezionare questa voce se si vogliono manipolare i pacchetti, ossia modificare i campi delle intestazioni.
Selezionare questa voce se si vogliono creare delle regole nella tabella 'mangle' che possano alterare i bit TOS (Type Of Service) dei pacchetti.
Selezionare questa voce per aggiungere un target 'MARK' che permetta di creare nella tabella 'mangle' delle regole che siano in grado di alterare il campo nfmark associato ai pacchetti. Utile per cambiare l'instradamento (routing) dei pacchetti. Utilizzato in particolare per lo shaping, controllo del traffico.
Selezionare questa voce per aggiungere un target 'LOG' che permetta di creare delle regole che registrino le intestazioni dei pacchetti.
Se si decide di includere queste voci come moduli, e quindi di non includerle direttamente nel kernel, allora nella directory /lib/modules/2.x.xx/ipv4/ dovrebbero essere presenti tutti i seguenti moduli o quasi dato che alcuni sono ancora sperimentali:
ip_conntrack.o ip_conntrack_ftp.o ip_nat_ftp.o ip_queue.o ip_tables.o ipt_LOG.o ipt_MARK.o ipt_MASQUERADE.o ipt_MIRROR.o ipt_REDIRECT.o ipt_REJECT.o ipt_TOS.o ipt_limit.o ipt_mac.o ipt_mark.o ipt_multiport.o ipt_owner.o ipt_state.o ipt_tos.o ipt_unclean.o iptable_filter.o iptable_mangle.o iptable_nat.o