
Masquerading made simple HOWTOJohn Tapsell

      tapselj0@cs.man.ac.uk

Thomas Spellman

      thomas@resonance.org

Matthias Grimm

      DeadBull@gmx.net
   Diario delle revisioni
   Revisione 0.08 2002-07-11 Corretto da: jpt
   Revisione 0.07 2002-02-27 Corretto da: jpt
   Revisione 0.06 2001-09-08 Corretto da: jpt
   Revisione 0.05 2001-09-07 Corretto da: jpt
   Revisione 0.04 2001-09-01 Corretto da: jpt
   Revisione 0.03 2001-07-06 Corretto da: jpt

   Tutti gli autori sono contattabili sul canale #debian su
   irc.opensource.net

   John Tapsell (JohnFlux)  il curatore ufficiale.

   Io (John Tapsell) sono disponibile al contatto via email per qualsiasi
   domanda, feedback, polemica ed anche per appuntamenti ecc.

   Si  rubato senza vergogna dal lavoro di David Ranch -
   <dranch@trinnet.net>.

   Questo documento non intende rimpiazzare IP-Masquerading HOWTO ma gli
    complementare, i due documenti andrebbero letti fianco a fianco. Non
   includer cose di cui si occupa l'altro HOWTO, n dar spiegazioni di
   carattere generale. Si consulti http://ipmasq.cjb.net e il solito
   Masq-HOWTO per informazioni di questo tipo.

   Questo documento descrive come abilitare la funzionalit di
   Masquerading IP su un host Linux. IP Masq  una forma di NAT (Network
   Address Translation) che permette alle macchine di una rete locale che
   non hanno uno o pi indirizzi Internet registrati di comunicare con
   Internet attraverso delle macchine (Linux, nel nostro caso) dotate di
   un singolo indirizzo IP pubblico.

   Il documento  rilasciato sotto licenza GNU Free Documentation
   License.

   http://www.gnu.org/copyleft/fdl.html 

   Traduzione a cura di Riccardo Fabris (frick at linux.it).
     _________________________________________________________________

   Sommario
   1. Introduzione
   2. Sommario: (mi piace partire con i sommari)
   3. Versione un po' pi approfondita
   4. Istruzioni di post-installazione
   5. FAQ - le lament... le domande poste pi di frequente

1. Introduzione

La faremo breve e andremo dritti al punto.

Si ha una rete locale, che si vuol far comunicare con l'esterno:

   [network.png]
     _________________________________________________________________

2. Sommario: (mi piace partire con i sommari)

Si assuma che la scheda di rete esterna, verso Internet, sia eth0, che l'IP
esterno sia 123.12.23.43 e che la scheda di rete interna sia eth1, quindi:
$> modprobe ipt_MASQUERADE # Se fallisce, si provi ad andare avanti comunque
$> iptables -F; iptables -t nat -F; iptables -t mangle -F
$> iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 123.12.23.43
$> echo 1 > /proc/sys/net/ipv4/ip_forward

   O, per una connessione telefonica:
$> modprobe ipt_MASQUERADE # Se fallisce, si provi ad andare avanti comunque
$> iptables -F; iptables -t nat -F; iptables -t mangle -F
$> iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
$> echo 1 > /proc/sys/net/ipv4/ip_forward

   Poi, per rendere il tutto pi sicuro:
$> iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$> iptables -A INPUT -m state --state NEW -i ! eth0 -j ACCEPT
$> iptables -P INPUT DROP   #solo dopo che i due precedenti hanno avuto success
o
$> iptables -A FORWARD -i eth0 -o eth0 -j REJECT

   Ora, per una connessione telefonica (con eth0 scheda di rete interna):
$> iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$> iptables -A INPUT -m state --state NEW -i ! ppp0 -j ACCEPT
$> iptables -P INPUT DROP   #solo dopo che i due precedenti hanno avuto success
o
$> iptables -A FORWARD -i ppp0 -o ppp0 -j REJECT

   Tutto qui! Per vedere le regole di masquerading si dia "iptables -t
   nat -L"
     _________________________________________________________________

3. Versione un po' pi approfondita

Compilare il kernel (serve un kernel 2.4.x o successivo).

Serve abilitare il supporto alle seguenti funzionalit del kernel:

     * Sotto "Networking Options"
          + Network packet filtering (CONFIG_NETFILTER)
     * Sotto "Networking Options->Netfilter Configuration"
          + Connection tracking (CONFIG_IP_NF_CONNTRACK)
          + FTP Protocol support (CONFIG_IP_NF_FTP)
          + IP tables support (CONFIG_IP_NF_IPTABLES)
          + Connection state match support (CONFIG_IP_NF_MATCH_STATE)
          + Packet filtering (CONFIG_IP_NF_FILTER)
               o REJECT target support (CONFIG_IP_NF_TARGET_REJECT)
          + Full NAT (CONFIG_IP_NF_NAT)
               o MASQUERADE target support
                 (CONFIG_IP_NF_TARGET_MASQUERADE)
               o REDIRECT target support (CONFIG_IP_NF_TARGET_REDIRECT)
          + Packet mangling (CONFIG_IP_NF_MANGLE)
          + LOG target support (CONFIG_IP_NF_TARGET_LOG)

   Per prima cosa, se i moduli iptable e masq non sono incorporati nel
   kernel n installati, ma esistono come moduli caricabili, bisogna
   installarli. Con "insmod ipt_MASQUERADE" si caricheranno ip_tables,
   ip_conntrack e iptable_nat.
$> modprobe ipt_MASQUERADE

   L'intranet da collegare a Internet potrebbe essere composta da molte
   macchine o solo da un paio, in realt non fa molta differenza.

   Bene, sto dando per scontato che non servano altre regole. A questo
   punto si dia:
$> iptables -F; iptables -t nat -F; iptables -t mangle -F

   Se si ottiene un errore e dice che iptables non si trova, lo si trovi
   ed installi. Se dice che non c' alcuna tabella "nat", si ricompili il
   kernel col supporto a nat. Se dice che non c' alcuna tabella
   "mangle", non ci si preoccupi, non  necessaria al masquerading. Se
   dice che iptables  incompatibile con il proprio kernel, ci si procuri
   un kernel 2.4 e lo si compili col supporto a iptables.

   In caso si abbia un IP statico (p.e. non si usa DHCP), si dia:
$> iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 123.12.23.43

   per un IP dinamico (p.e. un modem, ma ci si deve prima collegare!):
$> iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

   Infine, per dire al kernel che si desidera iniziare a fare il forward
   dei pacchetti (cosa necessaria solo una volta per reboot, ma a farlo
   pi volte non succede nulla di male), si dia:
$> echo 1 > /proc/sys/net/ipv4/ip_forward

   Una volta che si  controllato che tutto funziona (si vedano le
   istruzioni di post- installazione pi avanti) si deve permettere il
   masquerading solo dalla rete interna; non si vorr mica che qualcuno
   su Internet ne abusi! :)

   Per prima cosa, si consentano le connessioni preesistenti o qualunque
   cosa ad esse correlate (p.e. un server ftp che si collega di rimando):
$> iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

   Se d un errore, molto probabilmente nel kernel non  abilitato il
   "connection tracking", perci lo si ricompili. Poi si permettano nuove
   connessioni solo dalla propria intranet (rete interna o locale). Si
   rimpiazzi ppp0 con eth0 o qualunque altra cosa sia il proprio device
   di rete verso l'esterno. (Il "!"  una negazione, significa "qualsiasi
   cosa tranne").
$> iptables -A INPUT -m state --state NEW -i ! ppp0 -j ACCEPT

   Ora si neghi tutto il resto:
$> iptables -P INPUT DROP   #solo se i due precedenti hanno avuto successo

   Se una delle due regole precedenti  fallita, l'ultima regola impedir
   completamente il funzionamento del masquerading. Per annullare
   l'ultima regola si usi "iptables -P INPUT ACCEPT".
     _________________________________________________________________

4. Istruzioni di post-installazione

Ora dovrebbe funzionare tutto. Non ci si dimentichi di:

     * Configurare tutti i client della rete interna affinch usino l'IP
       interno della macchina Linux come gateway.
     * Configurare tutti i client affinch usino un eventuale proxy HTTP
       del provider, un proxy trasparente (ATTENZIONE: ho sentito dire
       che i proxy trasparenti possono essere molto lenti in caso di reti
       molto ampie) o Squid fatto girare sul gateway Linux (un'opzione da
       prendere in considerazione per grosse reti).
     * Ci si assicuri di specificare un server DNS nella configurazione
       dei client, altrimenti si otterranno errori circa la mancata
       risoluzione degli indirizzi. Se il DNS funzionava prima di
       configurare il masquerading e dopo non funziona pi, accade perch
       il server DHCP del provider non pu pi fornire l'indirizzo del
       server DNS.
       [OT] Si potrebbe provare semplicemente a inviare un messaggio dhcp
       broadcast che inoltri ai client l'indirizzo del server DNS (e gi
       che ci siamo anche l'indirizzo del proxy http) senza dover
       configurare un server DHCP (o anche configurandolo). Mi piacerebbe
       discuterne con qualcuno via email :)
       Grazie a Richard Atcheson per avermi fatto notare la cosa.
     * Ora si dovrebbe iniziare a pensare alla sicurezza! Prima di tutto
       si disabiliti il forward generico: "iptables -P FORWARD DROP",
       quindi ci si informi su come usare iptables, /etc/hosts.allow e
       /etc/hosts.deny per rendere pi sicuro il sistema. ATTENZIONE: non
       usare la regola di iptables summenzionata se non dopo aver
       accertato che il masquerading effettivamente funzioni. Si deve
       permettere esplicitamente il passaggio dei pacchetti dove lo si
       desidera in caso si voglia negare il forward per default. (Il
       comando si annulla con "iptables -P FORWARD ACCEPT").
     * Si permetta l'accesso a qualsiasi servizio che si vuole rendere
       visibile su Internet.
       Per esempio, per permettere l'accesso al web server:
$> iptables -A INPUT --protocol tcp --dport 80 -j ACCEPT
$> iptables -A INPUT --protocol tcp --dport 443 -j ACCEPT
       Per consentire l'ident (per connessioni ad irc ecc.):
$> iptables -A INPUT --protocol tcp --dport 113 -j ACCEPT

   Per testare la configurazione:

     * Provare a connettersi da un client all'indirizzo numerico di un
       web server. Per esempio uno degli IP di Google  216.239.33.100.
       Si dovrebbe ottenere una replica da esso. Per esempio: "ping
       216.239.33.100" "lynx 216.239.33.100".
     * Provare una connessione completa con il nome. Per esempio "ping
       google.com" "lynx google.com" o usando Internet Explorer o
       Netscape.

   Dove eth0  la scheda di rete ethernet verso Internet e 123.12.23.43 
   l'IP pubblico della macchina.
     _________________________________________________________________

5. FAQ - le lament... le domande poste pi di frequente

     * Come posso ottenere un elenco delle regole introdotte?
       - Prova a dare:
$> iptables -L
$> iptables -t nat -L
     * Non risolve gli indirizzi! Ho provato con "www.microsoft.com" ma
       mi dice che non lo trova!
       - Assicurati di fornire a tutti i client l'IP del server DNS.
     * Non funziona! Non accetta iptables / NAT / SNAT / MASQ.
       - Recupera il kernel pi recente e compilalo con il supporto
       completo a iptables e NAT.
     * Non funziona! Il masquerading non funziona proprio, mannaggia!
       - Non  che hai tralasciato di dare echo 1 >
       /proc/sys/net/ipv4/ip_forward?!
     * Non funziona! Non mi funziona manco la rete, ti odio!
       - Prova con
$> iptables -F
$> iptables -t nat -F
$> iptables -t mangle -F
       (cos si eliminano tutte le regole), poi rilancia tutte le altre
       regole di iptables.
       - Prova con iptables -P FORWARD ACCEPT
     * Non funziona ancora!
       - Hmhmhm, "dmesg | tail" d qualche errore? E "cat
       /var/log/messages | tail" ? Non posso mica pensare a tutto io...
     * Non ce la faccio, non mi funziona proprio!
       - Boh! ...comunque prima di iniziare a sperimentare con il
       masquerading dovresti assicurarti di:
        1) poter fare il ping di un indirizzo Internet dal gateway;
        2) poter fare il ping delle macchine della rete interna dal gateway;
        3) poter fare il ping del gateway dalle macchine della rete interna.
     * Dove devo ficcare tutta questa roba?
       - Nel file /etc/network/interfaces o firewall.rc. Se lo metti nel
       file interfaces, mettilo nell'opzione pre-up per l'interfaccia
       esterna e poni nel post-down "iptables -t nat -F".
     * Che devo fare per far s che la connessione ppp venga attivata
       solo quando serve ("ppp on demand")?
       - Se per esempio l'IP del gateway del provider  23.43.12.43,
       aggiungi una riga:
       :23.43.12.43
       in fondo a /etc/ppp/peers/provider. (Questo se ti viene attribuito
       un IP dinamico, in caso di IP statico potresti usare
       IP_statico:23.43.12.43). [La parte sul "ppp on demand" mi pare un
       po' confusa, p.e. qui, aggiungendo le opzioni ipcp-accept-local e
       ipcp-accept-remote, si possono usare anche due IP fittizi NdT].
       Quindi aggiungi su una nuova riga in fondo allo stesso file:
       demand
       Pppd rimarr in background per riconnettersi a richiesta se la
       connessione cade, fino a quando non darai il comando "ifdown ppp0"
       o "poff". Se invece aggiungi l'opzione "nopersist", pppd uscir
       una volta attivata la connessione. Puoi anche aggiungere su una
       nuova riga "idle 600" per disconnetterti dopo 10 minuti di
       inattivit.
     * La connessione continua a cadermi!
       - Innanzitutto usi una connessione a richiesta? Funziona come
       dovrebbe? Controlla /etc/ppp/peers/provider e assicurati che la
       connessione telefonica funzioni correttamente prima di provare col
       masquerading.
       - In seconda battuta, se continua a non funzionare potrebbe
       trattarsi di quel che  capitato a me: per motivi misteriosi sono
       dovuto ritornare al kernel 2.4.3 affinch tutto funzionasse, ma
       non so il perch.
     * Non ho alcuna voglia di fare tutto a mano! Voglio uno script
       prefabbricato, una GUI e tutto il resto.
       - Prova questo: http://shorewall.sourceforge.net/
       Struggiti dal dolore!
     * I cable modem li devo considerare tra gli IP statici o dinamici?
       - Buona domanda... potrebbero pure essere dinamici.
     * Devo considerare le schede di rete DHCP come IP statici o
       dinamici?
       - Sono dinamici.
     * Come posso gestire i servizi con connessioni in entrata?
       - Prova con il forward o la redirezione delle porte - ancora una
       volta assicurati di configurare il firewall a tal fine se
       necessario.
     * Riesco a fare il ping dell'indirizzo esterno del gateway Linux dai
       client della rete, ma non riesco ad accedere a Internet.
       - Ok, prova con "rmmod iptable_filter"; fornir maggiori
       informazioni quando le avr disponibili.
       - Assicurati che non stai facendo girare routed o gated, per
       saperlo lancia "ps aux | grep -e routed -e gated".
       - Consulta http://ipmasq.cjb.net.
     * Come posso vedere le connessioni stabilite? Una cosa tipo
       netstat...
       - prova con "cat /proc/net/ip_conntrack"
     * Mi servono maggiori informazioni su squid, l'instradamento e roba
       simile!
       - Dai un'occhiata all'"Advanced Routing HOWTO"
       (http://www.linuxdoc.org/HOWTO/Adv-Routing-HOWTO.html).
     * Questo howto  una vaccata! Dove posso beccare i tizi che l'hanno
       scritto per rinfacciarglielo?
       - Entra nel canale irc #debian sul server irc.opensource.net e
       cerca JohnFlux. - Scrivimi (sono JohnFlux) a tapselj0@cs.man.ac.uk
     * Questo howto fa schifo! Dove posso trovare documentazione
       migliore?
       - Da' un'occhiata a http://ipmasq.cjb.net.
       - Consulta il Masq-HOWTO di LDP.
     * Su cos'altro state lavorando?
       Attualmente sto scrivendo una guida "Linux e i sistemi
       missile-anti-missile per principianti". Non ci sono documenti
       decenti per newbie sulla protezione del proprio sistema da
       attacchi nucleari. La gente sembra pensare che si tratti di
       missilistica o roba simile...
