Sophie

Sophie

distrib > Mandriva > 9.1 > i586 > by-pkgid > f1098342ec4a2b28475e34123ce17201 > files > 399

howto-html-it-9.1-0.5mdk.noarch.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
 <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
 <TITLE>Linux IPCHAINS HOWTO: Un esempio pi&ugrave; serio</TITLE>
 <LINK HREF="IPCHAINS-HOWTO-8.html" REL=next>
 <LINK HREF="IPCHAINS-HOWTO-6.html" REL=previous>
 <LINK HREF="IPCHAINS-HOWTO.html#toc7" REL=contents>
</HEAD>
<BODY>
<A HREF="IPCHAINS-HOWTO-8.html">Avanti</A>
<A HREF="IPCHAINS-HOWTO-6.html">Indietro</A>
<A HREF="IPCHAINS-HOWTO.html#toc7">Indice</A>
<HR>
<H2><A NAME="s7">7. Un esempio pi&ugrave; serio</A></H2>

<P>Questo esempio &egrave; estratto dal tutorial scritto da me e Michael Neuling
apparso in LinuxWorld nel Marzo 1999; non &egrave; il solo modo per risolvere
il problema in esame, ma probabilmente &egrave; il pi&ugrave; semplice.  Spero lo si
trovi interessante.
<P>
<P>
<H2><A NAME="ss7.1">7.1 La situazione</A>
</H2>

<P>
<UL>
<LI> Rete interna con il masquerading (con diversi sistemi
operativi) che chiameremo ``GOOD''.
</LI>
<LI> Server esposti in una rete separata (chiamata ``DMZ'' per
Demilitarized Zone -- Zona Demilitarizzata).
</LI>
<LI> Connessione PPP a Internet (detta ``BAD'').</LI>
</UL>
<P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
   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)
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H2><A NAME="ss7.2">7.2 Scopi</A>
</H2>

<P>
<P>Macchina per il filtraggio dei pacchetti:
<DL>
<DT><B> PING da/per qualsiasi rete</B><DD><P>Questo &egrave; veramente utile per sapere se una macchina &egrave; attiva.
<P>
<DT><B> TRACEROUTE da/per qualsiasi rete </B><DD><P>Ancora, utile per la diagnostica.
<P>
<DT><B> Accesso DNS </B><DD><P>Rende ping e DNS pi&ugrave; utili.
<P>
</DL>
<P>
<P>All'interno di DMZ: 
<P>
<P>Mail server
<UL>
<LI> SMTP verso l'esterno</LI>
<LI> Accetta SMTP dall'interno e dall'esterno</LI>
<LI> Accetta POP-3 dall'interno</LI>
</UL>
<P>Name Server 
<UL>
<LI> Invia richieste DNS all'esterno</LI>
<LI> Accetta richieste DNS dall'interno, dall'esterno e dalla
macchina per il filtraggio dei pacchetti.</LI>
</UL>
<P>
<P>Server web
<UL>
<LI> Accetta connessioni HTTP dall'interno e dall'esterno</LI>
<LI> Accesso rsync dall'interno</LI>
</UL>
<P>
<P> Rete interna:
<DL>
<DT><B>Permettere WWW, ftp, traceroute, ssh verso l'esterno</B><DD><P>Queste sono cose abbastanza standard da permettere: alcuni iniziano
permettendo di fare tutto alla rete interna, ma qui saremo un po' pi&ugrave;
restrittivi.
<P>
<DT><B> Permettere connessioni SMTP verso il mail server </B><DD><P>Ovviamente vogliamo poter inviare mail verso l'esterno.
<P>
<DT><B> Permettere connessioni POP-3 verso il mail server </B><DD><P>Questo &egrave; il modo per leggere la propria posta.
<P>
<DT><B> Permettere connessioni DNS verso il name server </B><DD><P>Vogliamo essere in grado di cercare i nomi esterni dei siti per il
WWW, ftp, traceroute e ssh.
<P>
<DT><B> Permettere connessioni rsync verso il server web</B><DD><P>Questo &egrave; il modo per sincronizzare il server web esterno con quello
interno. 
<P>
<DT><B> Permettere connessioni WWW verso il server web</B><DD><P>Ovviamente, vogliamo poterci connettere al nostro server web esterno.
<P>
<DT><B> Permettere il ping verso la macchina per il filtraggio dei pacchetti</B><DD><P>Questa &egrave; una pura cortesia: significa che si pu&ograve; controllare se la
macchina firewall &egrave; gi&ugrave;.
<P>
</DL>
<P>
<H2><A NAME="ss7.3">7.3 Prima del filtraggio dei pacchetti</A>
</H2>

<P>
<UL>
<LI> Anti-spoofing.

<P>Poich&eacute; non c'&egrave; nessun instradamento asimmetrico, semplicemente si pu&ograve;
attivare l'anti-spoofing per tutte le interfacce.
<P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
# for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done
# 
</PRE>
</CODE></BLOCKQUOTE>
<P>
</LI>
<LI> Impostare le regole di filtraggio per proibire (DENY) tutto.

<P>Si permetter&agrave; ancora il traffico locale su loopback, ma verr&agrave; proibito
tutto il resto.
<P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
# ipchains -A input -i ! lo -j DENY
# ipchains -A output -i ! lo -j DENY
# ipchains -A forward -j DENY
# 
</PRE>
</CODE></BLOCKQUOTE>
<P>
</LI>
<LI> Configurare le interfacce.

<P>Solitamente ci&ograve; &egrave; 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.
<P>
</LI>
<LI> Inserire moduli di masquerading per ciascun protocollo.
<P>Si devono inserire i moduli di masquerading per FTP, in modo che
funzioni l'FTP sia attivo che passivo per la rete interna.
<P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
# insmod ip_masq_ftp
# 
</PRE>
</CODE></BLOCKQUOTE>
</LI>
</UL>
<P>
<H2><A NAME="ss7.4">7.4 Filtraggio dei pacchetti per i pacchetti di passaggio</A>
</H2>

<P>Con il masquerading, la cosa migliore &egrave; filtrare nella catena forward.
<P>
<P>Si suddivida la catena forward in diverse catene utente a seconda
delle interfacce di provenienza/destinazione; ci&ograve; spacca il problema
in tronconi gestibili pi&ugrave; facilmente.
<P>
<BLOCKQUOTE><CODE>
<PRE>
ipchains -N good-dmz
ipchains -N bad-dmz
ipchains -N good-bad
ipchains -N dmz-good
ipchains -N dmz-bad
ipchains -N bad-good
</PRE>
</CODE></BLOCKQUOTE>
<P>Una cosa comune da fare &egrave; di accettare (ACCEPT) errori ICMP standard,
e quindi si crea una catena solo per loro.
<P>
<BLOCKQUOTE><CODE>
<PRE>
ipchains -N icmp-acc
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H3>Impostare i salti dalla catena forward</H3>

<P>Sfortunatamente, &egrave; 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).
<P>
<P>Si noti che si registra qualsiasi cosa che non soddisfa una di queste
regole (ovviamente ci&ograve; non dovrebbe mai succedere).
<P>
<BLOCKQUOTE><CODE>
<PRE>
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
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H3>Definire la catena icmp-acc</H3>

<P>I pacchetti che siano degli errori ICMP sono accettati, altrimenti
il controllo passer&agrave; alla catena chiamante.
<P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
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
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H3>Da Good (interno) a DMZ (server)</H3>

<P>Restrizioni della rete interna:
<UL>
<LI> Permettere WWW, ftp, traceroute, ssh verso l'esterno</LI>
<LI> <B>Permettere SMTP verso il Mail server</B></LI>
<LI> <B>Permettere POP-3 verso il Mail server</B></LI>
<LI> <B>Permettere DNS verso il Name server</B></LI>
<LI> <B>Permettere rsync verso il Web server</B></LI>
<LI> <B>Permettere WWW verso il Web server</B></LI>
<LI> Permettere il ping alla macchina filtro</LI>
</UL>
<P>Si potrebbe fare il masquerading dalla rete interna nella DMZ, ma qui
non si far&agrave;.  Poich&eacute; nessuno nella rete interna dovrebbe provare a
fare cose brutte, registriamo qualsiasi pacchetto che venga proibito.
<P>
<P>Si noti che le vecchie versioni di Debian usavano `pop-3' invece di
`pop3' in /etc/services, cosa che viola l'RFC1700.
<P>
<P>
<BLOCKQUOTE><CODE>
<PRE>
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 pop3 -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
</PRE>
</CODE></BLOCKQUOTE>
<P>
<P>
<H3>Da Bad (esterno) a DMZ (server).</H3>

<P>
<P>
<UL>
<LI> Restrizioni di DMZ: 
<UL>
<LI> Mail server
<UL>
<LI> <B>SMTP verso l'esterno</B></LI>
<LI> <B>Accetta SMTP da</B> interno ed <B>esterno</B></LI>
<LI> Accetta POP-3 dall'interno</LI>
</UL>

</LI>
<LI> Name server 
<UL>
<LI> <B>Invia DNS verso l'esterno</B></LI>
<LI> <B>Accetta DNS da</B> interno, <B>esterno</B> e dalla
macchina per il filtraggio dei pacchetti</LI>
</UL>

</LI>
<LI> Web server 
<UL>
<LI> <B>Accetta HTTP da</B> interno e <B>esterno</B></LI>
<LI> Accesso rsync dall'interno</LI>
</UL>
</LI>
</UL>

</LI>
<LI> Cose permesse dalla rete esterna verso DMZ
<UL>
<LI> Non si registrano le violazioni, in quanto possono succedere.</LI>
</UL>

<BLOCKQUOTE><CODE>
<PRE>
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
</PRE>
</CODE></BLOCKQUOTE>
</LI>
</UL>
<P>
<H3>Da Good (interno) a Bad (esterno).</H3>

<P>
<UL>
<LI>Restrizioni della rete interna:
<UL>
<LI> Permettere WWW, ftp, traceroute, ssh verso l'esterno</LI>
<LI> <B>Permettere SMTP verso il Mail server</B></LI>
<LI> <B>Permettere POP-3 verso il Mail server</B></LI>
<LI> <B>Permettere DNS verso il Name server</B></LI>
<LI> <B>Permettere rsync verso il Web server</B></LI>
<LI> <B>Permettere WWW verso il Web server</B></LI>
<LI> Permettere il ping alla macchina filtro</LI>
</UL>
</LI>
<LI> Molti permettono qualsiasi cosa dalla rete interna verso quella
esterna. Qua facciamo un po' i fascisti.
<UL>
<LI> Registrazione delle violazioni.</LI>
<LI> FTP passivo gestito dal modulo del masquerading</LI>
<LI> le porte di destinazione UDP 33434 e successive sono usate da
traceroute. </LI>
</UL>

<BLOCKQUOTE><CODE>
<PRE>
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
</PRE>
</CODE></BLOCKQUOTE>
</LI>
</UL>
<P>
<H3>Da DMZ a Good (interno).</H3>

<P>
<P>
<UL>
<LI>Restrizioni della rete interna:
<UL>
<LI> Permettere WWW, ftp, traceroute, ssh verso l'esterno</LI>
<LI> <B>Permettere SMTP verso il Mail server</B></LI>
<LI> <B>Permettere POP-3 verso il Mail server</B></LI>
<LI> <B>Permettere DNS verso il Name server</B></LI>
<LI> <B>Permettere rsync verso il Web server</B></LI>
<LI> <B>Permettere WWW verso il Web server</B></LI>
<LI> Permettere il ping alla macchina filtro</LI>
</UL>

</LI>
<LI> 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&agrave; stabilita.

<BLOCKQUOTE><CODE>
<PRE>
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-good -j DENY -l
</PRE>
</CODE></BLOCKQUOTE>
</LI>
</UL>
<P>
<H3>Da DMZ a Bad (esterno).</H3>

<P>
<P>
<UL>
<LI> Restrizioni di DMZ: 
<UL>
<LI> Mail server
<UL>
<LI> <B>SMTP verso l'esterno</B></LI>
<LI> <B>Accetta SMTP da</B> interno ed <B>esterno</B></LI>
<LI> Accetta POP-3 dall'interno</LI>
</UL>

</LI>
<LI> Name server 
<UL>
<LI> <B>Invia DNS verso l'esterno</B></LI>
<LI> <B>Accetta DNS da</B> interno, <B>esterno</B> e dalla
macchina per il filtraggio dei pacchetti</LI>
</UL>

</LI>
<LI> Web server 
<UL>
<LI> <B>Accetta HTTP da</B> interno e <B>esterno</B></LI>
<LI> Accesso rsync dall'interno</LI>
</UL>
</LI>
</UL>

 </LI>
<LI>
<BLOCKQUOTE><CODE>
<PRE>
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
</PRE>
</CODE></BLOCKQUOTE>
</LI>
</UL>
<P>
<H3>Da Bad (esterno) a Good (interno).</H3>

<P>
<P>
<UL>
<LI> Non si permette niente (non mascherato) dalla rete esterna
verso quella interna
<BLOCKQUOTE><CODE>
<PRE>
ipchains -A bad-good -j REJECT
</PRE>
</CODE></BLOCKQUOTE>
</LI>
</UL>
<P>
<H3>Filtraggio dei pacchetti per la macchina Linux stessa</H3>

<P>
<P>
<UL>
<LI> Se si vuole usare il filtraggio dei pacchetti sui pacchetti in
ingresso alla macchina stessa, &egrave; necessario fare il filtraggio sulla
catena input.  Si crei una catena per ogni interfaccia di
destinazione: 
<BLOCKQUOTE><CODE>
<PRE>
ipchains -N bad-if
ipchains -N dmz-if
ipchains -N good-if
</PRE>
</CODE></BLOCKQUOTE>

</LI>
<LI> Creare dei salti a queste:

<BLOCKQUOTE><CODE>
<PRE>
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
</PRE>
</CODE></BLOCKQUOTE>
</LI>
</UL>
<P>
<H3>Interfaccia di Bad (esterno).</H3>

<P>
<P>
<UL>
<LI> Macchina per il filtraggio dei pacchetti:
<UL>
<LI> <B>PING verso ogni rete</B></LI>
<LI> <B>TRACEROUTE verso ogni rete</B></LI>
<LI> Accesso DNS</LI>
</UL>

</LI>
<LI> L'interfaccia esterna riceve risposte anche per i pacchetti
``mascherati'' (il masquerading usa le porte sorgente dalla 61000
alla 65095) oltre a errori ICMP per questi e a risposte al PING.

<BLOCKQUOTE><CODE>
<PRE>
ipchains -A bad-if -i ! ppp0 -j DENY -l
ipchains -A bad-if -p TCP --dport 61000:65095 -j ACCEPT
ipchains -A bad-if -p UDP --dport 61000:65095 -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
</PRE>
</CODE></BLOCKQUOTE>
</LI>
</UL>
<P>
<H3>Interfaccia di DMZ.</H3>

<P>
<P>
<UL>
<LI> Restrizioni della macchina per il filtraggio dei pacchetti:
<UL>
<LI> <B>PING verso ogni rete</B></LI>
<LI> <B>TRACEROUTE verso ogni rete</B></LI>
<LI> Accesso DNS</LI>
</UL>

</LI>
<LI> L'interfaccia DMZ riceve risposte DNS, risposte al ping ed
errori ICMP.

<BLOCKQUOTE><CODE>
<PRE>
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
</PRE>
</CODE></BLOCKQUOTE>
</LI>
</UL>
<P>
<H3>Interfaccia di Good (interno).</H3>

<P>
<P>
<UL>
<LI> Restrizioni della macchina per il filtraggio dei pacchetti:
<UL>
<LI> <B>PING verso ogni rete</B></LI>
<LI> <B>TRACEROUTE verso ogni rete</B></LI>
<LI> Accesso DNS</LI>
</UL>

</LI>
<LI> Restrizioni della rete interna:
<UL>
<LI> Permettere WWW, ftp, traceroute, ssh verso l'esterno</LI>
<LI> <B>Permettere SMTP verso il Mail server</B></LI>
<LI> <B>Permettere POP-3 verso il Mail server</B></LI>
<LI> <B>Permettere DNS verso il Name server</B></LI>
<LI> <B>Permettere rsync verso il Web server</B></LI>
<LI> <B>Permettere WWW verso il Web server</B></LI>
<LI> Permettere il ping alla macchina filtro</LI>
</UL>

</LI>
<LI> L'interfaccia interna riceve ping, risposte al ping e errori ICMP.

<BLOCKQUOTE><CODE>
<PRE>
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
</PRE>
</CODE></BLOCKQUOTE>
</LI>
</UL>
<P>
<H2><A NAME="ss7.5">7.5 Per finire</A>
</H2>

<P>
<UL>
<LI> Cancellare le regole di bloccaggio:
<BLOCKQUOTE><CODE>
<PRE>
ipchains -D input 1
ipchains -D forward 1
ipchains -D output 1
</PRE>
</CODE></BLOCKQUOTE>
</LI>
</UL>
<P>
<HR>
<A HREF="IPCHAINS-HOWTO-8.html">Avanti</A>
<A HREF="IPCHAINS-HOWTO-6.html">Indietro</A>
<A HREF="IPCHAINS-HOWTO.html#toc7">Indice</A>
</BODY>
</HTML>