Linux IPCHAINS HOWTO
 Paul Russell, [email protected]
 v1.0.7, 12 marzo 1999

 Questo documento intende descrivere come ottenere, installare e con�
 figurare il software di ``enhanced IP firewalling chains'' per Linux,
 ed alcune idee su come si potrebbe usarlo.  Traduzione a cura di Gio�
 vanni Bortolozzo borto at pluto.linux.it.

 1.  Introduzione

 Questo � il Linux IPCHAINS-HOWTO; si veda la Sezione ``Dove?'' per
 conoscere l'indirizzo del sito principale, che contiene l'ultima
 versione.  Si dovrebbe leggere anche il Linux NET-3-HOWTO. L'IP-
 Masquerading HOWTO, il PPP-HOWTO, l'Ethernet-HOWTO ed il Firewall
 HOWTO possono essere altre letture interessanti (come d'altronde lo
 possono essere le FAQ di alt.fan.bigfoot).


 Se interessa il filtraggio dei pacchetti (packet filtering), si legga
 la Sezione ``Perch�?'', la Sezione ``Come?'' e si dia un'occhiata ai
 titoli nella sezione ``IP Firewalling Chains''.


 Se si sta operando la conversione da ipfwadm, si legga la Sezione
 ``Introduzione'', la sezione ``Come?'' e le appendici nella sezione
 ``Differenze tra ipchains e ipfwadm'' e nella sezione ``L'uso dello
 script `ipfwadm-wrapper'''.


 1.1.  Cos'�?

 Il Linux ipchains � una riscrittura del codice di firewalling IPv4 di
 Linux (il quale era stato rubato principalmente da BSD) e una
 riscrittura di ipfwadm, che a sua volta era, almeno penso, una
 riscrittura di ipfw di BSD.  � richiesto per amministrare il
 filtraggio dei pacchetti IP nelle versioni del kernel di Linux 2.1.102
 e superiori.


 1.2.  Perch�?

 Il vecchio codice di firewalling di Linux non gestisce i frammenti
 (fragment), ha contatori a 32 bit (almeno su Intel), non permette di
 specificare protocolli diversi da TCP, UDP e ICMP, non pu� rendere
 atomiche grosse modifiche, non pu� specificare regole inverse, ha
 qualche scemata e pu� risultare difficile da manipolare (rendendolo
 propenso a errori utente).


 1.3.  Come?

 Attualmente il codice fa parte del kernel a partire dalla versione
 2.1.102.  Per la serie dei kernel 2.0, � necessario scaricare una
 patch dalla pagina web.  Se il proprio kernel 2.0 � pi� recente della
 patch disponibile, una patch pi� vecchia dovrebbe andare bene lo
 stesso; questa parte del kernel 2.0 � piuttosto stabile (eg. la patch
 per il kernel 2.0.34 funziona bene sul kernel 2.0.35).  Poich� la
 patch per il 2.0 � incompatibile con le patch ipportfw e ipautofw, non
 raccomando di applicarla a meno che non si abbia veramente bisogno di
 alcune delle funzionalit� che offre ipchains.





 1.4.  Dove?

 La pagina ufficiale � The Linux IP Firewall Chains Page
 <http://www.rustcorp.com/linux/ipchains>


 Esiste una mailing list per le segnalazioni di bug, discussione,
 sviluppo e uso.  � possibile associarsi alla mailing list inviando un
 messaggio contente la parola ``subscribe'' a ipchains-request a
 rustcorp.com.  Per inviare mail alla lista si usi `ipchains' invece di
 `ipchains-request'.


 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 a 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?

 2.3.1.  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.


 2.3.2.  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
 <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.


 2.3.3.  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).


 3.  Sono confuso!  Instradamento, masquerading, portforwarding, ipaut�
 ofw...

 Questo HOWTO � sul filtraggio dei pacchetti.  Ci� significa decidere
 quando un pacchetto debba avere o meno il permesso di passare.
 Comunque, essendo Linux il campo giochi degli hacker, si vorr�
 probabilmente fare qualcosina di pi�.


 Un problema � che lo stesso strumento (``ipchains'') � usato per
 controllare anche il masquerading e il proxy trasparente, sebbene
 queste siano nozionalmente diverse dal filtraggio dei pacchetti
 (l'implementazione corrente di Linux innaturalmente le fonde insieme,
 dando l'impressione che siano strettamente collegate).


 Il masquerading ed il proxy sono trattati da altri HOWTO, mentre le
 caratteristiche auto forwading e port forwarding sono controllate da
 altri strumenti, ma poich� la gente continua a domandarmene, includer�
 un insieme di scenari comuni ed indicher� quando ognuno possa essere
 applicato.  I meriti di sicurezza di ciascuna configurazione non
 saranno qui discussi.




 3.1.  Le tre linee guida di Rusty al masquerading

 Si assume che la propria interfaccia esterna si chiami `ppp0'.  Si usi
 ifconfig per scoprire qual'� e si aggiusti il tutto a proprio gusto.



      # ipchains -P forward DENY
      # ipchains -A forward -i ppp0 -j MASQ
      # echo 1 > /proc/sys/net/ipv4/ip_forward





 3.2.  Promozione gratuita: WatchGuard

 I firewall si possono anche comprare.  Uno eccellente � il FireBox
 della WatchGuard.  � eccellente perch� mi piace, � sicuro, � basato su
 Linux e anche perch� quelli della WatchGuard sovvenzionano il
 mantenimento di ipchains e del nuovo codice di firewall (atteso per il
 2.3).  In breve, la WatchGuard mi sta pagando da mangiare mentre
 lavoro per voi.  Quindi vi invito a considerare i loro prodotti.

 http://www.watchguard.com <http://www.watchguard.com>


 3.3.  Configurazioni comuni di firewall

 Supponiamo che si amministri il dominio littlecorp.com.  Si ha una
 rete interna e una sola connessione in dialup (PPP) verso Internet
 (firewall.littlecorp.com che � 1.2.3.4).  Si usa Ethernet nella
 propria rete locale e la propria macchina personale si chiama
 "myhost".


 Questa sezione illustrer� diversi arrangiamenti comuni.  Li si legga
 attentamente, perch� sono subdolamente diversi uno dall'altro.


 3.3.1.  Rete privata: proxy tradizionale

 In questo scenario, i pacchetti provenienti dalla rete privata non
 traverseranno mai Internet e viceversa.  Gli indirizzi IP della rete
 privata dovranno essere assegnati secondo le Private Network
 Allocations del RFC1597 (ie. 10.*.*.*, 172.16.*.* or 192.168.*.*).


 Il solo modo nel quale ci si potr� mai connettere ad Internet � di
 connettersi al firewall, che � la sola macchina in entrambe le reti
 che pu� uscire dalla rete locale.  Per far questo si pu� eseguire un
 programma (nel firewall) detto proxy (ci sono proxy per FTP, accesso
 al web, telnet, RealAudio, Usenet News e altri servizi).  Si veda il
 Firewall HOWTO.


 Qualsiasi servizio che si vuole sia accessibile da Internet deve
 essere nel firewall (si veda anche ``Servizi interni limitati'' nel
 seguito).


 Esempio: Permettere l'accesso web dalla rete privata ad Internet

 1. Alla rete privata sono assegnati gli indirizzi 192.168.1.*, e in
    particolare a myhost � assegnato il 192.168.1.100 e all'interfaccia
    Ethernet del firewall il 192.168.1.1.
 2. Nel firewall � installato e configurato un proxy web (eg. "squid"),
    ed � in funzione sulla porta 8080.

 3. Il Netscape sulla rete privata � configurato per usare la porta
    8080 del firewall come proxy.

 4. Nel rete privata non serve sia configurato il DNS.

 5. Il DNS deve essere configurato sul firewall.

 6. Nella rete privata non dev'essere configurato nessun instradamento
    predefinito (gateway).


 Netscape su myhost legge http://slashdot.org.

 1. Netscape si connette alla porta 8080 del firewall usando la porta
    1050 su myhost.  Chiede la pagina web di "http://slashdot.org".

 2. Il proxy cerca il nome "slashdot.org" ed ottiene 207.218.152.131.
    Apre una connessione con quell'indirizzo IP (usando la porta 1025
    sull'interfaccia esterna del firewall) e chiede al server web
    (porta 80) la pagina web.

 3. Come il proxy riceve la pagina web dalla sua connessione con il
    server web, copia i dati nella connessione del Netscape.

 4. Netscape mostra la pagina.

 ie.  Dal punto di vista di slashdot.org, la connessione � fatta dalla
 porta 1025 di 1.2.3.4 (l'interfaccia PPP del firewall) verso la porta
 80 di 207.218.152.131 (slashdot.org).  Dal punto di vista di myhost, �
 fatta dalla porta 1050 di 192.168.1.100 (myhost) verso la porta 8080
 di 192.168.1.1 (l'interfaccia Ethernet del firewall).



 3.3.2.  Rete privata: proxy trasparente

 In questo scenario i pacchetti dalla rete privata non traversano mai
 Internet e viceversa.  Gli indirizzi IP della rete privata dovranno
 essere assegnati secondo le Private Network Allocations del RFC1597
 (ie. 10.*.*.*, 172.16.*.* or 192.168.*.*).


 Il solo modo nel quale ci si potr� mai connettere ad Internet � di
 connettersi al firewall, che � la sola macchina in entrambe le reti
 che pu� uscire dalla rete locale.  Per far questo si pu� eseguire un
 programma (nel firewall) detto proxy trasparente; il kernel invia i
 pacchetti al proxy trasparente invece di farli uscire (ie.
 imbastardisce l'instradamento).


 Il proxy fatto in modo trasparente significa che ai client non serve
 sapere che c'� un proxy coinvolto.


 Qualsiasi servizio che si vuole sia accessibile da Internet deve
 essere nel firewall (si veda anche ``Servizi interni limitati'' nel
 seguito).


 Esempio: Permettere l'accesso web dalla rete privata ad Internet

 1. Alla rete privata sono assegnati gli indirizzi 192.168.1.*, e in
    particolare a myhost � assegnato il 192.168.1.100 e all'interfaccia
    Ethernet del firewall il 192.168.1.1.

 2. Nell firewall � installato un proxy web trasparente (credo esistano
    delle patch per squid per permettergli di funzionare in questo
    modo, oppure si usi "transproxy") ed � in funzione sulla porta
    8080.

 3. Usando ipchains al kernel � detto di redirigere  al proxy le
    connessioni dirette alla porta 80.

 4. Netscape nella rete privata � configurato per connettersi
    direttamente.

 5. Nella rete privata dev'essere configurato il DNS (ie. si deve
    eseguire anche un server DNS oltre al proxy sul firewall).

 6. Nella rete privata dev'essere configurato l'instradamento
    predefinito (gateway), in modo da inviare i pacchetti al firewall.


 Netscape su myhost legge http://slashdot.org.

 1. Netscape cerca il nome "slashdot.org" ed ottiene 207.218.152.131.
    Allora apre una connessione verso quell'indirizzo IP usando la
    porta locale 1050 e chiede la pagina web al server web (porta 80).

 2. Come i pacchetti da myhost (porta 1050) verso slashdot.org (porta
    80) passano attraverso il firewall, sono rediretti al proxy
    trasparente in attesa sulla porta 8080.  Il proxy trasparente apre
    una connessione (usando la porta locale 1025) verso la porta 80 di
    207.218.152.131 (che � dove stavano andando i pacchetti originali).

 3. Come il proxy riceve la pagina web dalla sua connessione con il
    server web, copia i dati nella connessione del Netscape.

 4. Netscape mostra la pagina.

 ie.  Dal punto di vista di slashdot.org, la connessione � fatta dalla
 porta 1025 di 1.2.3.4 (l'interfaccia PPP del firewall) verso la porta
 80 di 207.218.152.131 (slashdot.org).  Dal punto di vista di myhost, �
 fatta dalla porta 1050 di 192.168.1.100 (myhost) verso la porta 80 di
 207.218.152.131, ma in realt� sta dialogando con il proxy trasparente.


 3.3.3.  Rete privata: masquerading

 In questo scenario i pacchetti dalla rete privata non traversano mai
 Internet e viceversa.  Gli indirizzi IP della rete privata dovranno
 essere assegnati secondo le Private Network Allocations del RFC1597
 (ie. 10.*.*.*, 172.16.*.* or 192.168.*.*).


 Invece di usare un proxy, usiamo una speciale caratteristica del
 kernel detta "masquerading" (mascheramento, travestimento).  Il
 masquerading riscrive i pacchetti non appena passano per il firewall,
 cos� sembra sempre che provengano dal firewall stesso.  Poi riscrive
 le risposte in modo che sembri provengano dalle fonti originali.


 Il masquerading ha moduli separati per gestire protocolli "banali",
 come FTP, RealAudio, Quake, ecc.  Per protocolli veramenente difficili
 da gestire, la funzione di "auto forwarding" (inoltro automatico) ne
 pu� gestire alcuni automaticamente impostando il port forwarding per
 l'insieme delle porte a loro relative: si veda ``ipportfw'' (kernel
 2.0) o ``ipmasqadm'' (kernel 2.1).

 Qualsiasi servizio che si vuole sia accessibile da Internet deve
 essere nel firewall (si veda anche ``Servizi interni limitati'' nel
 seguito).


 Esempio: Permettere l'accesso web dalla rete privata ad Internet

 1. Alla rete privata sono assegnati gli indirizzi 192.168.1.*, e in
    particolare a myhost � assegnato il 192.168.1.100 e all'interfaccia
    Ethernet del firewall il 192.168.1.1.

 2. Il firewall � impostato per "mascherare" qualsiasi pacchetto
    proveniente dalla rete privata e destinato alla porta 80 di un host
    Internet.

 3. Netscape � configurato per connettersi direttamente.

 4. Nella rete privata dev'essere configurato correttamente il DNS.

 5. Il firewall dovr� essere l'instradamento predefinito (gateway) per
    la rete privata.

 Netscape su myhost legge http://slashdot.org.

 1. Netscape cerca il nome "slashdot.org", ed ottiene 207.218.152.131.
    Allora apre una connessione verso quell'indirizzo IP usando la
    porta locale 1050 e chiede la pagina web al server web (porta 80).

 2. Come i pacchetti da myhost (porta 1050) verso slashdot.org (porta
    80) passano attraverso il firewall, sono riscritti per apparire
    provenienti dall'interfaccia PPP del firewall (porta 65000).   Il
    firewall ha un indirizzo Internet valido (1.2.3.4) e quindi i
    pacchetti di risposta provenienti da slashdot.org vengono
    correttamente instradati indietro.

 3. Come i pacchetti da slashdot.org (port 80) verso
    firewall.littlecorp.com (porta 65000) arrivano, sono riscritti per
    andare alla porta 1050 di myhost.  Questa � la vera magia del
    masquerading: si ricorda quando riscrive pacchetti uscenti e cos�
    pu� riscriverli non appena arrivano le risposte.

 4. Netscape mostra la pagina.

 ie.  Dal punto di vista di slashdot.org, la connessione avviene dalla
 porta 65000 di 1.2.3.4 (l'interfaccia PPP del firewall) verso la porta
 80 di 207.218.152.131 (slashdot.org).  Dal punto di vista di myhost,
 la connessione � fatta dalla porta 1050 di 192.168.1.100 (myhost),
 verso la porta 80 di 207.218.152.131 (slashdot.org).



 3.3.4.  Rete pubblica

 In questo scenario la propria rete personale � parte di Internet: i
 pacchetti possono fluire senza modifiche tra le due reti.  Gli
 indirizzi IP della rete interna devono essere assegnati richiedendo un
 blocco di indirizzi IP, in modo che il resto della rete sappia come
 raggiungerla.  Ci� implica una connessione permanente.


 In tal caso, il filtraggio dei pacchetti � usato per decidere quali
 pacchetti possono essere inoltrati tra la propria rete ed il resto di
 Internet, eg. per restringere il resto di Internet al solo accesso ai
 propri server web interni.


 Esempio: Permettere l'accesso web dalla rete privata verso Internet.

 1. Alla propria rete interna � assegnato un blocco di indirizzi IP che
    si � richiesto (diciamo 1.2.3.*).

 2. Il firewall � impostato per permettere tutto il traffico.

 3. Netscape � configurato per connettersi direttamente.

 4. Nella propria rete dev'essere configurato il DNS.

 5. Il firewall dovr� essere l'instradamento predefinito (gateway) per
    la rete privata.

 Netscape su myhost legge http://slashdot.org.

 1. Netscape cerca il nome "slashdot.org" e ottiene 207.218.152.131.
    Apre poi una connessione verso quel indirizzo IP usando la porta
    locale 1050 e chiede la pagina al server web (porta 80).

 2. I pacchetti passano attraverso il proprio firewall, proprio come
    passano attraverso diversi altri router tra myhost e slashdot.org.

 3. Netscape mostra la pagina.

 ie.  C'� solo una connessione: dalla porta 1050 di 1.2.3.100 (myhost)
 verso la porta 80 di 207.218.152.131 (slashdot.org).


 3.3.5.  Servizi interni limitati

 Ci sono un po' di trucchi che si possono usare per permettere ad
 Internet di accedere ai propri servizi interni, piuttosto che far
 girare i servizi sul firewall.  Funzioneranno solo con un approccio
 basato su proxy o masquerading per le connessioni esterne.


 L'approccio pi� semplice � di usare un "dirottatore" che non � altro
 che un proxy dei poveri, che attenende la connessione su una data
 porta e poi apre una connessione ad una porta fissa di un host interno
 copiando i dati tra le due connessioni.  Un esempio � il programma
 "redir".  Dal punto di vista di Internet, la connessione � fatta verso
 firewall.  Dal punto di vista del server interno la connessione �
 fatta dall'interfaccia interna del firewall al server.


 Un altro approccio (che richiede un kernel 2.0 con la patch per
 ipportfw, oppure un kernel 2.1 o pi� recente) � di usare il port
 forwarding del kernel.  Quest'ultimo fa lo stesso lavoro di "redir" ma
 in modo diverso: il kernel riscrive i pacchetti mentre passano,
 cambiando il loro indirizzo di destinazione e la porta per
 indirizzarli verso l'host interno e la relativa porta.  Dal punto di
 vista di Internet, la connessione � fatta verso il firewall.  Dal
 punto di vista del server interno � fatta una connessione diretta tra
 l'host Internet ed il server.


 3.4.  Ulteriori informazioni sul masquerading

 David Ranch ha scritto un eccellente nuovo HOWTO sul masquerading, che
 ha parecchi argomenti in comune con questo HOWTO.  Attualmente lo si
 pu� trovare a

 http://www.ecst.csuchico.edu/~dranch/LINUX/index-LINUX.html#ipmasq


 Presto mi aspetterei di trovarlo sotto gli patrocinio del Linux
 Documentation Project, a http://www.metalab.unc.edu/LDP
 <http://www.metalab.unc.edu/LDP>


 L'home page ufficiale del Masquerading � a

 http://ipmasq.cjb.net <http://ipmasq.cjb.net>



 4.  IP Firewall Chains

 Questa sezione descrive tutto quello che bisogna veramente sapere per
 costruire un filtro di pacchetti che incontri le proprie esigenze.


 4.1.  Come passano i pacchetti attraverso i filtri

 Il kernel parte con tre elenchi di regole; questi elenchi sono detti
 firewall chains (catene firewall) o semplicemente chains (catene).  Le
 tre catene predefinite sono chiamate rispettivamente input (ingresso),
 output (uscita) e forward (inoltro).  Quando arriva un pacchetto
 (diciamo, attraverso la scheda Ethernet) il kernel usa la catena input
 per decidere il suo destino.  Se sopravvive a quel passo, allora il
 kernel decide dove mandare sucessivamente il pacchetto (ci� � detto
 routing (instradamento)).  Se � destinato ad un'altra macchina,
 consulta la catena forward.  Alla fine, appena prima che il pacchetto
 esca, il kernel consulta la catena output.


 Una catena � una lista di regole.  Ogni regola dice ``se
 l'intestazione del pacchetto � fatta cos�, allora questo � quello che
 si deve fare con il pacchetto''.  Se il pacchetto non soddisfa
 (verifica) una regola, allora viene consultata la successiva regola
 nella catena.  Alla fine, se non ci sono altre regole da consultare,
 il kernel guarda la policy (tattica) della catena per decidere cosa
 fare.  In un sistema conscio delle problematiche di sicurezza, questa
 tattica dice al kernel se rifiutare o proibire il pacchetto.


 Per gli amanti dell'arte ASCII, questa figura mostra il percorso
 completo di un pacchetto entrante in una macchina.


         ----------------------------------------------------------------
         |            ACCEPT/                              lo interface |
         v           REDIRECT                  _______                  |
 --> C --> S --> ______ --> D --> ~~~~~~~~ -->|forward|----> _______ -->
     h     a    |input |    e    {Routing }   |Chain  |     |output |ACCEPT
     e     n    |Chain |    m    {Decision}   |_______| --->|Chain  |
     c     i    |______|    a     ~~~~~~~~        |     | ->|_______|
     k     t       |        s       |             |     | |     |
     s     y       |        q       |             v     | |     |
     u     |       v        e       v            DENY/  | |     v
     m     |     DENY/      r   Local Process   REJECT  | |   DENY/
     |     v    REJECT      a       |                   | |  REJECT
     |   DENY               d       --------------------- |
     v                      e -----------------------------
    DENY


 Di seguito una descrizione di ogni stadio:



    Checksum:
       Questo � il test per verificare che il pacchetto non sia in
       qualche modo corrotto.  Se lo �, � rifiutato.


    Sanity:
       In realt� c'� una verifica di integrit� del pacchetto prima di
       ogni catena firewall, ma quello della catena input � il pi�
       importante.  Alcuni pacchetti malformati possono confondere il
       codice per il controllo delle regole, e quindi sono qui
       rifiutati (se ci� avviene � stampato un messaggio nel syslog).


    input chain:
       � la prima catena firewall contro la quale viene testato il
       pacchetto.  Se il verdetto della catena non � DENY o REJECT, il
       pacchetto prosegue.


    Demasquerade:
       Se il pacchetto � una risposta (reply) ad un precedente
       pacchetto "mascherato", � "demascherato" e passa direttamente
       alla catena output.  Se non si usa L'IP Masquerading si cancelli
       questo percorso dal diagramma.


    Routing decision:
       Il codice di instradamento esamina il campo di destinazione per
       decidere se questo pacchetto deve andare ad un processo locale
       (si veda Local process qui sotto) o inoltrato ad una macchina
       remota (si veda forward chain pi� avanti)


    Local process:
       Un processo in esecuzione sulla macchina pu� ricevere pacchetti
       dopo il passo di Routing Decision, e pu� inviare pacchetti (che
       passano per il passo Routing Decision, e poi attraversano la
       catena output).


    lo interface:
       Se i pacchetti provenienti da un processo locale sono destinati
       ad un processo locale, attraverseranno la catena output con il
       campo interfaccia impostato a `lo', e poi ritornano attraverso
       la catena input sempre con interfaccia impostato a `lo'.
       L'interfaccia lo � solitamente chiamata interfaccia loopback.


    local:
       Se il pacchetto non era stato creato da un processo locale,
       allora � esaminata la catena forward, altrimenti il pacchetto va
       verso la catena output.


    forward chain:
       Questa catena � attraversata da qualsiasi pacchetto che provi a
       passare attraverso questa macchina per andare verso un'altra.


    output chain:
       Questa catena � attraversata da qualsiasi pacchetto un attimo
       prima di essere spedito fuori.




 4.1.1.  Usare ipchains

 Per prima cosa si controlli di avere la versione di ipchains a cui fa
 riferimento questo documento:



      $ ipchains --version
      ipchains 1.3.9, 17-Mar-1999





 Si noti che io raccomando la 1.3.4 (che non ha le opzioni lunghe, come
 `--sport'), o la 1.3.8 o superiori; queste sono molto stabili.


 ipchains ha una pagina man piuttosto dettagliata (man ipchains), e se
 servono ulteriori dettagli o particolari, si pu� dare un'occhiata
 all'interfaccia di programmazione (man 4 ipfw), oppure al file
 net/ipv4/ip_fw.c nei sorgenti dei kernel 2.1.x, che sono (ovviamente)
 le fonti pi� autorevoli.


 Nel pacchetto sorgente c'� pure una eccellente scheda di riferimento
 rapido di Scott Bronson, in PostScript(TM) sia in formato A4 che US
 Letter.


 Ci sono parecchie cose diverse che si possono fare con ipchains.  Per
 prima cosa le operazioni per gestire intere catene.  Si parte con tre
 catene predefinite input, output e forward che non possono essere
 cancellate.


 1. Creare una nuova catena (-N).

 2. Cancellare una catena vuota (-X).

 3. Cambiare la tattica per una catena predefinita (-P).

 4. Elencare le regole in una catena (-L).

 5. Svuotare una catena delle sue regole (-F).

 6. Azzerare i contatori di pacchetti e byte per tutte le regole in una
    catena (-Z).

 Ci sono diversi modi per manipolare le regole in una catena:


 1. Aggiungere una nuova regola ad una catena (-A).

 2. Inserire in una posizione specifica una nuova regola in una catena
    (-I).

 3. Rimpiazzare una regola in una qualche posizione in una catena (-R).

 4. Cancellare da una posizione specifica una regola da una catena
    (-D).

 5. Cancellare da una catena la prima regola corrispondente (-D).

 Ci sono alcune operazioni per il masquerading, che, in mancanza di un
 posto migliore dove metterle, sono in ipchains:
 1. Elenca le connessioni attualmente mascherate (-M -L).

 2. Imposta i valori di timeout del masquerading (-M -S) (si veda anche
    ``Non posso impostare i timeout del masquerading!'').

 La funzione finale (e forse la pi� utile) permette di controllare cosa
 succederebbe ad un dato pacchetto se volesse traversare una data
 catena.


 4.1.2.  Operazioni su una sola regola

 Questa � la ragione di sussistenza di ipchains: la manipolazione delle
 regole.  Molto probabilmente si useranno i comandi di aggiunta (-A) e
 cancellazione (-D).  Gli altri (-I per l'inserimento e -R per il
 rimpiazzo) sono semplici estensioni di questi concetti.


 Ogni regola specifica un insieme di condizioni che il pacchetto deve
 soddisfare, e cosa fare se il pacchetto le soddisfa (un "obiettivo").
 Per esempio, si possono voler proibire tutti i pacchetti ICMP
 provenienti dall'indirizzo 127.0.0.1.  Quindi in questo caso le nostre
 condizioni sono che il protocollo deve essere ICMP e che l'indirizzo
 di provenienza deve essere 127.0.0.1.  Il nostro obiettivo � `DENY'.


 127.0.0.1 � l'interfaccia `loopback', presente anche se non si
 possiede una vera connessione di rete.  Si pu� usare il programma
 `ping' per generare tali pacchetti (semplicemente invia un pacchetto
 ICMP di tipo 8 (echo request) al quale tutti gli host cooperativi
 dovrebbero rispondere obbligatoriamente con un pacchetto ICMP di tipo
 0 (echo reply)).  Ci� lo rende molto utile per i test.



      # ping -c 1 127.0.0.1
      PING 127.0.0.1 (127.0.0.1): 56 data bytes
      64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms

      --- 127.0.0.1 ping statistics ---
      1 packets transmitted, 1 packets received, 0% packet loss
      round-trip min/avg/max = 0.2/0.2/0.2 ms
      # ipchains -A input -s 127.0.0.1 -p icmp -j DENY
      # ping -c 1 127.0.0.1
      PING 127.0.0.1 (127.0.0.1): 56 data bytes

      --- 127.0.0.1 ping statistics ---
      1 packets transmitted, 0 packets received, 100% packet loss
      #




 Si pu� vedere che il primo ping ha successo (il `-c 1' dice a ping di
 inviare un solo pacchetto).


 Poi si � aggiunta alla catena `input' una regola che specifica che per
 i pacchetti provenienti da 127.0.0.1 (`-s 127.0.0.1') con protocollo
 ICMP (`-p ICMP') si dovr� saltare a DENY (`-j DENY').


 Poi si � verificata la nostra regola, usando un secondo ping.  Ci sar�
 una pausa prima che il programma si stanchi di aspettare una risposta
 che non arriver� mai.

 Si pu� cancellare la regola in due modi.  Per prima cosa, poich�
 sappiamo che � la sola regola nella catena input, possiamo usare la
 cancellazione in base alla posizione, come in


              # ipchains -D input 1
              #




 per cancellare la regola numero 1 nella catena input.


 Il secondo modo � di ricopiare il comando -A precedente, rimpiazzando
 -A con -D.  Ci� � utile quando si ha una complessa catena di regole e
 non si vuole star l� a contarle per scoprire che quella che si vuole
 cancellare � la 37-esima.  In tal caso useremo:


              # ipchains -D input -s 127.0.0.1 -p icmp -j DENY
              #




 La sintassi di -D deve avere esattamente le stesse opzioni del comando
 -A (o -I oppure -R).  Se c'� una multitudine di regole identiche nella
 stessa catena, � cancellata solo la prima.


 4.1.3.  Specificare il filtraggio

 Si � visto l'uso di `-p' per specificare il protocollo e di `-s' per
 specificare l'indirizzo di provenienza, ma ci sono altre opzioni che
 si possono usare per specificare le caratteristiche del pacchetto.
 Quel che segue � un compendio esaustivo.


 4.1.3.1.  Specificare gli indirizzi di provenienza e destinazione

 Gli indirizzi IP di provenienza (-s) e destinazione (-d) possono
 essere specificati in quattro modi.  Il modo pi� comune � di usare il
 nome completo, come `localhost' o `www.linuxhq.com'.  Il secondo modo
 � di specificare l'indirizzo IP, come ad esempio `127.0.0.1'.


 Il terzo ed il quarto modo permettono di specificare un gruppo di
 indirizzi IP, come ad esempio `199.95.207.0/24' o
 `199.95.207.0/255.255.255.0'.  Entrambi specificano un qualsiasi
 indirizzo IP tra 192.95.207.0 e 192.95.207.255 estremi inclusi; le
 cifre dopo `/' dicono quali parti dell'indirizzo IP sono
 significative.  I valori predefiniti sono `/32' o `/255.255.255.255'
 (corrispondenti a tutti gli indirizzi IP).  Per specificare nessun
 indirizzo IP pu� essere usato `/0', come segue:


              # ipchains -A input -s 0/0 -j DENY
              #




 Questa cosa � raramente usata, in quanto il suo effetto � lo stesso
 che non specificare affatto l'opzione `-s'.

 4.1.3.2.  Specificare una negazione

 Molte opzioni, tra le quali `-s' e `-d', possono avere gli argomenti
 preceduti da `!' (pronunciato `not') per effettuare la corrispondenza
 con indirizzi NON uguali a quelli dati.  Per esempio, `-s ! localhost'
 corrisponde a qualsiasi pacchetto non proveniente da localhost.


 4.1.3.3.  Specificare un protocollo

 Il protocollo pu� essere specificato con l'opzione `-p'.  Il
 protocollo pu� essere un numero (se si conoscono i valori numerici dei
 protocolli IP) o un nome per i casi speciali di `TCP', `UDP' o `ICMP'.
 Non � importante come � scritto: vanno bene sia `tcp' che `TCP'.


 I nomi dei protocolli possono essere preceduti da un `!' per negarli,
 con ad esempio `-p ! TCP'.


 4.1.3.3.1.  Specificare porte UDP e TCP

 Nei casi particolari nei quali � specificato TCP o UDP come
 protocollo, ci pu� essere un argomento aggiuntivo che indica la porta
 TCP e UDP, oppure un intervallo (inclusivo) di porte (si veda anche
 ``Gestire i frammenti'' nel seguito).  Un intervallo � rappresentato
 usando un carattere `:', come ad esempio `6000:6010', che copre 11
 numeri di porte da 6000 a 6010 estremi compresi.  Se � omesso il
 limite inferiore, il valore predefinito � 0.  Se � omesso quello
 superiore, il suo valore predefinito � 65535.  Quindi per specificare
 le connessioni TCP provenienti da porte inferiori alla 1024, la
 sintassi potrebbe essere `-p TCP -s 0.0.0.0/0 :1023'.  I numeri di
 porta possono essere specificati anche attraverso il nome, eg. `www'.


 Si noti che la specificazione pu� essere preceduta da un `!', che la
 nega.  Quindi per specificare qualsiasi pacchetto TCP TRANNE i
 pacchetti WWW, si potrebbe specificare

 -p TCP -d 0.0.0.0/0 ! www



 � importante realizzare che la specifica


 -p TCP -d ! 192.168.1.1 www



 � molto diversa da

 -p TCP -d 192.168.1.1 ! www



 La prima specifica qualsiasi pacchetto TCP verso la porta WWW su
 qualsiasi macchina tranne la 192.168.1.1.  La seconda specifica
 qualsiasi connessione TCP verso qualsiasi porta di 192.168.1.1 tranne
 la porta WWW.


 Per finire, questo caso indica di escludere sia la porta WWW e che
 192.168.1.1:


 -p TCP -d ! 192.168.1.1 ! www




 4.1.3.3.2.  Specificare tipo e codice ICMP

 Anche ICMP permette argomenti opzionali, ma poich� ICMP non ha le
 porte (ICMP ha un tipo e un codice) hanno un significato diverso.


 Possono essere specificati come nomi ICMP (si usi ipchains -h icmp per
 la lista di nomi) dopo l'opzione `-s', oppure come tipo e codice ICMP
 numerici, dove il tipo segue l'opzione `-s' e il codice segue
 l'opzione `-d'.


 I nomi ICMP sono piuttosto lunghi: basta usare solamente abbastanza
 lettere da rendere il nome distinguibile da ogni altro.


 Di seguito una piccola tabella dei pi� comuni pacchetti ICMP:


      Numero  Nome                     Richiesto da

      0       echo-reply               ping
      3       destination-unreachable  qualsiasi traffico TCP/UDP.
      5       redirect                 per l'instradamento, se non sta girando
                                       il demone di instradamento
      8       echo-request             ping
      11      time-exceeded            traceroute




 Si noti che i nomi ICMP al momento non possono essere preceduti da
 `!'.


 NON NON NON si blocchino tutti i messaggi ICMP di tipo 3!  (si veda
 ``Pacchetti ICMP'' pi� avanti).


 4.1.3.4.  Specificare un'interfaccia

 L'opzione `-i' specifica il nome di un'interfaccia.  Un'interfaccia �
 il dispositivo fisico dal quale entra o esce il pacchetto.  Si pu�
 usare il comando ifconfig per avere un elenco delle interfacce che al
 momento sono `s�' (ie. che al momento funzionano).


 L'interfaccia per i pacchetti in arrivo (ie. i pacchetti che stanno
 attraversando la catena input) � considerata essere l'interfaccia
 dalla quale entrano.  Logicamente, l'interfaccia per i pacchetti in
 partenza (i pacchetti che stanno attraversando la catena output) �
 l'interfaccia dalla quale usciranno.  Anche l'interfaccia per i
 pacchetti che passano per la catena forward � l'interfaccia dalla
 quale usciranno; a me sembra una decisione piuttosto arbitraria.


 � perfettamente legale specificare un'interfaccia che al momento non
 esiste; la regola non sar� mai soddisfatta finch� l'interfaccia non
 viene attivata.  Ci� � estremamente utile per le connessioni PPP in
 dial-up (solitamente l'interfaccia ppp0) e simili.

 Come caso speciale, un nome di intefaccia che termina con un `+'
 corrisponder� a tutte le interfacce (che esistano o meno) che iniziano
 con quella stringa.  Per esempio, per specificare una regola che
 corrisponda a tutte le interfacce PPP, pu� essere usata l'opzione -i
 ppp+.


 Il nome dell'interfaccia pu� essere preceduto da un `!' per far s� che
 sia soddisfatta da tutte le interfacce che NON corrispondono
 all'interfaccia (o alle interfacce) specificata.


 4.1.3.5.  Specificare solo pacchetti TCP SYN

 Talvolta � utile permettere connessioni TCP in una direzione, ma non
 nell'altra.  Per esempio, si pu� voler permettere connessioni verso un
 server WWW esterno ma non le connessioni da quel server.


 L'approccio naive sarebbe quello di bloccare i pacchetti TCP
 provenienti da server.  Sfortunantamente, le connessioni TCP
 richiedono per funzionare che i pacchetti possono andare in entrambe
 le direzioni.


 La soluzione � di bloccare solo i pacchetti usati per richiedere una
 connessione.  Questi pacchetti sono chiamati pacchetti SYN (ok,
 tecnicamente sono pacchetti con il flag SYN impostato, e i campi FIN e
 ACK non attivati, ma li chiameremo lo stesso pacchetti SYN).  Non
 permettendo solamente questi pacchetti, si possono fermare i tentativi
 di connessione.


 Per questo viene usata l'opzione `-y': � valida solamente per regole
 che specificano TCP come loro protocollo.  Per esempio, per
 specificare un tentativo di connessione TCP da 192.168.1.1:

 -p TCP -s 192.168.1.1 -y




 Ancora una volta, questa opzione pu� essere negata precedendola con un
 `!' che significa tutti pacchetti tranni quelli per iniziare la
 connessione.


 4.1.3.6.  Gestire i frammenti

 Qualche volta un pacchetto � troppo grande per passarci tutto intero
 nel cavo.  Quando questo succede, il pacchetto � diviso in frammenti
 (fragments), ed inviato come pacchetti multipli.  L'altro capo della
 connessione riassembla i pacchetti per ricostruire il pacchetto
 intero.


 Il problema con i frammenti � che alcune delle specificazioni suddette
 (in particolare porta d'origine, porta di destinazione, tipo ICMP,
 codice ICMP o flag SYN TCP) richiedono che il kernel sbirci nella
 parte iniziale del pacchetto, che � contenuta solo nel primo
 frammento.


 Se le propria macchina � la sola connessione ad una rete esterna,
 allora si pu� dire al kernel di riassemblare tutti i frammenti che gli
 passano attraverso, compilando il kernel con l'opzione IP: always
 defragment posta a `Y'.  Ci� evita il problema in maniera pulita.


 Diversamente, � importante capire come sono trattati i frammenti dalle
 regole di filtraggio.  Qualsiasi regola di filtraggio che chiede
 informazioni che non si hanno non verr� soddisfatta.  Ci� significa
 che il primo frammento � trattato come qualsiasi altro pacchetto.  Non
 lo saranno invece il secondo e i successivi frammenti.  Quindi una
 regola -p TCP -s 192.168.1.1 www (specificante una porta sorgente
 `www') non sar� mai soddisfatta da un frammento (tranne al primo).  E
 neppure la regola opposta -p TCP -s 192.168.1.1 ! www.


 Comunque, si pu� specificare una regola specifica per il secondo e i
 successivi frammenti, usando l'opzione `-f'.  Ovviamente in questa
 regola per i frammenti � illegale specificare una porta TCP o UDP, un
 tipo o un codice ICMP oppure l'opzione per il SYN TCP.


 � pure legale specificare che una regola non si applica al secondo e
 ai successivi frammenti, precendendo il `-f' con `!'.


 Solitamente � considerata una cosa sicura lasciar passare il secondo e
 i successi frammenti, poich� il filtraggio avr� effetto sul primo
 frammento e quindi preverr� la ricostruzione nell'host di
 destinazione.  Comunque, sono noti alcuni bug che permettono il crash
 di macchine semplicemente inviandogli frammenti.


 Una nota per i capoccioni della rete: i pacchetti malformati
 (pacchetti TCP, UDP o ICMP troppo corti affinch� il codice di
 firewalling possa leggere le porte o il codice e tipo ICMP) sono
 trattati come frammenti.  Solo i frammenti TCP che iniziano alla
 posizione 8 sono esplicitamente scartati dal codice di firewall
 (dovrebbe apparire un messaggio nel syslog se succede questo).


 Come esempio, la regola seguente scarter� qualsiasi frammento diretto
 a 192.168.1.1:




      # ipchains -A output -f -d 192.168.1.1 -j DENY
      #





 4.1.4.  Effetti collaterali del filtraggio

 OK, quindi ora si conoscono tutti i modi con i quali si pu� creare una
 regola che corrisponda ad un pacchetto.  Se un pacchetto soddisfa una
 regola, succedono le seguenti cose:


 1. Il contatore di byte per quella regola � incrementato della
    dimensione del pacchetto (intestazione e tutto il resto).

 2. � incrementato il contatore di pacchetti per quella regola.

 3. Se la regola lo richiede, il pacchetto � registrato.


 4. Se la regola lo richiede, � cambiato il campo Type Of Service del
    pacchetto.

 5. Se la regola lo richiede, il pacchetto � marcato (non nei kernel
    della serie 2.0).

 6. � esaminata la regola obiettivo per decidere cosa fare dopo al
    pacchetto.


 Per variet�, le esaminer� in ordine di importanza.


 4.1.4.1.  Specificare un obiettivo

 Un obiettivo dice al kernel cosa farne di un pacchetto che soddisfa
 una regola.  ipchains usa `-j' (penso `jump-to' - salta a) per la
 specifica dell'obiettivo.  Il nome dell'obiettivo deve essere pi�
 corto di 8 caratteri, ed � importante come � scritto: "RETURN" e
 "return" sono completamente diversi.


 Il caso pi� semplice � quando non � specificato alcun obiettivo.
 Questo tipo di regola (spesso detta regola di `accounting' -
 contabilit�) � utile con contare semplicemente un certo tipo di
 pacchetto.  Che questa regola sia o meno soddisfatta, semplicemente il
 kernel esamina la regola successiva nella catena.  Per esempio, per
 contare il numero di pacchetti da 192.168.1.1, si pu� fare cos�:


      # ipchains -A input -s 192.168.1.1
      #





 (Usando `ipchains -L -v' si possono vedere i contatori di byte e
 pacchetti associati con ciascuna regola).


 Esistono sei obiettivi speciali.  I primi tre, ACCEPT, REJECT e DENY
 sono piuttosto semplici.  ACCEPT permette che il pacchetto passi.
 DENY scarta il pacchetto come non fosse mai stato ricevuto.  REJECT
 scarta il pacchetto, ma (se non � un pacchetto ICMP) genera una
 risposta ICMP per la sorgente per dirle che la destinazione non �
 raggiungibile.


 Quella dopo, MASQ dice al kernel di mascherare il pacchetto.  Affinch�
 ci� funzioni, il proprio kernel dev'essere compilato con il supporto
 per l'IP Masquerading.  Per i dettagli si veda il Masquerading-HOWTO e
 l'appendice ``Differenze tra ipchains e ipfwadm''.  Questo obiettivo �
 valido solo per pacchetti che attraversano la catena forward.


 L'altro obiettivo principale � REDIRECT che dice al kernel di inviare
 un pacchetto ad una porta locale invece di dove era destinato ad
 andare.  Pu� essere specificato solo per regole che specificano TCP o
 UDP come loro protocolli.  Opzionalmente, pu� essere specificata una
 porta (nome o numero) dopo di `-j REDIRECT' che far� s� che quel
 pacchetto sia dirottato a quella particolare porta anche se era
 indirizzato ad un'altra porta.  Questo obiettivo � valido solo per
 pacchetti che attraversano la catena input.


 L'obiettivo finale speciale � RETURN che � identico all'uscita
 immediata dalla catena (si veda ``Impostare la tattica'' nel seguito).


 Qualsiasi altro obiettivo indica una catena definita dall'utente (come
 descritto in ``Operazione con intere catene'' nel seguito).  Il
 pacchetto inizier� ad attraversare le regole in quella catena.  Se
 quella catena non decide il destino del pacchetto, allora, una volta
 che � terminata la traversata della catena, si riprende dalla regola
 successiva nella catena corrente.


 � ora di un altro po' arte ASCII.  Si considerino due catene
 (sciocche): input (la catena predefinita) e Test (una catena definita
 dall'utente).


          `input'                           `Test'
         ------------------------------  ------------------------------
         | Regola1: -p ICMP -j REJECT |  | Regola1: -s 192.168.1.1    |
         |----------------------------|  |----------------------------|
         | Regola2: -p TCP -j Test    |  | Regola2: -d 192.168.1.1    |
         |----------------------------|  ------------------------------
         | Regola3: -p UDP -j DENY    |
         ------------------------------




 Si consideri un pacchetto TCP proveniente da 192.168.1.1 e destinato a
 1.2.3.4.  Entra nella catena input e viene controllato rispetto a
 Regola1: non la soddisfa. Soddisfa invece Regola2 il cui obiettivo �
 Test. Quindi la successiva regola ad essere esaminata � la prima di
 Test.  Regola1 in Test � soddisfatta ma non specifica un obiettivo,
 quindi Regola2 � la prossima ad essere esaminata.  Questa non �
 soddisfatta e si � cos� raggiunta la fine delle catena.  Si quindi
 ritorna alla catena input, dove si � appena esaminata Regola2 e quindi
 ora si esamina Regola3, che non viene soddisfatta.


 Quindi il percorso del pacchetto �:

                                   v    ___________________________
          `input'                  |   /  `Test'                  v
         --------------------------|--/  -------------------------|----
         | Regola1                 | /|  | Regola1                |   |
         |-------------------------|/-|  |------------------------|---|
         | Regola2                 /  |  | Regola2                |   |
         |----------------------------|  -------------------------v----
         | Regola3                 /--+___________________________/
         --------------------------|---
                                   v




 Si veda la sezione ``Come organizzare le proprie regole di firewall''
 per alcuni metodi per usare efficacemente le catene definite
 dall'utente.


 4.1.4.2.  Registrazione dei pacchetti

 Questo � un effetto collaterale che pu� avere una regola che viene
 soddisfatta: usando l'opzione `-l' si pu� far s� che il pacchetto che
 la soddisfa sia registrato.  Solitamente questa cosa non la si vuole
 per i pacchetti di routine, ma � una caratteristica utile se si
 vogliono cercare eventi eccezionali.


 Il kernel registra questa informazione come segue:



      Packet log: input DENY eth0 PROTO=17 192.168.2.1:53 192.168.1.1:1025
        L=34 S=0x00 I=18 F=0x0000 T=254




 Questo messaggio di registrazione � pensato per essere conciso e
 contiene informazioni tecniche utili solo ai guru del networking, ma
 pu� essere utile anche al resto di noi.  Si suddivide cos�:


 1. `input' � la catena che contiene la regola soddisfatta dal
    pacchetto, che ha causato il messaggio di log.

 2. `DENY' � quanto la regola dice di fare del pacchetto.  Se � `-'
    allora la regola non ha effetto sul pacchetto (una regola di
    accounting).

 3. `eth0' � il nome dell'interfaccia.  Poich� la catena era la input,
    indica che il pacchetto � entrato da `eth0'.

 4. `PROTO=17' indica che il pacchetto era con protocollo 17.  Un
    elenco dei protocolli � dato in `/etc/protocols'.  I pi� comuni
    sono 1 (ICMP), 6 (TCP) e 17 (UDP).

 5. `192.168.2.1' indica che l'indirizzo IP di provenienza era
    192.168.2.1.

 6. `:53' indica che porta di provenienza era la porta 53.  Cercando in
    `/etc/services' si veda che questa � la porta `domain' (ie.
    probabilmente � una risposta DNS).  Per UDP e TCP questo numero �
    la porta di provenienza.  Per ICMP, � il tipo ICMP.  Per gli altri,
    sar� 65535.

 7. `192.168.1.1' � l'indirizzo IP di destinazione.

 8. `:1025' indica che la porta di destinazione era la 1025.  Per UDP e
    TCP questo numero � la porta di destinazione.  Per ICMP � il codice
    ICMP.  Per gli altri, sar� 65535.

 9. `L=34' indica che il pacchetto era lungo 34 byte.

 10.
    `S=0x00' indica il campo Type of Service (lo si divida per 4 per
    ottenere il Type of Service usato da ipchains).

 11.
    `I=18' � l'ID IP.

 12.
    `F=0x0000' � l'offset a 16 bit del frammento pi� i flag.  Un valore
    che cominci con `0x4' o `0x5' indica che il bit `Don't Fragment' �
    impostato.  `0x2' or `0x3' indicano che � impostato il bit `More
    Fragments'; sono da aspettarsi altri frammenti dopo di questo.  Il
    resto del numero � l'offset, diviso per 8, di questo frammento.

 13.
    `T=254' � il `Time To Live' (tempo di vita) del pacchetto.  �
    diminuito di uno ad ogni hop, e solitamente parte a 15 o 255.

 14.
    `(#5)' ci pu� essere un numero finale tra parentesi nei kernel pi�
    recenti (forse dopo il 2.2.9).  � il numero della regola che ha
    causato la registrazione del pacchetto.


 Nei sistema Linux standard, questo output del kernel � catturato da
 klogd (il demone di registrazione del kernel) che lo passa poi al
 syslogd (il demone di registrazione di sistema).  Il file
 `/etc/syslog.conf' controlla il comportamento di syslogd, specificando
 una destinazione per ogni `facility' (nel nostro caso la facility �
 "kernel") e `livello' (per ipchains, il livello usato � "info").


 Per esempio, il mio /etc/syslog.conf (Debian) contiene due righe
 corrispondenti a `kern.info':



      kern.*                          -/var/log/kern.log
      *.=info;*.=notice;*.=warn;\
              auth,authpriv.none;\
              cron,daemon.none;\
              mail,news.none          -/var/log/messages




 Indica che i messaggi sono duplicati in `/var/log/kern.log' e in
 `/var/log/messages'.  Per maggiori dettagli, si veda `man
 syslog.conf'.


 4.1.4.3.  Manipolare il `Type Of Service'

 Nell'intestazione IP ci sono quattro bit raramente usati, detti bit
 Type of Service (TOS - Tipo Di Servizio).  Influenzano il modo in cui
 sono trattati i pacchetti; i quattro bit sono "Minimum Delay" (Ritardo
 Minimo), "Maximum Throughput" (Massima Velocit� di Trasmissione),
 "Maximum Reliability" (Massima Affidabilit�) e "Minimum Cost" (Minimo
 Costo).  Solo ad uno di questo bit � permesso di essere impostato.
 Rob van Nieuwkerk, l'autore del codice di "maltrattamento" TOS, ne
 parla in questi termini:


      Per me � importante specialmente il "Minimum Delay".  L'ho
      attivato per i pacchetti "interattivi" nel mio router
      (Linux) a monte.  Io sono dietro una connessione modem a
      33k6.  Linux prioritizza i pacchetti in 3 code.  In questo
      modo ottengo accettabili prestazioni interattive mentre fac�
      cio dei meri download (potrebbe andare ancora meglio se non
      ci fosse una coda cos� grande nel driver della seriale, ma
      ora la latenza � mantenuta sotto gli 1.5 secondi).



 Nota: ovviamente, non si ha controllo sui pacchetti in arrivo; si pu�
 controllare la priorit� solamente dei pacchetti che lasciano la
 propria macchina.  Per negoziare le priorit� con l'altro capo della
 connessione, deve essere usato un protocollo tipo RSVP (non so niente
 in proposito, quindi non chiedete a me).



 L'uso pi� comune � di impostare le connessioni di controllo di telnet
 e ftp a "Minimum Delay" e quelle dati FTP a "Maximum Throughput".  Ci�
 pu� essere fatto come segue:



      ipchains -A output -p tcp -d 0.0.0.0/0 telnet -t 0x01 0x10
      ipchains -A output -p tcp -d 0.0.0.0/0 ftp -t 0x01 0x10
      ipchains -A output -p tcp -s 0.0.0.0/0 ftp-data -t 0x01 0x08





 L'opzione `-t' accetta altri due parametri addizionali, entrambi in
 esadecimale.  Questi permettono di far giochetti complessi con i bit
 TOS: con la prima maschera � fatta l'AND con i TOS correnti del
 pacchetto, e poi del risultato viene fatta l'XOR con la seconda.  Se �
 troppo confuso, allora si usi semplicemente la tabella seguente:



      Nome del TOS            Valore          Uso Tipico

      Minimum Delay           0x01 0x10       ftp, telnet
      Maximum Throughput      0x01 0x08       ftp-data
      Maximum Reliability     0x01 0x04       snmp
      Minimum Cost            0x01 0x02       nntp




 Andi Kleen puntualizza quanto segue:

      Forse potrebbe essere utile aggiungere riferimenti al para�
      mentro txqueuelen di ifconfig alla discussione dei bit TOS.
      La lunghezza predefinita della coda del dispositivo, rego�
      lata per le schede ethernet, per i modem � troppo lunga e fa
      s� che lo schedulatore a 3 bande (le cui code sono basate
      sui TOS) funzioni in maniera subottima.  � una buona idea
      impostarla ad un valore tra 4 e 10 per le connessioni via
      modem o ISDN a canale b singolo.  Questo � un problema dei
      kernel 2.0 e 2.1, ma mentre nei 2.1 esiste un'opzione di
      ifconfig (nei nettools recenti), nei 2.0 � necessaria una
      patch ai sorgenti dei device driver.


 Quindi, per vedere i massimi benefici dalla manipolazione dei TOS
 nella connessioni PPP via modem, si usi `ifconfig $1 txqueuelen' nel
 proprio script /etc/ppp/ip-up.  Il numero da usare dipende dalla
 velocit� del modem e dalla dimesione del buffer nel modem; Andi ci
 mostra ancora la direzione da seguire:


      Il miglior valore per una data configurazione si determina
      sperimentalmente.  Se la coda � troppo corta in un router
      allora saranno scartati i pacchetti.  Naturalmente si trag�
      gono benefici anche senza la riscrittura dei TOS, solo che
      la riscrittura dei TOS aiuta a dare beneficio ai programmi
      non cooperativi (tutti i programmi standard di Linux sono
      cooperativi).





 4.1.4.4.  Marcare un pacchetto

 Ci� permette una complessa e potente iterazione con la nuova
 implementazione di `Quality of Service' di Alexey Kuznetsov e con il
 forwading basato sulla marcatura degli ultimi kernel della serie 2.1.
 Dar� maggiori informazioni non appena ne verr� in possesso.  Questa
 opzione � ignorata nei kernel della serie 2.0.


 4.1.4.5.  Operazioni su un'intera catena

 Una caratteristica molto utile di ipchains � la possibilit� di
 raggruppare regole collegate dentro catene.  Si possono chiamare le
 catene come si vuole a meno che il nome non sia in conflitto con le
 catene (input, output e forward) o gli obiettivi (MASQ, REDIRECT,
 ACCEPT, DENY, REJECT o RETURN) predefiniti.  Suggerisco di evitare in
 toto l'uso di etichette in maiuscolo, in quanto le potrei usare per
 estensioni future.  Il nome della catena pu� essere lungo fino a 8
 caratteri.


 4.1.4.6.  Creare una nuova catena

 Suvvia creiamo una nuova catena!  Poich� sono un tipo con un sacco di
 immaginazione, la chiamer� test.



      # ipchains -N test
      #





 Tutto qua.  Ora le si possono mettere dentro le regole come spiegato
 in precedenza.


 4.1.4.7.  Cancellare una catena

 Anche cancellare una catena � semplice.



      # ipchains -X test
      #




 Perch� `-X'?  Beh, tutte le altre lettere buone erano gi� occupate.


 Ci sono un paio di restrizioni sulla cancellazione di una catena: deve
 essere vuota (si veda ``Svuotare una catena'' nel seguito) e non deve
 essre l'obiettivo di nessuna regola.  Non � possibile cancellare
 nessuna delle tre catene predefinite.


 4.1.4.8.  Svuotare una catena

 C'� un modo semplice per svuotare una catena di tutte le regole,
 usando il comando `-F' (flush).


              # ipchains -F forward
              #





 Se non si specifica una catena, allora saranno svuotate tutte le
 catene.


 4.1.4.9.  Elencare le regole in una catena

 Si possono elencare tutte le regole in una catena usando il comando
 `-L' (list).



      # ipchains -L input
      Chain input (refcnt = 1): (policy ACCEPT)
      target     prot opt    source                destination           ports
      ACCEPT     icmp -----  anywhere              anywhere              any
      # ipchains -L test
      Chain test (refcnt = 0):
      target     prot opt    source                destination           ports
      DENY       icmp -----  localnet/24           anywhere              any
      #





 Il valore di `refcmt' mostrato per test � il numero di regole che
 hanno test come loro obiettivo.  Deve essere zero (e la catena essere
 vuota) prima che si possa cancellarla.


 Se � omesso il nome della catena, sono elencate tutte le catene, anche
 quelle vuote.


 Ci sono tre opzioni che possono accompagnare `-L'.  L'opzione `-n'
 (numeric) � molto utile in quanto previene ipchains dal tentativo di
 ricercare gli indirizzi IP, che (se si usa un DNS come fanno molti)
 causer� parecchio ritardo se il proprio DNS non � configurato
 correttamente, o si sono filtrate tutte le richieste DNS.  Inoltre fa
 s� che le porte siano mostrate come numeri piuttosto che con i loro
 nomi.


 L'opzione `-v' mostra tutti i dettagli delle regole, come i contatori
 di pacchetti e byte, le maschere TOS, l'interfaccia e la marcatura dei
 pacchetti.  Diversamente questi valori sono omessi.  Per esempio:



      # ipchains -v -L input
      Chain input (refcnt = 1): (policy ACCEPT)
       pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
         10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any






 Si noti che i contatori di pacchetti e byte sono mostrati usando i
 suffissi `K', `M' o `G' rispettivamente per 1000, 1000000 e
 1000000000.  Usando l'opzione `-x' (espandi i numeri) verranno
 mostrati i numeri interi, senza preoccuparsi di quanto grandi siano.


 4.1.4.10.  Azzerare i contatori

 � utile poter azzerare i contatori.  Ci� pu� essere fatto con
 l'opzione `-Z' (zero counters).  Per esempio:



      # ipchains -v -L input
      Chain input (refcnt = 1): (policy ACCEPT)
       pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
         10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any
      # ipchains -Z input
      # ipchains -v -L input
      Chain input (refcnt = 1): (policy ACCEPT)
       pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
          0     0 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any
      #





 Il problema con questo approccio � che talvolta serve sapere il valore
 dei contatori un attimo prima di azzerarli.  Nell'esempio precedente,
 tra i comandi `-L' e `-Z' potrebbero essere passati degli altri
 pacchetti.  Per questa ragione, si possono usare `-L' and `-Z'
 assieme, per azzerare i contatori mentri li si legge.
 Sfortunatamente, se si fa cos�, non si pu� operare su una sola catena:
 si devono mostrare e azzerare tutte le catene in una volta.



      # ipchains -L -v -Z
      Chain input (policy ACCEPT):
       pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
         10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any

      Chain forward (refcnt = 1): (policy ACCEPT)
      Chain output (refcnt = 1): (policy ACCEPT)
      Chain test (refcnt = 0):
          0     0 DENY       icmp ----- 0xFF 0x00  ppp0                  localnet/24           anywhere              any
      # ipchains -L -v
      Chain input (policy ACCEPT):
       pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
         10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any

      Chain forward (refcnt = 1): (policy ACCEPT)
      Chain output (refcnt = 1): (policy ACCEPT)
      Chain test (refcnt = 0):
          0     0 DENY       icmp ----- 0xFF 0x00  ppp0                  localnet/24           anywhere              any
      #





 4.1.4.11.  Impostare la tattica

 Si � visto cosa succede quando un pacchetto raggiunge la fine di una
 catena predefinita quando si � discusso come un pacchetto cammina
 attraverso una catena in ``Specificare un obiettivo''.  In questo
 caso, la tattica (policy) di una catena determina il destino del
 pacchetto.  Solo le catene predefinite (input, output e forward) hanno
 delle tattiche, poich� se un pacchetto cade fuori dalla fine di una
 catena definita dall'utente, la traversata riprende nelle catena
 precedente.


 La tattica pu� essere una qualsiasi dei primi quattro obiettivi
 speciali: ACCEPT, DENY, REJECT o MASQ.  MASQ � valida solamente per la
 catena `forward'.


 Inoltre � importante notare che un obiettivo RETURN in una regola in
 una delle catene predefinite � utile per stabilire esplicitamente la
 tattica di una catena quando un pacchetto soddisfa una regola.


 4.1.5.  Operazioni sul masquerading

 Ci sono diversi parametri per l'IP Masquerading con i quali si pu�
 giocare.  Sono inglobati in ipchains perch� non valeva la pena
 scrivere uno strumento separato (anche se questa cosa cambier�).


 Il comando per il masquerading IP � `-M', e pu� essere combinato con
 `-L' per mostrare l'elenco delle connessioni attualmente mascherate, o
 con `-S' per impostare i parametri del masquerading.


 Il comando `-L' pu� essere accompagnato da `-n' (mostra i numeri
 invece dei nomi degli host e delle porte) o `-v' (mostra i delta nelle
 sequenze di numeri per le connessioni mascherate, nel caso importi
 qualcosa).


 Il comando `-S' dovrebbe essere seguito da tre valori di timeout in
 secondi: per le sessioni TCP, per le sessioni TCP dopo un pacchetto
 FYN e per i pacchetti UDP.  Se non si vuole cambiare uno di questi tre
 valori, semplicemente si specifichi `0' come valore.


 I valori predefiniti sono elencati in
 `/usr/src/linux/include/net/ip_masq.h', e rispettivamente sono 15
 minuti, 2 minuti e 5 minuti.


 Il valore pi� comune da cambiare � il primo, per FTP (si veda ``Incubi
 da FTP'' pi� avanti).


 Si noti il problema nell'impostazione dei timeout descritto in ``Non
 riesco a impostare i timeout del masquerading!''.


 4.1.6.  Controllare un pacchetto

 Talvolta si vuole vedere cosa succede quando un certo pacchetto entra
 nella propria macchina, ad esempio per fare il debug delle catene
 firewall.  ipchains ha il comando `-C' per permetterlo, che usa le
 stesse routine che usa il kernel per la diagnosi dei pacchetti reali.


 Si specifica su quale catena verificare il pacchetto facendo seguire
 l'argomento di `-C' con il suo nome.  Mentre il kernel inizia la
 trasversata sempre dalla catena input, output oppure forward, per gli
 scopi di test si ha il permesso di cominciare la traversata da
 qualsiasi catena.


 I dettagli del `pacchetto' sono specificati usando le stessa sintassi
 usata per specificare le regole firewall.  In particolare, sono
 obbligatori un protocollo (`-p'), un indirizzo di provenienza (`-s'),
 un indirizzo di destinazione (`-d') e un'interfaccia (`-i').  Se il
 protocollo � TCP o UDP, allora devono essere specificati un unico
 indirizzo di provenienza ed un unico indirizzo di destinazione, mentre
 devono essere specificati un tipo e un codice ICMP per il protocollo
 ICMP (a meno che non sia specificata l'opzione `-f' per indicare una
 regola sui frammenti, nel qual caso queste opzioni sono illegali).


 Se il protocollo � TCP (e non � specificata l'opzione `-f' ), pu�
 essere specificata l'opzione `-y' per indicare che il pacchetto di
 test avr� il bit SYN impostato.


 Ecco qui un esempio di verifica di un pacchetto SYN TCP dalla porta
 60000 di 192.168.1.1 alla porta www di 192.168.1.2, in arrivo
 sull'interfaccia eth0 e che entra nella catena `input' (questa � la
 classica inizializzazione di una connessione WWW):



      # ipchains -C input -p tcp -y -i eth0 -s 192.168.1.1 60000 -d 192.168.1.2 www
      packet accepted
      #





 4.1.7.  Pi� regole in una volta sola e controllare cosa succede

 Talvolta un'unica riga di comando pu� aver effetto su pi� regole.  Ci�
 capita in due situazioni.  La prima: se si pu� specificare un nome di
 host che viene risolto (usando il DNS) in diversi indirizzi IP,
 ipchains si comporter� come se si fossero digitati pi� comandi, uno
 per ogni combinazione di indirizzi.


 Quindi se il nome di host `www.foo.com' viene risolto in tre indirizzi
 IP e il nome di host `www.bar.com' viene risolto in due indirizzi IP,
 allora il comando `ipchains -A input -j reject -s www.bar.com -d
 www.foo.com' aggiunger� sei regole alla catena input.


 Un altro modo per far s� che ipchains effettui azioni multiple � di
 usare l'opzione `-b' (bidirezionale).  Questa opzione fa s� che
 ipchains si comporti come se si fosse digitato due volte il comando,
 la seconda volta scambiando gli argomenti di `-s' e `-d'.  Quindi per
 evitare l'inoltro sia da che per 192.168.1.1, si potrebbe fare quanto
 segue:



      # ipchains -b -A forward -j reject -s 192.168.1.1
      #





 Personalmente, non gradisco molto l'opzione `-b'; se si vuole qualcosa
 di pi� utile si veda ``Usare ipchains-save'' pi� avanti.


 L'opzione `-b' pu� essere usato con i comandi di inserimento (`-I'),
 cancellazione (`-D') (ma non le varianti che accettano un numero di
 regola), aggiunta (`-A') e verifica (`-C').


 Un'altra opzione utile � `-v' (verboso) che mostra esattamente quel
 che ipchains sta facendo con il comando dato.  � utile se si ha a che
 fare con comandi che possono evere effetto su pi� regole.  Per
 esempio, controlliamo il comportamento dei frammenti tra 192.168.1.1 e
 192.168.1.2.



      # ipchains -v -b -C input -p tcp -f -s 192.168.1.1 -d 192.168.1.2 -i lo
        tcp opt   ---f- tos 0xFF 0x00  via lo    192.168.1.1  -> 192.168.1.2    * ->   *
      packet accepted
        tcp opt   ---f- tos 0xFF 0x00  via lo    192.168.1.2  -> 192.168.1.1    * ->   *
      packet accepted
      #





 4.2.  Un utile esempio

 Ho una connessione PPP in dialup (-i ppp0).  Mi scarico le news (-p
 TCP -s news.virtual.net.au nntp) e la posta (-p TCP -s
 mail.virtual.net.au pop-3) ogni volta che mi connetto.  Uso il metodo
 FTP di Debian per aggiornare regolarmente la mia macchina (-p TCP -y
 -s ftp.debian.org.au ftp-data).  Navigo in rete attraverso il proxy
 del mio ISP mentre tutta la roba precedente � in funzione (-p TCP -d
 proxy.virtual.net.au 8080), ma odio le pubblicit� da doubleclick.net
 nel Dilbert Archive (-p TCP -y -d 199.95.207.0/24 e -p TCP -y -d
 199.95.208.0/24).


 Non mi preoccupo della gente che prova a fare ftp nella mia macchina
 mentre sono online (-p TCP -d $LOCALIP ftp), ma non voglio che nessuno
 da fuori pretenda di avere un indirizzo IP della mia rete interna (-s
 192.168.1.0/24).  Ci� � comunemente detto IP spoofing, e c'� un modo
 migliore per proteggersi nei kernel 2.1 e superiori: si veda ``Come
 proteggersi dall'IP spoofing?''.


 Questa configurazione � piuttosto semplice, perch� attualmente non ci
 sono altre macchine nella mia rete interna.


 Non voglio che nessun processo locale (ie. Netscape, lynx ecc.) si
 connetta a doubleclick.net:



      # ipchains -A output -d 199.95.207.0/24 -j REJECT
      # ipchains -A output -d 199.95.208.0/24 -j REJECT
      #





 Ora voglio impostare le priorit� in diversi pacchetti in uscita (non
 ne vedo l'utilit� di farlo nei pacchetti in ingresso).  Poich� ho
 parecchie di questo regole, ha senso metterle tutte in un unica
 catena, chiamata ppp-out.



      # ipchains -N ppp-out
      # ipchains -A output -i ppp0 -j ppp-out
      #





 Ritardo minimo per il traffico web e per telnet.



      # ipchains -A ppp-out -p TCP -d proxy.virtual.net.au 8080 -t 0x01 0x10
      # ipchains -A ppp-out -p TCP -d 0.0.0.0 telnet -t 0x01 0x10
      #





 Minimo costo per i dati ftp, nntp e pop-3:



      # ipchains -A ppp-out -p TCP -d 0.0.0.0/0 ftp-data -t 0x01 0x02
      # ipchains -A ppp-out -p TCP -d 0.0.0.0/0 nntp -t 0x01 0x02
      # ipchains -A ppp-out -p TCP -d 0.0.0.0/0 pop-3 -t 0x01 0x02
      #





 Ci sono alcune restrizioni sui pacchetti in ingresso dall'interfaccia
 ppp0: creo una catena chiamata `ppp-in':



      # ipchains -N ppp-in
      # ipchains -A input -i ppp0 -j ppp-in
      #





 Ora, nessun pacchetto in ingresso da ppp0 dovrebbe affermare un
 indirizzo di provenienza di 192.168.1.*, e quindi li registro e li
 proibisco:



      # ipchains -A ppp-in -s 192.168.1.0/24 -l -j DENY
      #





 Permetto l'ingresso solo di pacchetti UDP per il DNS (eseguo un
 caching nameserver che inoltra tutte le richieste a 203.29.16.1,
 quindi mi aspetto risposte DNS solo da loro), ftp entrante e ritorno
 di dati ftp (che dovrebbero andare solo verso una porta soprao la
 1023, ma non verso le porte X11 attorno a 6000).



      # ipchains -A ppp-in -p UDP -s 203.29.16.1 -d $LOCALIP dns -j ACCEPT
      # ipchains -A ppp-in -p TCP -s 0.0.0.0/0 ftp-data -d $LOCALIP 1024:5999 -j ACCEPT
      # ipchains -A ppp-in -p TCP -s 0.0.0.0/0 ftp-data -d $LOCALIP 6010: -j ACCEPT
      # ipchains -A ppp-in -p TCP -d $LOCALIP ftp -j ACCEPT
      #





 Per finire, vanno bene i pacchetti local-to-local:



      # ipchains -A input -i lo -j ACCEPT
      #





 ora, la mia tattica di default per la catena input � DENY, quindi
 qualsiasi altra cosa viene scartata:



      # ipchains -P input DENY
      #





 NOTA: non imposterei le mie catene in questo ordine, in quanto i
 pacchetti potrebbero passare mentre le imposto.  La cosa pi� sicura �
 di impostare per prima cosa la tattica a DENY, poi inserire le regole.
 Naturalmente, se le proprie regole necessitano di ricerche DNS per
 risolvere i nomi di host, potrebbero esserci problemi.


 4.2.1.  Usare ipchains-save

 Impostare le catene firewall proprio nel modo in cui le si vuole, e
 poi provare a ricordarsi i comandi usati in modo da porterlo fare
 anche la volta successiva � una cosa penosa.


 ipchains-save � uno script che legge l'impostazione corrente delle
 catene e la salva in un file.  Per ora vi lascio in fremente attesa di
 scoprire cosa fa ipchains-restore.


 ipchains-save pu� salvare una catena o tutte le catene (se non �
 specificato un nome di catena).  La sola opzione attualmente permessa
 � `-v' che stampa le regole (in stderr) mentre le salva.  Per le
 catene input, output e forward � salvata anche la tattica.


      # ipchains-save > my_firewall
      Saving `input'.
      Saving `output'.
      Saving `forward'.
      Saving `ppp-in'.
      Saving `ppp-out'.
      #





 4.2.2.  Usare ipchains-restore

 ipchains-restore ripristina le catene salvate con ipchains-save.
 Accetta due opzioni: `-v' che descrive ogni regola che viene aggiunta,
 e `-f' che forza lo svuotamento delle catene definite dall'utente se
 esistono, come descritto nel seguito.


 Se nell'input � trovata una catena definita dall'utente, ipchains-
 restore controlla se esiste gi�.  Se esiste, sar� chiesto se la catena
 debba essere svuotata (ripulita da tutte le regole) o se si debba
 saltare il ripristino di questa catena.  Se si specifica `-f' in riga
 di comando, non sar� chiesto niente; la catena sar� ripulita.


 Per esempio:



      # ipchains-restore < my_firewall
      Restoring `input'.
      Restoring `output'.
      Restoring `forward'.
      Restoring `ppp-in'.
      Chain `ppp-in' already exists. Skip or flush? [S/f]? s
      Skipping `ppp-in'.
      Restoring `ppp-out'.
      Chain `ppp-out' already exists. Skip or flush? [S/f]? f
      Flushing `ppp-out'.
      #





 5.  Miscellanea

 Questa sezione contiene tutte le informazioni e le FAQ che non sono
 riuscito a sistemare nella struttura precedente.


 5.1.  Come organizzare le proprie regole firewall

 Questa domanda richiede qualche riflessione.  Si pu� provare ad
 organizzarle per ottimizzare la velocit� (minizzare il numero di
 verifiche di regole per i pacchetti pi� comuni) o per incrementare la
 gestibilit�.


 Se si ha una connessione intermittente, diciamo una connessione PPP,
 si pu� voler impostare la prima regola nella catena input a `-i ppp0
 -j DENY' al boot del sistema, e poi mettere qualcosa di simile a
 questo nello script ip-up:

      # Ricrea la catena `ppp-in'.
      ipchains-restore -f < ppp-in.firewall

      # Rimpiazza la regola DENY con un salto alla catena di gestione del ppp.
      ipchains -R input 1 -i ppp0 -j ppp-in





 Lo script ip-down potrebbe essere cos�:



      ipchains -R input 1 -i ppp0 -j DENY






 5.2.  Cosa non filtrare

 Ci sono alcune cosette di cui bisogna essere consci prima di
 cominciare a filtrare tutto quello che non si vuole.


 5.2.1.  Pacchetti ICMP

 I pacchetti ICMP sono usati (tra le altre cose) per indicare
 fallimenti negli altri protocolli (come TCP o UDP).  In particolare i
 pacchetti `destination-unreachable' (destinazione irraggiungibile).
 Bloccare questi pacchetti significa che non si riceveranno mai gli
 errori `Host unreachable' o `No route to host'; qualsiasi connessione
 semplicemente attender� una riposta che non arriver� mai.  Ci� �
 irritante, ma raramente fatale.


 Un problema peggiore � la regola dei pacchetti ICMP nel MTU discovery.
 Tutte le buone implementazioni TCP (inclusa quella di Linux) usano MTU
 discovery per provare a capire quale sia il pacchetto pi� grosso che
 pu� arrivare a destinazione senza essere frammentato (la
 frammentazione abbassa le prestazioni. specialmente quando vengono
 occasionalmente persi dei frammenti). MTU discovery lavora inviando
 pacchetti con il bit "Don't Fragment" impostato, inviando poi
 pacchetti pi� piccoli se riceve un pacchetto ICMP che indica
 "Fragmentation needed but DF set" (`fragmentation-needed').  Questo �
 un pacchetto tipo `destination-unreachable', e se non viene mai
 ricevuto l'host locale non riduce l'MTU e le prestazioni saranno
 abissali o non esistenti.


 Si noti che � comune bloccare tutti i messaggi redirect ICMP (tipo 5);
 possono essere usati per manipolare l'instradamento (sebbene gli stack
 IP buoni abbiano delle protezioni), e quindi sono spesso visti un come
 po' rischiosi.


 5.2.2.  Connessioni TCP al DNS (nameserver)

 Se si sta provando a bloccare tutte le connessioni TCP in uscita, si
 ricordi che il DNS non sempre usa UDP; se la risposta dal server
 supera i 512 byte, il client usa una connessione TCP (ancora diretta
 alla porta numero 53) per ottenere i dati.


 Ci� pu� essere una trappola perch� il DNS `praticamente funzioner�' se
 si disabilitano tali trasferimenti TCP; comunque se lo si fa possono
 capitare strani lunghi ritardi e altri occasionali problemi DNS.


 Se le proprie interrogazioni DNS sono sempre dirette alla stessa fonte
 esterna (sia direttamente usando una riga nameserver in
 /etc/resolv.conf oppure usando un caching nameserver in modalit�
 forward), allora si devono permettere solo le connessioni TCP alla
 porta domain di quel nameserver dalla porta domain locale (se si sta
 usando un caching nameserver) o da una porta pi� alta (> 1023) se si
 sta usando /etc/resolv.conf.


 5.2.3.  Incubi da FTP

 FTP presenta un classico problema del filtraggio dei pacchetti.  FTP
 ha due modalit�; quella tradizionale � detta modalit� attiva e quella
 pi� recente � detta modalit� passiva.  I web browser solitamente usano
 la modalit� passiva, mentre i programmi per FTP a riga di comando
 solitamente usano la modalit� attiva.


 In modalit� attiva, quando il sito remoto vuole inviare un file
 (oppure anche il risultato di un comando ls o dir) apre una
 connessione TCP verso la macchina locale.  Ci� significa che non si
 possono filtrare queste connessioni TCP senza rompere l'FTP attivo.


 Se si ha la possibilit� di usare la modalit� passiva, allora bene; la
 modalit� passiva crea connessioni dati dal client al server, anche per
 i dati in ingresso.  Altrimenti, � raccomandabile permettere
 connessioni TCP solamente verso porte superiori alla 1024 ma non tra
 6000 e 6010 (la 6000 � usata per X-Windows).


 5.3.  Filtrare i Ping della Morte

 La macchine Linux sono ora immuni ai famosi Ping della Morte, che
 implicano l'invio di un pacchetto ICMP illegalmente grande che fa
 andare in overflow i buffer nello stack TCP del ricevente con effetti
 devastanti.


 Se vi vogliono proteggere macchine che potrebbero essere ancora
 vulnerabili, semplicemente si blocchino i frammenti ICMP.  Normalmente
 i pacchetti ICMP non sono abbastanza grandi da richiedere
 frammentazione, e quindi non si romper� niente se non i grossi ping.
 Ho sentito (non confermato) che ad alcuni sistemi basta anche solo
 l'ultimo frammento di un pacchetto ICMP fuori misura per corromperli,
 e quindi non � raccomandabile bloccare solo il primo frammento.


 Sebbene i programmi exploit che ho visto usano tutti ICMP, non c'�
 ragione per non usare frammenti TCP o UDP (o di un protocollo
 sconosciuto) per questi attacchi, e quindi bloccare i frammenti ICMP �
 solamente una soluzione temporanea.


 5.4.  Filtrare Teardrop e Bonk

 Teardrop e Bonk sono due attacchi (rivolti principalmente contro
 macchine Microsoft Windows NT) che si basano sulla sovrapposizione dei
 frammenti.  Le opzioni sono di far s� che il proprio router Linux
 effettui la deframmentazione oppure disabilitare tutti i frammenti
 verso le macchine vulnerabili.
 5.5.  Filtrare i Fragment Bomb

 Si dice che alcuni stack TCP meno affidabili hanno problemi a gestire
 un largo numero di frammenti di pacchetti quando non ricevono mai
 tutti i frammenti.  Linux non ha questo problema.  Si possono filtrare
 tutti i frammenti (il che interrompe pure il loro uso legittimo)
 oppure compilare il kernel attivando `IP: always defragment' (solo se
 la propria macchina Linux � il solo instradamento possibile per questi
 pacchetti).


 5.6.  Cambiare le regole firewall

 Ci sono alcune questioni temporali coinvolte nella modifica delle
 regole firewall.  Se non si fa attenzione, si possono lasciar passare
 pacchetti mentre si fanno le modifiche.  L'approccio pi� semplice � il
 seguente:



      # ipchains -I input 1 -j DENY
      # ipchains -I output 1 -j DENY
      # ipchains -I forward 1 -j DENY

      ... fare le modifiche ...

      # ipchains -D input 1
      # ipchains -D output 1
      # ipchains -D forward 1
      #




 Ci� scarta tutti i pacchetti per la durata delle modifiche.


 Se le proprie modifiche sono ristrette ad una sola catena, si potrebbe
 creare una nuova catena con le nuove regole e poi rimpiazzare (`-R')
 la regola che punta alla vecchia catena con quella che punta a quella
 nuova: poi si pu� cancellare la vecchia catena.  Questo rimpiazzo sar�
 atomico.


 5.7.  Come proteggersi dall'IP Spoofing?

 L'IP spoofing � una tecnica nella quale un host invia pacchetti che
 affermano provenire da un altro host.  Poich� il filtraggio dei
 pacchetti prende decisioni basandosi su questo indirizzo di
 provenienza, l'IP spoofing � utile solo con filtri di pacchetti un po'
 stupidi.  � usato anche per nascondere l'identit� dell'attaccante
 usando attacchi SYN, Teardrop, Ping della Morte e simili (non ci si
 preoccupi se non si sa cosa sono).


 Il miglior modo per proteggersi dall'IP spoofing � chiamato Source
 Address Verification (Verifica dell'Indirizzo di Provenienza), ed �
 fatto dal codice di instradamento e non dal firewall.  Si cerchi il
 file /proc/sys/net/ipv4/conf/all/rp_filter.  Se esiste, allora
 attivare il Source Address Verification ad ogni avvio � la giusta
 soluzione.  Per farlo, si inseriscano le righe seguenti da qualche
 parte nei propri script di inizializzazione, prima che sia
 inizializzata qualsiasi interfaccia di rete:



 # Questo � il metodo migliore: attivare il Source Address Verification
 # ed avere cos� la protezione dallo spoof protection su tutte le
 # intefacce correnti e future.
 if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
   echo -n "Setting up IP spoofing protection..."
   for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
       echo 1 > $f
   done
   echo "done."
 else
   echo PROBLEMS SETTING UP IP SPOOFING PROTECTION.  BE WORRIED.
   echo "CONTROL-D will exit from this shell and continue system startup."
   echo
   # Start a single user shell on the console
   /sbin/sulogin $CONSOLE
 fi





 Se non si pu� fare cos�, si possono inserire manualmente delle regole
 per proteggere ogni interfaccia.  Ci� richiede conoscenza su qualsiasi
 interfaccia.  I kernel 2.1 automaticamente rifiutano i pacchetti che
 affermano provenire dagli indirizzi 127.* (riservati per l'interfaccia
 loopbak locale lo).


 Per esempio, facciamo il caso che ci siano tre interfacce: eth0, eth1
 e ppp0.  Possiamo usare ifconfig per conoscere l'indirizzo e la
 netmask delle interfacce.  Diciamo che eth0 sia attaccata alla rete
 192.168.1.0 con netmask 255.255.255.0, eth1 sia attaccata alla rete
 10.0.0.0 con netmask 255.0.0.0 e che ppp0 connetta con Internet (dov'�
 permesso qualsiasi indirizzo tranne quelli riservati come indirizzi IP
 privati).  Inseriremo allora le seguenti regole:



      # ipchains -A input -i eth0 -s ! 192.168.1.0/255.255.255.0 -j DENY
      # ipchains -A input -i ! eth0 -s 192.168.1.0/255.255.255.0 -j DENY
      # ipchains -A input -i eth1 -s ! 10.0.0.0/255.0.0.0 -j DENY
      # ipchains -A input -i ! eth1 -s 10.0.0.0/255.0.0.0 -j DENY
      #





 Questo approccio non � buono quanto l'approccio con il Source Address
 Verification, perch� se cambia la propria rete, si devono cambiare le
 regole firewall.


 Se si usa un kernel della serie 2.0, si pu� voler proteggere anche
 l'interfacia loopback, usando una regola come questa:



      # ipchains -A input -i ! lo -s 127.0.0.0/255.0.0.0 -j DENY
      #






 5.8.  Progetti avanzati

 Ho scritto una libreria (`libfw') che funziona dello spazio utente
 inclusa nei sorgenti.  Usa la possibilit� offerta da IP Chains 1.3 e
 superiori di copiare un pacchetto nello spazio utente (usando
 l'opzione di configurazione IP_FIREWALL_NETLINK).


 Il valore marcato pu� essere usato per specificare il paramentro
 Quality of Service per i pacchetti o per specificare come fare
 l'inoltro di porta dei pacchetti.  Non li ho mai usati, ma se si vuole
 scrivere qualcosa in proposito, mi si contatti.


 Usando questa libreria possono essere implementate nello spazio utente
 cose come la stateful inspection (preferisco il termine dynamic
 firewalling).  Un'altra idea interessante � il controllo dei pacchetti
 su base utente facendo delle ricerche in un demone nello spazio
 utente.  Questo dovrebbe essere abbastanza facile.


 5.8.1.  SPF: Stateful Packet Filtering

 ftp://ftp.interlinx.bc.ca/pub/spf <ftp://ftp.interlinx.bc.ca/pub/spf>
 � il sito del progetto SPF di Brian Murrell, che fa il tracking delle
 connessioni nello spazio utente.  Aggiunge sicurezza significativa per
 siti a bassa banda.


 Attualmente c'� poca documentazione, ma ecco qui un post nella mailing
 list nel quale Brian spiega un po' di cose:




      > Credo che faccia esattamente quello che voglio: installare un regola
      > temporanea di "arretramento" ("backward" rule) per permettere
      > l'ingresso dei pacchetti come fossero una risposta ad un richiesta
      > in uscita.

      Yup, � esattamente quello che fa.  Pi� protocolli supporta, pi� la
      regola di "arretramento" funziona bene.  Attualmente ha il supporto
      (vado a memoria, quindi scusate qualsiasi errore o omissione) per FTP
      (sia attivo che passivo, in ingresso e in uscita), RealAudio,
      traceroute, ICMP e ICQ basilare (ingresso da un server ICQ e
      connessioni TCP dirette, ma non c'� ancora il supporto per le
      connessioni TCP dirette secondarie per altre cose come il
      trasferimento di file, ecc.).

      > � un rimpiazzo per ipchains o un supplemento?

      � un supplemento.  Penso a ipchains come al motore per permettere o
      prevenire ai pacchetti di viaggiare attraverso la macchina Linux.  SPF
      � il pilota che monitorizza costantemente il traffico e dice a
      ipchains come cambiare le sue tattiche per rispondere ai cambiamenti
      nel traffico.





 5.8.2.  L'ftp-data hack di Michael Hasenstein

 Michael Hasenstein della SuSE ha scritto una patch per il kernel che
 aggiunge a ipchains il tracking delle connessioni ftp.  Attualmente
 pu� essere trovata a http://www.csn.tu-chemnitz.de/~mha/patch.ftp-
 data-2.gz <http://www.csn.tu-chemnitz.de/~mha/patch.ftp-data-2.gz>


 5.9.  Estensioni future

 Il firewalling ed il NAT sono in fase di riprogettazione per il 2.3.
 I piani e le discussioni sono disponibili nell'archivio delle liste
 netdev e ipchains-dev.  Queste estensioni dovrebbero chiarire
 parecchie questioni insolute sull'usabilit� (veramente, il firewalling
 e il masquerading non dovrebbero essere cos� difficili), e
 permetteranno la crescita di un firewalling maggiormente flessibile.


 6.  Problemi comuni


 6.1.  ipchains -L si pianta!

 Probabilmente si stanno bloccando le ricerche DNS; alla fine andr� in
 timeout.  Si provi a passare l'opzione `-n' a ipchains, che sopprime
 la risoluzione dei nomi.



 6.2.  Masquerading/Forwarding non funziona!

 Ci si assicuri che sia abilitato l'inoltro dei pacchetti (nei kernel
 recenti � disabilitato per default, il che significa che i pacchetti
 non proveranno mai ad attraversare la catena `forward').  Si pu�
 venirne a capo digitando (come root):



      # echo 1 > /proc/sys/net/ipv4/ip_forward
      #





 Se funziona, lo si pu� mettere da qualche parte nei propri script di
 avvio cos� che sia abilitato ogni volta; ovviamente � meglio impostare
 il proprio firewall prima di lanciare questo comando, altrimenti c'�
 l'opportunit� che scappino un po' di pacchetti.



 6.3.  -j REDIR non funziona!

 Si devono permettere i pacchetti di inoltro (si veda sopra) affinch�
 funzioni il dirottamento; diversamente il codice di instradamento
 scarter� i pacchetti.  Quindi se si sta usando solamente il
 dirottamento e non si usa il forwarding, � bene essere consci di
 questa cosa.


 Si noti che REDIR (sebbene sia nella catena input) non ha effetto
 sulle connessioni da un processo locale.


 6.4.  Non funzionano i caratteri jolly nelle interfacce!

 C'� un bug nelle versioni 2.1.102 e 2.1.103 del kernel (e in alcune
 vecchie patch che ho prodotto) che faceva fallire i comandi ipchains
 che utilizzavano caratteri jolly per specificare interfacce (ad
 esempio -i ppp+).
 Ci� � stato corretto nei kernel recenti e nella patch per il 2.0.34
 presente sul sito web.  Pu� essere pure corretto a mano nei sorgenti
 del kernel modificando la riga 63 (pi� o meno) di
 include/linux/ip_fw.h:



      #define IP_FW_F_MASK    0x002F  /* All possible flag bits mask   */





 Dovrebbe essere ``0x003F''.  Lo si corregga e si ricompili il kernel.


 6.5.  TOS non funziona!

 Questo � stato un mio errore: l'impostazione del campo Type of Service
 nei kernel dal 2.1.102 al 2.1.111 in realt� non faceva niente.  Questo
 problema � stato corretto nel 2.1.112.


 6.6.  Non funzionano ipautofw e ipportfw!

 Per i 2.0.x, � vero; non ho il tempo per creare e mantenere una patch
 enorme per ipchains e ipautofw/ipportfw.


 Per i 2.1.x, si scarichi l'ipmasqadm di Juan Ciarlante da

 <htmlurl url="http://juanjox.linuxhq.com/"
         name="http://juanjox.linuxhq.com/">


 e lo si usi esattamente come si sarebbe usato ipautofw o ipportfw,
 tranne per il fatto che invece di ipportfw si usa ipmasqadm portfw, e
 invece di ipautofw si usa ipmasqadm autofw.


 6.7.  xosview si � rotto!

 Si aggiorni alla versione 1.6.0 o superiore, che non richiede nessuna
 regola firewall per i kernel 2.1.x.  Sembra che anche la release 1.6.1
 abbia questo problema; lo si segnali all'autore (non � un mio
 errore!).


 6.8.  Segmentation Fault con `-j REDIRECT'!

 Questo era un bug in ipchains versione 1.3.3.  Si aggiorni.



 6.9.  Non riesco ad impostare i timeout del masquerading!

 Ci� � vero (per i kernel 2.1.x) fino al 2.1.123.  Nel 2.1.124, il
 tentativo di impostare i timeout del masquerading provoca un blocco
 del kernel (si modifichi return in ret = nella riga 1328 di
 net/ipv4/ip_fw.c).  Nel 2.1.125, funziona tutto.


 6.10.  Voglio dei firewall IPX!

 E cos� molti altri, sembra.  Il mio codice gestisce solo IP,
 sfortunatamente.  D'altra parte c'� anche qualcosa di buono: le cose
 per scrivere un firewall IPX ci sono tutte!  Basta semplicemente
 scrivere il codice; sar� felice di aiutare dove possibile.


 7.  Un esempio pi� serio

 Questo esempio � estratto dal tutorial scritto da me e Michael Neuling
 apparso in LinuxWorld nel Marzo 1999; non � il solo modo per risolvere
 il problema in esame, ma probabilmente � il pi� semplice.  Spero lo si
 trovi interessante.



 7.1.  La situazione


 �  Rete interna con il masquerading (con diversi sistemi operativi)
    che chiameremo "GOOD".

 �  Server esposti in una rete separata (chiamata "DMZ" per
    Demilitarized Zone - Zona Demilitarizzata).

 �  Connessione PPP ad Internet (detta "BAD").




         Rete Esterna (BAD)
                 |
                 |
             ppp0|
          ---------------
          | 192.84.219.1|             Rete dei Server (DMZ)
          |             |eth0
          |             |----------------------------------------------
          |             |192.84.219.250 |             |              |
          |             |               |             |              |
          |192.168.1.250|               |             |              |
          ---------------          --------       -------        -------
                 | eth1            | SMTP |       | DNS |        | WWW |
                 |                 --------       -------        -------
                 |              192.84.219.128  192.84.219.129  192.84.218.130
                 |
        Rete Interna (GOOD)





 7.2.  Scopi


 Macchina per il filtraggio dei pacchetti:

     PING da/per qualsiasi rete
       Questo � veramente utile per sapere se una macchina � attiva.


     TRACEROUTE da/per qualsiasi rete
       Ancora, utile per la diagnotica.


     Accesso DNS
       Rende ping e DNS pi� utili.


 All'interno di DMZ:


 Mail server

 �  SMTP verso l'esterno

 �  Accetta SMTP dall'interno e dall'esterno

 �  Accetta POP-3 dall'interno

 Name Server

 �  Invia richieste DNS all'esterno

 �  Accetta richieste DNS dall'interno, dall'esterno e dalla macchina
    per il filtraggio dei pacchetti.


 Server web

 �  Accetta connessioni HTTP dall'interno e dall'esterno

 �  Accesso rsync dall'interno


 Rete interna:

    Permettere WWW, ftp, traceroute, ssh verso l'esterno
       Queste sono cose abbastanza standard da permettere: alcuni
       iniziano permettendo di fare tutto alla rete interna, ma qui
       saremo un po' pi� restrittivi.


     Permettere connessioni SMTP verso il mail server
       Ovviamente vogliamo poter inviare mail verso l'esterno.


     Permettere connessioni POP-3 verso il mail server
       Questo � il modo per leggere la propria posta.


     Permettere connessioni DNS verso il name server
       Vogliamo essere in grado di cercare i nomi esterni dei siti per
       il WWW, ftp, traceroute e ssh.


     Permettere connessioni rsync verso il server web
       Questo � il modo per sincronizzare il server web esterno con
       quello interno.


     Permettere connessioni WWW verso il server web
       Ovviamente, vogliamo poterci connettere al nostro server web
       esterno.


     Permettere il ping verso la macchina per il filtraggio dei pac�
       chetti
       Questa � una pura cortesia: significa che si pu� controllare se
       la macchina firewall � gi�.





 7.3.  Prima del filtraggio dei pacchetti


 �  Anti-spoofing.


    Poich� non c'� nessun instradamento asimmetrico, semplicemente si
    pu� attivare l'anti-spoofing per tutte le interfacce.




      # for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done
      #





 �  Impostare le regole di filtraggio per proibire (DENY) tutto.


    Si permetter� ancora il traffico locale su loopback, ma verr�
    proibito tutto il resto.




      # ipchains -A input -i ! lo -j DENY
      # ipchains -A output -i ! lo -j DENY
      # ipchains -A forward -j DENY
      #





 �  Configurare le interfacce.


    Solitamente ci� � fatto negli script di boot.  Ci si assicuri che i
    passi precedenti siano fatti prima che vengano configurate le
    interfacce, per prevenire l'infiltrazione di pacchetti prima di
    aver impostato le regole.


 �  Inserire moduli di masquerading per ciascun protocollo.

    Si devono inserire i moduli di masquerading per FTP, in modo che
    funzioni l'FTP sia attivo che passivo per la rete interna.




      # insmod ip_masq_ftp
      #





 7.4.  Filtraggio dei pacchetti per i pacchetti di passaggio

 Con il masquerading, la cosa migliore � filtrare nella catena forward.


 Si suddivida la catena forward in diverse catene utente a seconda
 delle interfacce di provenienza/destinazione; ci� spacca in problema
 in tronconi gestibili pi� facilmente.



      ipchains -N good-dmz
      ipchains -N bad-dmz
      ipchains -N good-bad
      ipchains -N dmz-good
      ipchains -N dmz-bad
      ipchains -N bad-good




 Una cosa comune da fare � di accettare (ACCEPT) errori ICMP standard,
 e quindi si crea una catena solo per loro.



      ipchains -N icmp-acc





 7.4.1.  Impostare i salti dalla catena forward

 Sfortunatamente, � nota solamente (nella catena forward) l'interfaccia
 d'uscita.  Quindi, per scoprire da quale interfaccia sia entrato un
 pacchetto useremo l'indirizzo di provenienza (l'anti spoofing previene
 indirizzi contraffatti).


 Si noti che si registra qualsiasi cosa che non soddisfa una di queste
 regole (ovviamente ci� non dovrebbe mai succedere).



      ipchains -A forward -s 192.168.1.0/24 -i eth0 -j good-dmz
      ipchains -A forward -s 192.168.1.0/24 -i ppp0 -j good-bad
      ipchains -A forward -s 192.84.219.0/24 -i ppp0 -j dmz-bad
      ipchains -A forward -s 192.84.219.0/24 -i eth1 -j dmz-good
      ipchains -A forward -i eth0 -j bad-dmz
      ipchains -A forward -i eth1 -j bad-good
      ipchains -A forward -j DENY -l





 7.4.2.  Definire la catena icmp-acc

 I pacchetti che siano degli errori ICMP sono accettati, altrimenti il
 controllo passer� alla catena chiamante.




      ipchains -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT
      ipchains -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT
      ipchains -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT
      ipchains -A icmp-acc -p icmp --icmp-type parameter-problem -j ACCEPT


 7.4.3.  Da Good (interno) a DMZ (server)

 Restrizioni della rete interna:

 �  Permettere WWW, ftp, traceroute, ssh verso l'esterno

 �  Permettere SMTP verso il Mail server

 �  Permettere POP-3 verso il Mail server

 �  Permettere DNS verso il Name server

 �  Permettere rsync verso il Web server

 �  Permettere WWW verso il Web server

 �  Permettere il ping alla macchina filtro

 Si potrebbe fare il masquerading dalla rete interna nella DMZ, ma qui
 non si far�.  Poich� nessuno nella rete interna dovrebbe provare a
 fare cose brutte, registriamo qualsiasi pacchetto che venga proibito.




      ipchains -A good-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT
      ipchains -A good-dmz -p tcp -d 192.84.219.128 pop-3 -j ACCEPT
      ipchains -A good-dmz -p udp -d 192.84.219.129 domain -j ACCEPT
      ipchains -A good-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT
      ipchains -A good-dmz -p tcp -d 192.84.218.130 www -j ACCEPT
      ipchains -A good-dmz -p tcp -d 192.84.218.130 rsync -j ACCEPT
      ipchains -A good-dmz -p icmp -j icmp-acc
      ipchains -A good-dmz -j DENY -l






 7.4.4.  Da Bad (esterno) a DMZ (server).



 �  Restrizioni di DMZ:

 �  Mail server

 �  SMTP verso l'esterno

 �  Accetta SMTP da interno ed esterno

 �  Accetta POP-3 dall'interno


 �  Name server

 �  Invia DNS verso l'esterno

 �  Accetta DNS da interno, esterno e dalla macchina per il filtraggio
    dei pacchetti


 �  Web server

 �  Accetta HTTP da interno e esterno

 �  Accesso rsync dall'interno


 �  Cose permesse dalla rete esterna verso DMZ

 �  Non si registrano le violazioni, in quanto possono succedere.



      ipchains -A bad-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT
      ipchains -A bad-dmz -p udp -d 192.84.219.129 domain -j ACCEPT
      ipchains -A bad-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT
      ipchains -A bad-dmz -p tcp -d 192.84.218.130 www -j ACCEPT
      ipchains -A bad-dmz -p icmp -j icmp-acc
      ipchains -A bad-dmz -j DENY





 7.4.5.  Da Good (interno) a Bad (esterno).


 �  Restrizioni della rete interna:

 �  Permettere WWW, ftp, traceroute, ssh verso l'esterno

 �  Permettere SMTP verso il Mail server

 �  Permettere POP-3 verso il Mail server

 �  Permettere DNS verso il Name server

 �  Permettere rsync verso il Web server

 �  Permettere WWW verso il Web server

 �  Permettere il ping alla macchina filtro

 �  Molti permettono qualsiasi cosa dalla rete interna verso quella
    esterna. Qua facciamo un po' i fascisti.

 �  Registrazione delle violazioni.

 �  FTP passivo gestito dal modulo del masquerading



      ipchains -A good-bad -p tcp --dport www -j MASQ
      ipchains -A good-bad -p tcp --dport ssh -j MASQ
      ipchains -A good-bad -p udp --dport 33434:33500 -j MASQ
      ipchains -A good-bad -p tcp --dport ftp --j MASQ
      ipchains -A good-bad -p icmp --icmp-type ping -j MASQ
      ipchains -A good-bad -j REJECT -l





 7.4.6.  Da DMZ a Good (interno).



 �  Restrizioni della rete interna:


 �  Permettere WWW, ftp, traceroute, ssh verso l'esterno

 �  Permettere SMTP verso il Mail server

 �  Permettere POP-3 verso il Mail server

 �  Permettere DNS verso il Name server

 �  Permettere rsync verso il Web server

 �  Permettere WWW verso il Web server

 �  Permettere il ping alla macchina filtro


 �  Se si fa il masquerading dalla rete interna verso la DMZ,
    semplicemente si rifiuti qualsiasi pacchetto che proviene
    nell'altro senso.  Ovvero, si permettano solo i pacchetti che
    possono essere parte di una connessione gi� stabilita.



      ipchains -A dmz-good -p tcp ! -y -s 192.84.219.128 smtp -j ACCEPT
      ipchains -A dmz-good -p udp -s 192.84.219.129 domain -j ACCEPT
      ipchains -A dmz-good -p tcp ! -y -s 192.84.219.129 domain -j ACCEPT
      ipchains -A dmz-good -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
      ipchains -A dmz-good -p tcp ! -y -s 192.84.218.130 rsync -j ACCEPT
      ipchains -A dmz-good -p icmp -j icmp-acc
      ipchains -A dmz-bad -j DENY -l





 7.4.7.  Da DMZ a Bad (esterno).



 �  Restrizioni di DMZ:

 �  Mail server

 �  SMTP verso l'esterno

 �  Accetta SMTP da interno ed esterno

 �  Accetta POP-3 dall'interno


 �  Name server

 �  Invia DNS verso l'esterno

 �  Accetta DNS da interno, esterno e dalla macchina per il filtraggio
    dei pacchetti


 �  Web server

 �  Accetta HTTP da interno e esterno

 �  Accesso rsync dall'interno




 �


      ipchains -A dmz-bad -p tcp -s 192.84.219.128 smtp -j ACCEPT
      ipchains -A dmz-bad -p udp -s 192.84.219.129 domain -j ACCEPT
      ipchains -A dmz-bad -p tcp -s 192.84.219.129 domain -j ACCEPT
      ipchains -A dmz-bad -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
      ipchains -A dmz-bad -p icmp -j icmp-acc
      ipchains -A dmz-bad -j DENY -l





 7.4.8.  Da Bad (esterno) a Good (interno).



 �  Non si permette niente (non mascherato) dalla rete esterna verso
    quella interna


      ipchains -A bad-good -j REJECT





 7.4.9.  Filtraggio dei pacchetti per la macchina Linux stessa



 �  Se si vuole usare il filtraggio dei pacchetti sui pacchetti in
    ingresso alla macchina stessa, � necessario fare il filtraggio
    sulla catena input.  Si crei una catena per ogni interfaccia di
    destinazione:


      ipchains -N bad-if
      ipchains -N dmz-if
      ipchains -N good-if





 �  Creare dei salti a queste:



      ipchains -A input -d 192.84.219.1 -j bad-if
      ipchains -A input -d 192.84.219.250 -j dmz-if
      ipchains -A input -d 192.168.1.250 -j good-if





 7.4.9.1.  Interfaccia di Bad (esterno).



 �  Macchina per il filtraggio dei pacchetti:

 �  PING verso ogni rete

 �  TRACEROUTE verso ogni rete

 �  Accesso DNS


 �  L'interfaccia esterna riceve risposte anche per i pacchetti
    "mascherati" oltre ad errori ICMP per questi e a risposte al PING.



      ipchains -A bad-if -i ! ppp0 -j DENY -l
      ipchains -A bad-if -p TCP --dport 61000:65096 -j ACCEPT
      ipchains -A bad-if -p UDP --dport 61000:65096 -j ACCEPT
      ipchains -A bad-if -p ICMP --icmp-type pong -j ACCEPT
      ipchains -A bad-if -j icmp-acc
      ipchains -A bad-if -j DENY





 7.4.9.2.  Interfaccia di DMZ.



 �  Restrizioni della macchina per il filtraggio dei pacchetti:

 �  PING verso ogni rete

 �  TRACEROUTE verso ogni rete

 �  Accesso DNS


 �  L'interfaccia DMZ riceve risposte DNS, risposte al ping ed errori
    ICMP.



      ipchains -A dmz-if -i ! eth0 -j DENY
      ipchains -A dmz-if -p TCP ! -y -s 192.84.219.129 53 -j ACCEPT
      ipchains -A dmz-if -p UDP -s 192.84.219.129 53 -j ACCEPT
      ipchains -A dmz-if -p ICMP --icmp-type pong -j ACCEPT
      ipchains -A dmz-if -j icmp-acc
      ipchains -A dmz-if -j DENY -l





 7.4.9.3.  Interfaccia di Good (interno).



 �  Restrizioni della macchina per il filtraggio dei pacchetti:

 �  PING verso ogni rete

 �  TRACEROUTE verso ogni rete

 �  Accesso DNS


 �  Restrizioni della rete interna:


 �  Permettere WWW, ftp, traceroute, ssh verso l'esterno

 �  Permettere SMTP verso il Mail server

 �  Permettere POP-3 verso il Mail server

 �  Permettere DNS verso il Name server

 �  Permettere rsync verso il Web server

 �  Permettere WWW verso il Web server

 �  Permettere il ping alla macchina filtro


 �  L'interfaccia interna riceve ping, risposte al ping e errori ICMP.



      ipchains -A good-if -i ! eth1 -j DENY
      ipchains -A good-if -p ICMP --icmp-type ping -j ACCEPT
      ipchains -A good-if -p ICMP --icmp-type pong -j ACCEPT
      ipchains -A good-if -j icmp-acc
      ipchains -A good-if -j DENY -l





 7.5.  Per finire


 �  Cancellare le regole di bloccaggio:


      ipchains -D input 1
      ipchains -D forward 1
      ipchains -D output 1





 8.  Appendice: Differenze tra ipchains e ipfwadm

 Alcune di queste modifiche sono il risultato di modifiche nel kernel,
 e altre dipendono dal fatto che ipchains sembra differente da ipfwadm.



 1. Molti argomenti sono stati rimappati: le maiuscole ora indicano un
    comando e le minuscole indicano un'opzione.

 2. Sono supportate catene arbitrarie e quindi anche le catene
    predefinite ora hanno un nome invece di essere solamente un opzione
    (eg. `input' invece di `-I').

 3. L'opzione `-k' non c'� pi�: si usi `! -y'.

 4. L'opzione `-b' inserire/aggiunge/cancella veramente due regole,
    piuttosto che una singola regola `bidirezionale'.

 5. L'opzione `-b' pu� essere passata a `-C' per fare due verifiche
    (una in ogni direzione).


 6. L'opzione `-x' a `-l' � stata rimpiazzata da `-v'.

 7. Non sono pi� supportate porte di provenienza e destinazione
    multiple.  Spero che l'essere in grado di negare un intervallo di
    porte venga in aiuto in questi casi.

 8. Le interfacce possono essere specificate solamente attraverso il
    nome (non l'indirizzo).  Comunque, la vecchia semantica � stata
    silenzionamente cambiata nei kernel della serie 2.1.

 9. I frammenti sono esaminati, non lasciati passare automaticamente.

 10.
    Sono state rimosse le catene specifiche per l'accounting.

 11.
    Possono essere testati protocolli arbitrari su IP.

 12.
    Il vecchio comportamente del SYN e ACK matching (che in precedenza
    era ignorato per i pacchetti non TCP) � cambiato; l'opzione SYN non
    � valida per regole non specifiche per il TCP.

 13.
    I contatori sono ora a 64 bit su macchine a 32 bit, non pi� a 32
    bit.

 14.
    Ora sono supportate le opzioni inverse.

 15.
    Ora sono supportati i codici ICMP.

 16.
    Sono supportati i caratteri jolly nella specifica dell'interfaccia.

 17.
    Ora � controllata l'integrit� delle manipolazioni TOS: il vecchio
    codice del kernel sileziosamente bloccava le manipolazioni
    (illegali) del bit TOS `Must Be Zero'; ipchains ora restituisce un
    errore se ci si prova, come anche per gli altri casi illegali.


 8.1.  Tabella di riferimento rapido

 [ Gli argomenti dei comandi sono in MAIUSCOLO, mentre gli argomenti
 delle opzioni in minuscolo ]


 Una cosa da notare, il masquerading � specificato da `-j MASQ'; �
 completamente diverso da `-j ACCEPT', e non � trattato come un mero
 effetto collaterale, diversamente da quanto fa ipfwadm.














 ===================================================================
 | ipfwadm      | ipchains                | Note
 -------------------------------------------------------------------
 | -A [both]    | -N acct                 | Crea una catena `acct'
 |              |& -I 1 input -j acct     | e fa s� che i pacchetti
 |              |& -I 1 output -j acct    | in ingresso e in uscita
 |              |& acct                   | la traversino.
 -------------------------------------------------------------------
 | -A in        | input                   | Una regola senza tattica
 -------------------------------------------------------------------
 | -A out       | output                  | Una regola senza tattica
 -------------------------------------------------------------------
 | -F           | forward                 | Si usi questo come [catena]
 -------------------------------------------------------------------
 | -I           | input                   | Si usi questo come [catena]
 -------------------------------------------------------------------
 | -O           | output                  | Si usi questo come [catena]
 -------------------------------------------------------------------
 | -M -l        | -M -L                   |
 -------------------------------------------------------------------
 | -M -s        | -M -S                   |
 -------------------------------------------------------------------
 | -a tattica   | -A [catena] -j TATTICA  | (si veda anche -r e -m).
 -------------------------------------------------------------------
 | -d tattica   | -D [catena] -j TATTICA  | (si veda anche -r e -m).
 -------------------------------------------------------------------
 | -i tattica   | -I 1 [catena] -j TATTICA| (si veda anche -r e -m).
 -------------------------------------------------------------------
 | -l           | -L                      |
 -------------------------------------------------------------------
 | -z           | -Z                      |
 -------------------------------------------------------------------
 | -f           | -F                      |
 -------------------------------------------------------------------
 | -p           | -P                      |
 -------------------------------------------------------------------
 | -c           | -C                      |
 -------------------------------------------------------------------
 | -P           | -p                      |
 -------------------------------------------------------------------
 | -S           | -s                      | Accetta solo una porta o
 |              |                         | intervallo.
 -------------------------------------------------------------------
 | -D           | -d                      | Accetta solo una porta o
 |              |                         | intervallo.
 -------------------------------------------------------------------
 | -V           | <nessuna>               | Si usi -i [nome].
 -------------------------------------------------------------------
 | -W           | -i                      |
 -------------------------------------------------------------------
 | -b           | -b                      | Crea 2 regole.
 -------------------------------------------------------------------
 | -e           | -v                      |
 -------------------------------------------------------------------
 | -k           | ! -y                    | Non funziona finch� non
 |              |                         | si specifica anche -p tcp.
 -------------------------------------------------------------------
 | -m           | -j MASQ                 |
 -------------------------------------------------------------------
 | -n           | -n                      |
 -------------------------------------------------------------------
 | -o           | -l                      |
 -------------------------------------------------------------------
 | -r [redirpt] | -j REDIRECT [redirpt]   |
 -------------------------------------------------------------------
 | -t           | -t                      |
 -------------------------------------------------------------------
 | -v           | -v                      |
 -------------------------------------------------------------------
 | -x           | -x                      |
 -------------------------------------------------------------------
 | -y           | -y                      | Non funziona finch� non
 |              |                         | si specifica anche -p tcp.
 -------------------------------------------------------------------




 8.2.  Esempi di traduzione di comandi ipfwadm

 Vecchio comando: ipfwadm -F  -p deny

 Nuovo comando: ipchains -P forward DENY


 Vecchio comando: ipfwadm -F -a m -S 192.168.0.0/24 -D 0.0.0.0/0

 Nuovo comando: ipchains -A forward -j MASQ -s 192.168.0.0/24 -d
 0.0.0.0/0


 Vecchio comando: ipfwadm -I -a accept -V 10.1.2.1 -S 10.0.0.0/8 -D
 0.0.0.0/0

 Nuovo comando: ipchains -A input -j ACCEPT -i eth0 -s 10.0.0.0/8 -d
 0.0.0.0/0

 (Si noti che questi non sono equivalenti specificando l'interfaccia
 tramite l'indirizzo: si usi il nome di interfaccia.  In questa
 macchina 10.1.2.1 corrisponde a eth0).


 9.  Appendice: Usare lo script ipfwadm-wrapper.

 Lo script shell ipfwadm-wrapper dovrebbe essere un plug-in di
 rimpiazzo di ipfwadm per compatibilit� all'indietro con ipfwadm 2.3a.


 La sola caratteristica che non posso veramente gestire � l'opzione
 `-V'.  Quando � usata, � mostrato un avviso.  Se � usata anche
 l'opzione `-W', l'opzione `-V' � ignorata.  Altrimenti, lo script
 prova a trovare il nome di interfaccia associato con quell'indirizzo,
 usando ifconfig.  Se fallisce (come nel caso di un'interfaccia non
 attiva) allora uscir� con un messaggio d'errore.


 Questo avviso pu� essere soppresso o cambiando il `-V' in un `-W',
 oppure direzionando lo standard output dello script a /dev/null.


 Se si trova un qualsiasi errore nello script, o una qualsiasi
 differenza tra il vero ipfwadm e questo script, invito a segnalarmi il
 bug: si invii un'email a [email protected] con "BUG-REPORT" nel
 subject.  Prego si segnali la versione del vecchio ipfwadm (ipfwadm
 -h), la versione di ipchains (ipchains --version) e quella dello
 script ipfwadm wrapper script (ipfwadm-wrapper --version).  Si invii
 anche l'output di ipchains-save.  Grazie in anticipo.


 Se si mischia ipchains con questo script ipfwadm-wrapper lo si fa a
 proprio rischio e pericolo.

 10.  Appendice: Ringraziamenti.

 Molte grazie a Michael Neuling, che ha scritto la prima cosa
 rilasciabile del codice IP chains mentre lavorava per me.  Mi scuso
 pubblicamente per aver respinto la sua idea del result-caching, che
 Alan Cox propose un po' dopo e finalmente mi sono deciso a
 implementare, rendendomi conto dell'errore che avevo commesso.


 Grazie ad Alan Cox per il suo supporto tecnico via email 24 ore su 24
 ed il suo incoraggiamento.


 Grazie a tutti gli autori del codice ipfw e ipfwadm, specialmente a
 Jos Vos.  Standing on the shoulders of giants and all that...  Ci�
 vale anche per Linus Torvalds oltre che a tutti gli hacker del kernel
 e dello userspace.


 Un ringraziamento ai diligenti beta tester e bughunter (cacciatori di
 bug), specialmente a Jordan Mendelson, Shaw Carruthers, Kevin Moule,
 Dr. Liviu Daia, Helmut Adams, Franck Sicard, Kevin Littlejohn, Matt
 Kemner, John D. Hardin, Alexey Kuznetsov, Leos Bitto, Jim Kunzman,
 Gerard Gerritsen, Serge Sivkov, Andrew Burgess, Steve Schmidtke,
 Richard Offer, Bernhard Weisshuhn, Larry Auton, Ambrose Li, Pavel
 Krauz, Steve Chadsey, Francesco Potort� e Alain Knaff.

 Il tradottore vuole ringraziare Alvise Bellotti per la sue
 indispensabili correzioni e suggerimenti.