<!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ù 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ù serio</A></H2> <P>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. <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 è veramente utile per sapere se una macchina è 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ù 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ù 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 è 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 è 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 è una pura cortesia: significa che si può controllare se la macchina firewall è giù. <P> </DL> <P> <H2><A NAME="ss7.3">7.3 Prima del filtraggio dei pacchetti</A> </H2> <P> <UL> <LI> Anti-spoofing. <P>Poiché non c'è nessun instradamento asimmetrico, semplicemente si può 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à ancora il traffico locale su loopback, ma verrà 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ò è 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 è filtrare nella catena forward. <P> <P>Si suddivida la catena forward in diverse catene utente a seconda delle interfacce di provenienza/destinazione; ciò spacca il problema in tronconi gestibili più 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 è 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, è 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ò 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à 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à. Poiché 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à 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, è 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>