Avanti Indietro Indice

2. Fondamenti di Packet Filtering

2.1 Cos'è?

Tutto il traffico attraverso una rete è inviato sotto forma di pacchetti. Per esempio, lo scaricarsi questo documento (facciamo conto sia lungo 50k) fa sì che si ricevano 36 o più pacchetti da 1460 byte ognuno (tanto per mettere un po' di numeri).

L'inizio di ogni pacchetto specifica dove deve andare, da dove viene, il tipo del pacchetto ed altri dettagli amministrativi. Questa parte iniziale del pacchetto è detta header (intestazione). Il resto del pacchetto, contenente i dati reali da trasmettere, solitamente è detto body (corpo).

Alcuni protocolli, come TCP, usato per il traffico web, mail e login remoti, usano il concetto di "connessione": prima di inviare un qualsiasi pacchetto con i dati reali, sono scambiati diversi pacchetti di impostazione (con intestazioni speciali) che dicono ``Voglio connettermi'', ``OK'' e ``Grazie''. Poi sono scambiati i pacchetti normali.

Un filtro di pacchetti (packet filter) è un pezzo di software che guarda l'intestazione dei pacchetti che passano e decide il destino dell'intero pacchetto. Potrebbe decidere di proibire (deny) il pacchetto (ie. scartare il pacchetto come non fosse mai stato ricevuto), accettare (accept) il pacchetto (ie. lasciare che il pacchetto prosegua), o rifiutare (reject) il pacchetto (simile a proibire, ma comunica inoltre alla fonte del pacchetto quello che ha fatto).

Sotto Linux, il filtraggio dei pacchetti è contenuto all'interno del kernel e ci sono alcune cosette divertenti che si possono fare con i pacchetti, ma il principio generale è sempre quello di guardare le intestazioni e di decidere la sorte dei pacchetti.

2.2 Perché?

Controllo. Sicurezza. Vigilanza.

Controllo:

quando si usa una macchina Linux per connettere la propria rete interna ad un'altra rete (Internet, ad esempio) si ha l'opportunità di permette un certo tipo di traffico e di proibirne dell'altro. Per esempio, l'intestazione di un pacchetto contiene l'indirizzo della destinazione del pacchetto, e quindi si può impedire ai pacchetti di andare verso una certa parte della rete esterna. Un altro esempio: uso Netscape per accedere agli archivi di Dilbert. Nella pagina ci sono avvisi pubblicitari di doubleclick.net e Netscape spreca il mio tempo scaricandoli pedissequamente. Dicendo al filtro dei pacchetti di non permettere alcun pacchetto da o per l'indirizzo posseduto da doubleclick.net si risolve quel problema (anche se penso ci siano modi migliori per risolverlo).

Sicurezza:

quando la propria macchina Linux è la sola cosa tra il caos di Internet e la propria bella ed ordinata rete, è bene sapere che si può limitare quel che viene a bussare alla propria porta. Per esempio, si potrebbe permettere a qualsiasi cosa di uscire dalla propria rete, ma certamente non si è ben disposti verso i cosiddetti ``Ping della Morte'' provenienti da estranei maliziosi. Un altro esempio: si può voler evitare che gli estranei possano fare telnet nella macchina, anche se tutti gli account hanno una password; oppure si vuole (come molti d'altronde) essere un semplice osservatore in Internet e non un server (volente o nolente): semplicemente non si permetta a nessuno di connettersi, facendo sì che il filtro dei pacchetti rifiuti tutti i pacchetti entranti usati per instaurare una connessione.

Vigilanza:

talvolta una macchina mal configurata in una rete locale decide di emettere pacchetti per il mondo esterno. È bene dire al filtro dei pacchetti di informarvi se succede qualcosa di anormale; forse si può fare qualcosa per risolverlo o forse si è solo curiosi per natura.

2.3 Come?

Un kernel con il filtraggio dei pacchetti

È necessario un kernel che possieda al suo interno il nuovo supporto per le "IP firewall chains" (catene firewall IP). È possibile sapere se il kernel attualmente in esecuzione ce l'ha cercando il file `/proc/net/ip_fwchains'. Se esiste, allora c'è.

Se così non è, è necessario compilare un kernel che supporti le catene firewall IP. Per prima cosa si scarichino i sorgenti del kernel che si vuole. Se si possiede un kernel versione 2.1.102 o superiore non si avrà bisogno di una patch (è già presente nel kernel). Altrimenti si applichi la patch scaricabile dalla pagina web suddetta e si effettui la configurazione come spiegato dettagliatamente nel seguito. Se non si sa come farlo, niente panico: si legga il Kernel-HOWTO.

Le opzioni di configurazione che sarà necessario impostare per i kernel della serie 2.0 sono:


        CONFIG_EXPERIMENTAL=y
        CONFIG_FIREWALL=y
        CONFIG_IP_FIREWALL=y
        CONFIG_IP_FIREWALL_CHAINS=y

Per i kernel delle serie 2.1 o 2.2:


        CONFIG_FIREWALL=y
        CONFIG_IP_FIREWALL=y

Lo strumento ipchains dialoga con il kernel e lo istruisce su quali pacchetti filtrare. A meno che non si sia dei programmatori, o particolarmente curiosi, questo è il solo modo con cui si controllerà il filtraggio dei pacchetti.

ipchains

Il programma ipchains inserisce e cancella regole dalla sezione di filtraggio dei pacchetti del kernel. Ciò significa che qualsiasi cosa si imposti, sarà persa al riavvio; si veda la sezione Rendere permanenti le regole per un metodo per assicurarsi che siano ripristinate all'avvio successivo di Linux.

ipchains rimpiazza ipfwadm, usato per il vecchio codice di Firewall IP. Nel sito ftp di ipchains è disponibile una serie di script molto utili:

ftp://ftp.rustcorp.com/ipchains/ipchains-scripts-1.1.2.tar.gz

Questo pacchetto contiene uno script shell chiamato ipfwadm-wrapper che permette di effettuare il filtraggio dei pacchetti come lo si faceva prima. Probabilmente non si dovrebbe usare questo script a meno che non si voglia un metodo veloce per aggiornare un sistema che usa ipfwadm (è più lento, non controlla gli argomenti, ecc.). In tal caso, non è necessario proseguire la lettura di questo HOWTO.

Si veda l'appendice Differeze tra ipchains e ipfwadm e l'appendice Usare lo script `ipfwadm-wrapper' per maggiori dettagli.

Rendere permanenti le regole

La configurazione corrente del firewall è immagazzinata nel kernel e quindi sarà persa al riavvio. Raccomando di usare gli script `ipchains-save' e `ipchains-restore' per rendere permanenti le regole. Per far ciò, si impostino le proprie regole, poi (come root) si lanci:

# ipchains-save > /etc/ipchains.rules
#

Si crei uno script come il seguente:

#! /bin/sh
# Script per controllare il filtraggio dei pacchetti

# Se non ci sono regole, non fa niente.
[ -f /etc/ipchains.rules ] || exit 0

case "$1" in
    start)
        echo -n "Attivazione del filtraggio dei pacchetti:"
        /sbin/ipchains-restore < /etc/ipchains.rules || exit 1
        echo 1 > /proc/sys/net/ipv4/ip_forward
        echo "."
        ;;
    stop)
        echo -n "Disattivazione del filtraggio dei pacchetti:"
        echo 0 > /proc/sys/net/ipv4/ip_forward
        /sbin/ipchains -X
        /sbin/ipchains -F
        /sbin/ipchains -P input ACCEPT
        /sbin/ipchains -P output ACCEPT
        /sbin/ipchains -P forward ACCEPT
        echo "."
        ;;
    *)
        echo "Uso: /etc/init.d/packetfilter {start|stop}"
        exit 1
        ;;
esac

exit 0

Ci si assicuri che sia eseguito abbastanza presto nella procedura di avvio. Nel mio caso (Debian 2.1), ho creato un link simbolico chiamato `S39packetfilter' nella directory `/etc/rcS.d' (così sarà eseguito prima di S40network).


Avanti Indietro Indice