Avanti Indietro Indice

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

Accesso DNS

Rende ping e DNS più utili.

All'interno di DMZ:

Mail server

Name Server

Server web

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 pacchetti

Questa è una pura cortesia: significa che si può controllare se la macchina firewall è giù.

7.3 Prima del filtraggio dei pacchetti

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

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

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

Da Good (interno) a DMZ (server)

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

Da Bad (esterno) a DMZ (server).

Da Good (interno) a Bad (esterno).

Da DMZ a Good (interno).

Da DMZ a Bad (esterno).

Da Bad (esterno) a Good (interno).

Filtraggio dei pacchetti per la macchina Linux stessa

Interfaccia di Bad (esterno).

Interfaccia di DMZ.

Interfaccia di Good (interno).

7.5 Per finire


Avanti Indietro Indice