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.
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)
Macchina per il filtraggio dei pacchetti:
Questo è veramente utile per sapere se una macchina è attiva.
Ancora, utile per la diagnostica.
Rende ping e DNS più utili.
All'interno di DMZ:
Mail server
Name Server
Server web
Rete interna:
Queste sono cose abbastanza standard da permettere: alcuni iniziano permettendo di fare tutto alla rete interna, ma qui saremo un po' più restrittivi.
Ovviamente vogliamo poter inviare mail verso l'esterno.
Questo è il modo per leggere la propria posta.
Vogliamo essere in grado di cercare i nomi esterni dei siti per il WWW, ftp, traceroute e ssh.
Questo è il modo per sincronizzare il server web esterno con quello interno.
Ovviamente, vogliamo poterci connettere al nostro server web esterno.
Questa è una pura cortesia: significa che si può controllare se la macchina firewall è giù.
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
#
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
#
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.
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
#
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 il 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
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
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
Restrizioni della rete interna:
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.
Si noti che le vecchie versioni di Debian usavano `pop-3' invece di `pop3' in /etc/services, cosa che viola l'RFC1700.
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
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
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
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
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
ipchains -A bad-good -j REJECT
ipchains -N bad-if
ipchains -N dmz-if
ipchains -N good-if
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
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
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
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
ipchains -D input 1
ipchains -D forward 1
ipchains -D output 1