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.
Controllo. Sicurezza. Vigilanza.
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).
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.
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.
È 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.
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.
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).