HexDEF6
15-06-2007, 17:02
La DMZ
La DMZ (De-Militarized Zone, Zona De-Militarizzata) e' un tratto di rete a cui
possono accedere tutti (o quasi), e' dove si trovano i server che possono
essere visti da internet.
Di solito i server in DMZ, hanno ip privati, e per poter essere raggiunti da
internet deve esserci un nodo di collegamento con l'esterno che "gira le
chiamate" sulla DMZ.
Perche' usare una DMZ
La prima soluzione quando si deve mettere in piedi un server (supponiamo un
server web, quindi sulla porta 80) e' quello di metterlo sul computer che ha
l'ip pubblico. Questa soluzione e' semplice, necessita del solo server, ma
presenta alcuni inconvenienti. Infatti se per caso il server viene "bucato"
l'attaccante avra' accesso alla macchina che molto probabilmente, oltre a far
girare il server, ha accesso anche alla rete interna (LAN) e quindi si trova
in una posizione privilegiata per poter prendere il controllo (o
spiare/rubare/fare quello che vuole) di altri computer, facilitato anche dal
fatto che in moltissimi casi i computer interni (per noncuranza o per
necessita') non presentano "molti ostacoli" per poter essere compromessi.
La soluzione e' quella di avere un computer con ip pubblico dove non gira
assolutamente nessun servizio visibile da internet, che redirigera' le
chiamate "permesse" sul server in DMZ (nel nostro caso la porta 80).
Nel caso di un attacco andato a buon fine, l'attaccante avra' a disposizione
la macchina dove gira il server, ma da questa (se il firewall sara' ben
configurato) non potra' accedere ne ad internet, ne alla LAN interna, rendendo
il proprio sforzo "inutile".
L'importanza della DMZ si fa ancora maggiore quando il numero di servizi
aumenta, infatti piu' servizi si hanno attivi, piu' possibilita' ha un
attaccante di trovare qualche appiglio, quindi di solito si tenta di mettere
in DMZ un server distinto (reale o virtualizzato) per ogni servizio, in modo
tale che la compromissione di un servizio, non vada a compromettere tutto.
Ovviamente la divisione dei servizi su diverse macchine non e' sempre
possibile (mancanza di hardware, complicazioni a livello software ecc.) ma
comunque sia anche se obbligati a far girare X servizi su una macchina,
l'obbligo di mettere questa in DMZ rimane (sto parlando nei casi in cui
l'accesso ad internet non serve solo per i server, ma anche per far navigare
dei client in LAN).
cosa serve
Per poter gestire una DMZ, abbiamo bisogno sostanzialmente di un computer con
3 schede di rete (anche un normalissimo pentium 1 e' sufficente, almeno che
non abbiate una linea da 10Mbit o piu', ma allora il problema per prendere una
macchina piu' grande credo non ci sia!).
Un server da mettere in DMZ (puo' benissimo essere un windows o quello che si
vuole... basta sapere su che porte girano i servizi!).
Un computer da mettere in LAN.
Saper usare linux almeno per riuscire ad installare una distribuzione, e saper
configurare le schede di rete.
Perdere un po di tempo con iptables per mettere tutto a posto!.
Delle 3 schede di rete avremo che eth0 ha un ip pubblico (e' collegata ad
internet), eth1 ha un ip privato a cui e' collegata la LAN, eth2 ha un ip
privato con collegata la DMZ.
il firewall
Ovviamente la cosa principale della DMZ e' il firewall:
#!/bin/bash
IPT=/sbin/iptables
NET="eth0"
LAN="eth1"
DMZ="eth2"
LO="lo"
IP_NET="30.30.30.30."
IP_LAN="192.168.10.1"
IP_DMZ="192.168.20.1"
IP_LO="127.0.0.1"
RANGE_IP_LAN="192.168.10.0/24"
RANGE_IP_DMZ="192.168.20.0/24"
SERVER_WEB="192.168.20.20"
#pulisco tutto
$IPT -F
$IPT -F INPUT
$IPT -F OUTPUT
$IPT -F FORWARD
$IPT -F -t mangle
$IPT -F -t nat
$IPT -X
#imposto il comportamento di default
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
#abilito l'ip forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
#creo dei chan nuovi per "ogni" tipo di connessione (vedi sotto)
$IPT -N net_to_lan
$IPT -N lan_to_net
$IPT -N net_to_dmz
$IPT -N dmz_to_net
$IPT -N lan_to_dmz
$IPT -N dmz_to_lan
$IPT -N server_to_net
$IPT -N net_to_server
$IPT -N lan_to_server
$IPT -N server_to_lan
$IPT -N dmz_to_server
$IPT -N server_to_dmz
#accetto in input sull'interfaccia LO tutto quello che viene dagli ip locali
$IPT -A INPUT -p ALL -i $LO -s $IP_LO -j ACCEPT
$IPT -A INPUT -p ALL -i $LO -s $IP_LAN -j ACCEPT
$IPT -A INPUT -p ALL -i $LO -s $IP_NET -j ACCEPT
$IPT -A INPUT -p ALL -i $LO -s $IP_WRL -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO -d $IP_LO -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO -d $IP_LAN -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO -d $IP_NET -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO -d $IP_WRL -j ACCEPT
#rispondo ai ping (non fondamentale, ma a volte e' comodo)
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
#redirigo le chiamate fatte sulla porta 80 al server in DMZ
$IPT -t nat -A PREROUTING -i $NET -d $IP_NET -p tcp --dport 80 -j DNAT --to
$SERVER_WEB
#faccio snat dei computer in LAN (e quindi gli permetto di uscire su internet)
$IPT -t nat -A POSTROUTING -o $NET -s $RANGE_IP_LAN -j SNAT --to-source
$IP_NET
#divido le connessioni (FORWARD) in base alla provenienza/destinazione
$IPT -A FORWARD -i $NET -o $LAN -j net_to_lan
$IPT -A FORWARD -i $LAN -o $NET -j lan_to_net
$IPT -A FORWARD -i $NET -o $DMZ -j net_to_dmz
$IPT -A FORWARD -i $DMZ -o $NET -j dmz_to_net
$IPT -A FORWARD -i $LAN -o $DMZ -j lan_to_dmz
$IPT -A FORWARD -i $DMZ -o $LAN -j dmz_to_lan
#divido anche le connessioni in input....
$IPT -A INPUT -i $NET -j net_to_server
$IPT -A INPUT -i $LAN -j lan_to_server
$IPT -A INPUT -i $DMZ -j dmz_to_server
#... e output
$IPT -A OUTPUT -o $NET -j server_to_net
$IPT -A OUTPUT -o $DMZ -j server_to_dmz
$IPT -A OUTPUT -o $LAN -j server_to_lan
#da internet verso la LAN accetto solo le connessioni related,estabilished
$IPT -A net_to_lan -m state --state RELATED,ESTABLISHED -j ACCEPT
#dalla LAN permetto di uscire su tutte le porte
$IPT -A lan_to_net -j ACCEPT
#dalla DMZ verso internet accetto solo le connesioni related o estabilished
$IPT -A dmz_to_net -m state --state RELATED,ESTABLISHED -j ACCEPT
#accetto le connessioni verso il server web in DMZ
$IPT -A net_to_dmz -d $SERVER_WEB -p tcp --dport 80 -j ACCEPT
#dalla LAN posso accedere a tutte le porte del server in DMZ (tipo per poterci
accedere via ssh per poterlo gestire)
$IPT -A lan_to_dmz -j ACCEPT
#dalla dmz verso la lan accetto solamente le connessioni related ed
estabilished...
$IPT -A dmz_to_lan -m state --state RELATED,ESTABLISHED -j ACCEPT
#accetto tutte le connessioni fatte dalla LAN verso il server (considero la
mia rete interna SICURA)
$IPT -A lan_to_server -j ACCEPT
#accetto solo le connessioni related o estabilished che il server fa alla LAN
$IPT -A server_to_lan -j ACCEPT
con questa configurazione abbiamo che:
le richieste fatte sulla porta 80 vengano rigirate al server in DMZ
il server in DMZ non puo' aprire connessioni verso internet ne verso la LAN,
ma solo rispondere a delle connessioni iniziate dalla LAN o INTERNET
i client nella LAN navigano tutti verso internet, e possono accedere sia al
server in DMZ si al server che fa da firewall
analizziamo alcune parti:
#imposto il comportamento di default
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
con questa configurazione di default abbiamo che qualunque cosa non sia
ESPLICITAMENTE permessa viene negata, quindi bisogna aggiungere regole per
poter fare cose in piu'.
Questo e' la base su cui costruire, infatti se ci dimentichiamo qualcosa,
offriremo qualcosa in meno, ma non saremo piu' vulnerabili (come nel caso si
partisse da accettare tutto di default e poi negare le connessioni
pericolose).
#redirigo le chiamate fatte sulla porta 80 al server in DMZ
$IPT -t nat -A PREROUTING -i $NET -d $IP_NET -p tcp --dport 80 -j DNAT --to
$SERVER_WEB
questa e' la parte fondamentale, dove tutte le connessioni fatte sulla porta
80 vengono redirette all'ip del server in DMZ.
Ricordo che con iptables, i pacchetti per prima cosa girano nella catena di
prerouting, e poi nelle altre catene (che siano input o forward), e il
postrouting avviene dopo le altre catene (output o forward).
In questo caso se non ci fosse la regola sopra, il pacchetto entrerebbe nella
catena di input (visto che e' diretto all'ip della scheda eth0), ma invece
grazie a questa regola il pacchetto passa nella catena di forward (infatti non
e' piu' diretto ad un ip "locale" cioe' presente sulla macchina stessa).
#faccio snat dei computer in LAN (e quindi gli permetto di uscire su internet)
$IPT -t nat -A POSTROUTING -o $NET -s $RANGE_IP_LAN -j SNAT --to-source
$IP_NET
questa regola serve per far navigare su internet tutte le connessioni che
provengono dalla LAN, praticamente all'uscita della catena di forward, viene
manipolato il pacchetto cambianto l'ip sorgente (che passa da un ip della LAN
che lo ha generato all'ip pubblico del firewall), iptables tenendo traccia
delle connessioni, quando arrivano i pacchetti di risposta, li redirige
automaticamente all'ip della LAN che li aveva generati.
#divido le connessioni (FORWARD) in base alla provenienza/destinazione
$IPT -A FORWARD -i $NET -o $LAN -j net_to_lan
$IPT -A FORWARD -i $LAN -o $NET -j lan_to_net
$IPT -A FORWARD -i $NET -o $DMZ -j net_to_dmz
$IPT -A FORWARD -i $DMZ -o $NET -j dmz_to_net
$IPT -A FORWARD -i $LAN -o $DMZ -j lan_to_dmz
$IPT -A FORWARD -i $DMZ -o $LAN -j dmz_to_lan
#divido anche le connessioni in input....
$IPT -A INPUT -i $NET -j net_to_server
$IPT -A INPUT -i $LAN -j lan_to_server
$IPT -A INPUT -i $DMZ -j dmz_to_server
#... e output
$IPT -A OUTPUT -o $NET -j server_to_net
$IPT -A OUTPUT -o $DMZ -j server_to_dmz
$IPT -A OUTPUT -o $LAN -j server_to_lan
la divisione delle connessioni in base all'interfaccia di entrata/uscita, in
questo caso puo' sembrare un po inutile, visto le regole che applichiamo dopo,
ma diventa comodissima nel caso si voglia aggiungere qualcosa piu' avanti.
Tutto lo script rimane molto piu' pulito e comprensibile, inoltre siccome
conta in che ordine vengono chiamate le regole, se aggiungiamo un nuovo tipo
di connessione, possiamo aggiungere le regole che la riguardano in fondo al
nostro script, senza preoccuparci in che posizione le mettiamo (ovviamente la
regola di "ingresso" alla connessione deve essere nel punto giusto!)
veniamo alla parte principale del firewall:
#da internet verso la LAN accetto solo le connessioni related,estabilished
$IPT -A net_to_lan -m state --state RELATED,ESTABLISHED -j ACCEPT
#dalla LAN permetto di uscire su tutte le porte
$IPT -A lan_to_net -j ACCEPT
con queste due regole accetto tutte le connessioni fatte dalla LAN verso
internet e accetto le risposte.
#dalla DMZ verso internet accetto solo le connesioni related o estabilished
$IPT -A dmz_to_net -m state --state RELATED,ESTABLISHED -j ACCEPT
#accetto le connessioni verso il server web in DMZ
$IPT -A net_to_dmz -d $SERVER_WEB -p tcp --dport 80 -j ACCEPT
con queste permetto di ricevere le connessioni sulla porta 80 al server in DMZ
e rispondere, ma non permetto di iniziare connessioni
#dalla LAN posso accedere a tutte le porte del server in DMZ (tipo per poterci
accedere via ssh per poterlo gestire)
$IPT -A lan_to_dmz -j ACCEPT
#dalla dmz verso la lan accetto solamente le connessioni related ed
estabilished...
$IPT -A dmz_to_lan -m state --state RELATED,ESTABLISHED -j ACCEPT
qui permetto agli ip in LAN di accedere ai server in DMZ, e ovviamente devo
accettare le risposte. Anche in questo caso non permetto al server in DMZ di
fare connessioni dirette verso la LAN.
#accetto tutte le connessioni fatte dalla LAN verso il firewall (considero la
mia rete interna SICURA)
$IPT -A lan_to_server -j ACCEPT
#accetto solo le connessioni related o estabilished che il firewall fa alla
LAN
$IPT -A server_to_lan -j ACCEPT
qui accetto le connessioni dalla LAN verso il firewall e le risposte, anche in
questo caso, non permetto al firewall di iniziare connessioni verso la LAN.
complicazioni
sembrerebbe che il nostro firewall sia a posto, ma in verita' non e' proprio
cosi, infatti abbiamo che:
non riusciamo a capire se il nostro server in DMZ e' stato compromesso
sia il firewall sia il server web non possono fare connessioni verso
internet, compresi gli IMPORTANTISSIMI aggiornamenti
i 2 server non riescono nemmeno a risolvere i nomi
quindi le cose da fare sono:
ad aggiungere un paio di log, nel caso che:
il server web tenti di fare connessioni verso internet o verso la LAN o
verso il server
il firewall tenti di fare connessioni verso la LAN o la DMZ o INTERNET
permettere sia al firewall sia al server web di raggiungere degli ip su
internet per fare gli update
permettere di risolvere i nomi a entrambi
quindi il nuovo script per il firewall diventa:
#!/bin/bash
IPT=/sbin/iptables
NET="eth0"
LAN="eth1"
DMZ="eth2"
LO="lo"
IP_NET="30.30.30.30."
IP_LAN="192.168.10.1"
IP_DMZ="192.168.20.1"
IP_LO="127.0.0.1"
IP_WEB_UPDATE="40.40.40.40"
IP_FTP_UPDATE="50.50.50.50"
IP_DNS1="45.45.45.45"
IP_DNS2="55.55.55.55"
RANGE_IP_LAN="192.168.10.0/24"
RANGE_IP_DMZ="192.168.20.0/24"
SERVER_WEB="192.168.20.20"
#pulisco tutto
$IPT -F
$IPT -F INPUT
$IPT -F OUTPUT
$IPT -F FORWARD
$IPT -F -t mangle
$IPT -F -t nat
$IPT -X
#imposto il comportamento di default
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
#abilito l'ip forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
#creo dei chan nuovi per "ogni" tipo di connessione (vedi sotto)
$IPT -N net_to_lan
$IPT -N lan_to_net
$IPT -N net_to_dmz
$IPT -N dmz_to_net
$IPT -N lan_to_dmz
$IPT -N dmz_to_lan
$IPT -N server_to_net
$IPT -N net_to_server
$IPT -N lan_to_server
$IPT -N server_to_lan
$IPT -N dmz_to_server
$IPT -N server_to_dmz
#accetto in input sull'interfaccia LO tutto quello che viene dagli ip locali
$IPT -A INPUT -p ALL -i $LO -s $IP_LO -j ACCEPT
$IPT -A INPUT -p ALL -i $LO -s $IP_LAN -j ACCEPT
$IPT -A INPUT -p ALL -i $LO -s $IP_NET -j ACCEPT
$IPT -A INPUT -p ALL -i $LO -s $IP_WRL -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO -d $IP_LO -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO -d $IP_LAN -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO -d $IP_NET -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO -d $IP_WRL -j ACCEPT
#rispondo ai ping (non fondamentale, ma a volte e' comodo)
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
#redirigo le chiamate fatte sulla porta 80 al server in DMZ
$IPT -t nat -A PREROUTING -i $NET -d $IP_NET -p tcp --dport 80 -j DNAT --to
$SERVER_WEB
#faccio snat dei computer in LAN (e quindi gli permetto di uscire su internet)
$IPT -t nat -A POSTROUTING -o $NET -s $RANGE_IP_LAN -j SNAT --to-source
$IP_NET
#divido le connessioni (FORWARD) in base alla provenienza/destinazione
$IPT -A FORWARD -i $NET -o $LAN -j net_to_lan
$IPT -A FORWARD -i $LAN -o $NET -j lan_to_net
$IPT -A FORWARD -i $NET -o $DMZ -j net_to_dmz
$IPT -A FORWARD -i $DMZ -o $NET -j dmz_to_net
$IPT -A FORWARD -i $LAN -o $DMZ -j lan_to_dmz
$IPT -A FORWARD -i $DMZ -o $LAN -j dmz_to_lan
#divido anche le connessioni in input....
$IPT -A INPUT -i $NET -j net_to_server
$IPT -A INPUT -i $LAN -j lan_to_server
$IPT -A INPUT -i $DMZ -j dmz_to_server
#... e output
$IPT -A OUTPUT -o $NET -j server_to_net
$IPT -A OUTPUT -o $DMZ -j server_to_dmz
$IPT -A OUTPUT -o $LAN -j server_to_lan
#da internet verso la LAN accetto solo le connessioni related,estabilished
$IPT -A net_to_lan -m state --state RELATED,ESTABLISHED -j ACCEPT
#dalla LAN permetto di uscire su tutte le porte
$IPT -A lan_to_net -j ACCEPT
#dalla DMZ verso internet accetto solo le connesioni related o estabilished
$IPT -A dmz_to_net -m state --state RELATED,ESTABLISHED -j ACCEPT
#permetto gli update
$IPT -A dmz_to_net -d $IP_WEB_UPDATE -p tcp --dport 80 -j ACCEPT
$IPT -A dmz_to_net -d $IP_FTP_UPDATE -p tcp --dport 21 -j ACCEPT
#permetto di risolvere nomi
$IPT -A dmz_to_net -d $IP_DNS1 -p udp --dport 53 -j ACCEPT
$IPT -A dmz_to_net -d $IP_DNS2 -p udp --dport 53 -j ACCPET
#se il tipo di connessione non e' fra quelli permessi, lo loggo
$IPT -A dmz_to_net -j LOG --log-prefix dmz_to_net:
#accetto le connessioni verso il server web in DMZ
$IPT -A net_to_dmz -d $SERVER_WEB -p tcp --dport 80 -j ACCEPT
#devo anche accettare le connessioni stabilite dal server web per
aggiornamenti e dns
$IPT -A net_to_dmz -m state --state RELATED,ESTABLISHED -j ACCEPT
#dalla LAN posso accedere a tutte le porte del server in DMZ (tipo per poterci
accedere via ssh per poterlo gestire)
$IPT -A lan_to_dmz -j ACCEPT
#dalla dmz verso la lan accetto solamente le connessioni related ed
estabilished...
$IPT -A dmz_to_lan -m state --state RELATED,ESTABLISHED -j ACCEPT
#loggo tutte le altre connessioni dal server web verso la lan
$IPT -A dmz_to_lan -j LOG --log-prefix dmz_to_lan:
#accetto tutte le connessioni fatte dalla LAN verso il server (considero la
mia rete interna SICURA)
$IPT -A lan_to_server -j ACCEPT
#accetto solo le connessioni related o estabilished che il server fa alla LAN
$IPT -A server_to_lan -j ACCEPT
#permetto gli update del firewall
$IPT -A server_to_net -d $IP_WEB_UPDATE -p tcp --dport 80 -j ACCEPT
$IPT -A server_to_net -d $IP_FTP_UPDATE -p tcp --dport 21 -j ACCEPT
#permetto di risolvere nomi
$IPT -A server_to_net -d $IP_DNS1 -p udp --dport 53 -j ACCEPT
$IPT -A server_to_net -d $IP_DNS2 -p udp --dport 53 -j ACCPET
#se il tipo di connessione non e' fra quelli permessi, lo loggo
$IPT -A server_to_net -j LOG --log-prefix dmz_to_net:
#permetto al firewall che riceva le risposte
$IPT -A net_to_server -m state --state RELATED,ESTABLISHED -j ACCEPT
#loggo i tentativi del server in dmz di accedere al firewall
$IPT -A dmz_to_server -j LOG --log-prefix dmz_to_server:
In questo modo dovremmo essere piu' o meno a posto, comunque con
configurazioni diverse le cose potrebbero complicarsi, ma come base potrebbe
funzionare.
cambiamenti possibili/idee varie
se sia il server web sia il firewall usano la stessa distribuzione, e quindi
gli stessi server per fare update (oltre che gli stessi dns), si potrebbero
cambiare alcuni parti del firewall, in modo da rendere piu' comoda l'aggiunta
di altri eventuali ip per update o altri servizi che i server possono
raggiungere in internet.
#dalla DMZ verso internet accetto solo le connesioni related o estabilished
$IPT -A dmz_to_net -m state --state RELATED,ESTABLISHED -j ACCEPT
#permetto gli update
$IPT -A dmz_to_net -d $IP_WEB_UPDATE -p tcp --dport 80 -j ACCEPT
$IPT -A dmz_to_net -d $IP_FTP_UPDATE -p tcp --dport 21 -j ACCEPT
#permetto di risolvere nomi
$IPT -A dmz_to_net -d $IP_DNS1 -p udp --dport 53 -j ACCEPT
$IPT -A dmz_to_net -d $IP_DNS2 -p udp --dport 53 -j ACCPET
#se il tipo di connessione non e' fra quelli permessi, lo loggo
$IPT -A dmz_to_net -j LOG --log-prefix dmz_to_net:
#permetto gli update del firewall
$IPT -A server_to_net -d $IP_WEB_UPDATE -p tcp --dport 80 -j ACCEPT
$IPT -A server_to_net -d $IP_FTP_UPDATE -p tcp --dport 21 -j ACCEPT
#permetto di risolvere nomi
$IPT -A server_to_net -d $IP_DNS1 -p udp --dport 53 -j ACCEPT
$IPT -A server_to_net -d $IP_DNS2 -p udp --dport 53 -j ACCPET
#se il tipo di connessione non e' fra quelli permessi, lo loggo
$IPT -A server_to_net -j LOG --log-prefix dmz_to_net:
queste due parti potrebbero diventare cosi:
$IPT -N permitted
$IPT -A permitted -d $IP_WEB_UPDATE -p tcp --dport 80 -j ACCEPT
$IPT -A permitted -d $IP_FTP_UPDATE -p tcp --dport 21 -j ACCEPT
#permetto di risolvere nomi
$IPT -A permitted -d $IP_DNS1 -p udp --dport 53 -j ACCEPT
$IPT -A permitted -d $IP_DNS2 -p udp --dport 53 -j ACCPET
#se il tipo di connessione non e' fra quelli permessi, lo loggo
$IPT -A permitted -j LOG --log-prefix dmz_to_net:
#dalla DMZ verso internet accetto solo le connesioni related o estabilished
$IPT -A dmz_to_net -m state --state RELATED,ESTABLISHED -j ACCEPT
#permetto un po di cose ai server in dmz
$IPT -A dmz_to_net -j permitted
#permetto un po di cose al firewall
$IPT -A server_to_net -j permitted
inoltre se abbiamo molti server in dmz si potrebbero dividere le connessioni
per ogni server del tipo al posto di:
$IPT -A FORWARD -i $NET -o $DMZ -j net_to_dmz
$IPT -A FORWARD -i $DMZ -o $NET -j dmz_to_net
$IPT -A FORWARD -i $NET -o $DMZ -d $IP_WEB -j net_to_dmz_web
$IPT -A FORWARD -i $NET -o $DMZ -d $IP_SMTP -j net_to_dmz_smtp
$IPT -A FORWARD -i $DMZ -o $NET -s $IP_WEB -j dmz_to_net_web
$IPT -A FORWARD -i $DMZ -o $NET -s $IP_SMTP -j dmz_to_net_smtp
questo per avere un controllo piu' granulare su cosa puo' fare ogni server in
DMZ e non trattandoli tutti genericamente.
ATTENZIONE!
Vi ricordo che prima di implementare un firewall "importante" e' meglio darsi un'occhiata a http://www.netfilter.org/ non prendete tutto per giusto quello che ho scritto! Ovviamente se notate errori fatemelo sapere, stessa cosa vale se avete suggerimenti
Ciao!
La DMZ (De-Militarized Zone, Zona De-Militarizzata) e' un tratto di rete a cui
possono accedere tutti (o quasi), e' dove si trovano i server che possono
essere visti da internet.
Di solito i server in DMZ, hanno ip privati, e per poter essere raggiunti da
internet deve esserci un nodo di collegamento con l'esterno che "gira le
chiamate" sulla DMZ.
Perche' usare una DMZ
La prima soluzione quando si deve mettere in piedi un server (supponiamo un
server web, quindi sulla porta 80) e' quello di metterlo sul computer che ha
l'ip pubblico. Questa soluzione e' semplice, necessita del solo server, ma
presenta alcuni inconvenienti. Infatti se per caso il server viene "bucato"
l'attaccante avra' accesso alla macchina che molto probabilmente, oltre a far
girare il server, ha accesso anche alla rete interna (LAN) e quindi si trova
in una posizione privilegiata per poter prendere il controllo (o
spiare/rubare/fare quello che vuole) di altri computer, facilitato anche dal
fatto che in moltissimi casi i computer interni (per noncuranza o per
necessita') non presentano "molti ostacoli" per poter essere compromessi.
La soluzione e' quella di avere un computer con ip pubblico dove non gira
assolutamente nessun servizio visibile da internet, che redirigera' le
chiamate "permesse" sul server in DMZ (nel nostro caso la porta 80).
Nel caso di un attacco andato a buon fine, l'attaccante avra' a disposizione
la macchina dove gira il server, ma da questa (se il firewall sara' ben
configurato) non potra' accedere ne ad internet, ne alla LAN interna, rendendo
il proprio sforzo "inutile".
L'importanza della DMZ si fa ancora maggiore quando il numero di servizi
aumenta, infatti piu' servizi si hanno attivi, piu' possibilita' ha un
attaccante di trovare qualche appiglio, quindi di solito si tenta di mettere
in DMZ un server distinto (reale o virtualizzato) per ogni servizio, in modo
tale che la compromissione di un servizio, non vada a compromettere tutto.
Ovviamente la divisione dei servizi su diverse macchine non e' sempre
possibile (mancanza di hardware, complicazioni a livello software ecc.) ma
comunque sia anche se obbligati a far girare X servizi su una macchina,
l'obbligo di mettere questa in DMZ rimane (sto parlando nei casi in cui
l'accesso ad internet non serve solo per i server, ma anche per far navigare
dei client in LAN).
cosa serve
Per poter gestire una DMZ, abbiamo bisogno sostanzialmente di un computer con
3 schede di rete (anche un normalissimo pentium 1 e' sufficente, almeno che
non abbiate una linea da 10Mbit o piu', ma allora il problema per prendere una
macchina piu' grande credo non ci sia!).
Un server da mettere in DMZ (puo' benissimo essere un windows o quello che si
vuole... basta sapere su che porte girano i servizi!).
Un computer da mettere in LAN.
Saper usare linux almeno per riuscire ad installare una distribuzione, e saper
configurare le schede di rete.
Perdere un po di tempo con iptables per mettere tutto a posto!.
Delle 3 schede di rete avremo che eth0 ha un ip pubblico (e' collegata ad
internet), eth1 ha un ip privato a cui e' collegata la LAN, eth2 ha un ip
privato con collegata la DMZ.
il firewall
Ovviamente la cosa principale della DMZ e' il firewall:
#!/bin/bash
IPT=/sbin/iptables
NET="eth0"
LAN="eth1"
DMZ="eth2"
LO="lo"
IP_NET="30.30.30.30."
IP_LAN="192.168.10.1"
IP_DMZ="192.168.20.1"
IP_LO="127.0.0.1"
RANGE_IP_LAN="192.168.10.0/24"
RANGE_IP_DMZ="192.168.20.0/24"
SERVER_WEB="192.168.20.20"
#pulisco tutto
$IPT -F
$IPT -F INPUT
$IPT -F OUTPUT
$IPT -F FORWARD
$IPT -F -t mangle
$IPT -F -t nat
$IPT -X
#imposto il comportamento di default
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
#abilito l'ip forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
#creo dei chan nuovi per "ogni" tipo di connessione (vedi sotto)
$IPT -N net_to_lan
$IPT -N lan_to_net
$IPT -N net_to_dmz
$IPT -N dmz_to_net
$IPT -N lan_to_dmz
$IPT -N dmz_to_lan
$IPT -N server_to_net
$IPT -N net_to_server
$IPT -N lan_to_server
$IPT -N server_to_lan
$IPT -N dmz_to_server
$IPT -N server_to_dmz
#accetto in input sull'interfaccia LO tutto quello che viene dagli ip locali
$IPT -A INPUT -p ALL -i $LO -s $IP_LO -j ACCEPT
$IPT -A INPUT -p ALL -i $LO -s $IP_LAN -j ACCEPT
$IPT -A INPUT -p ALL -i $LO -s $IP_NET -j ACCEPT
$IPT -A INPUT -p ALL -i $LO -s $IP_WRL -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO -d $IP_LO -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO -d $IP_LAN -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO -d $IP_NET -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO -d $IP_WRL -j ACCEPT
#rispondo ai ping (non fondamentale, ma a volte e' comodo)
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
#redirigo le chiamate fatte sulla porta 80 al server in DMZ
$IPT -t nat -A PREROUTING -i $NET -d $IP_NET -p tcp --dport 80 -j DNAT --to
$SERVER_WEB
#faccio snat dei computer in LAN (e quindi gli permetto di uscire su internet)
$IPT -t nat -A POSTROUTING -o $NET -s $RANGE_IP_LAN -j SNAT --to-source
$IP_NET
#divido le connessioni (FORWARD) in base alla provenienza/destinazione
$IPT -A FORWARD -i $NET -o $LAN -j net_to_lan
$IPT -A FORWARD -i $LAN -o $NET -j lan_to_net
$IPT -A FORWARD -i $NET -o $DMZ -j net_to_dmz
$IPT -A FORWARD -i $DMZ -o $NET -j dmz_to_net
$IPT -A FORWARD -i $LAN -o $DMZ -j lan_to_dmz
$IPT -A FORWARD -i $DMZ -o $LAN -j dmz_to_lan
#divido anche le connessioni in input....
$IPT -A INPUT -i $NET -j net_to_server
$IPT -A INPUT -i $LAN -j lan_to_server
$IPT -A INPUT -i $DMZ -j dmz_to_server
#... e output
$IPT -A OUTPUT -o $NET -j server_to_net
$IPT -A OUTPUT -o $DMZ -j server_to_dmz
$IPT -A OUTPUT -o $LAN -j server_to_lan
#da internet verso la LAN accetto solo le connessioni related,estabilished
$IPT -A net_to_lan -m state --state RELATED,ESTABLISHED -j ACCEPT
#dalla LAN permetto di uscire su tutte le porte
$IPT -A lan_to_net -j ACCEPT
#dalla DMZ verso internet accetto solo le connesioni related o estabilished
$IPT -A dmz_to_net -m state --state RELATED,ESTABLISHED -j ACCEPT
#accetto le connessioni verso il server web in DMZ
$IPT -A net_to_dmz -d $SERVER_WEB -p tcp --dport 80 -j ACCEPT
#dalla LAN posso accedere a tutte le porte del server in DMZ (tipo per poterci
accedere via ssh per poterlo gestire)
$IPT -A lan_to_dmz -j ACCEPT
#dalla dmz verso la lan accetto solamente le connessioni related ed
estabilished...
$IPT -A dmz_to_lan -m state --state RELATED,ESTABLISHED -j ACCEPT
#accetto tutte le connessioni fatte dalla LAN verso il server (considero la
mia rete interna SICURA)
$IPT -A lan_to_server -j ACCEPT
#accetto solo le connessioni related o estabilished che il server fa alla LAN
$IPT -A server_to_lan -j ACCEPT
con questa configurazione abbiamo che:
le richieste fatte sulla porta 80 vengano rigirate al server in DMZ
il server in DMZ non puo' aprire connessioni verso internet ne verso la LAN,
ma solo rispondere a delle connessioni iniziate dalla LAN o INTERNET
i client nella LAN navigano tutti verso internet, e possono accedere sia al
server in DMZ si al server che fa da firewall
analizziamo alcune parti:
#imposto il comportamento di default
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
con questa configurazione di default abbiamo che qualunque cosa non sia
ESPLICITAMENTE permessa viene negata, quindi bisogna aggiungere regole per
poter fare cose in piu'.
Questo e' la base su cui costruire, infatti se ci dimentichiamo qualcosa,
offriremo qualcosa in meno, ma non saremo piu' vulnerabili (come nel caso si
partisse da accettare tutto di default e poi negare le connessioni
pericolose).
#redirigo le chiamate fatte sulla porta 80 al server in DMZ
$IPT -t nat -A PREROUTING -i $NET -d $IP_NET -p tcp --dport 80 -j DNAT --to
$SERVER_WEB
questa e' la parte fondamentale, dove tutte le connessioni fatte sulla porta
80 vengono redirette all'ip del server in DMZ.
Ricordo che con iptables, i pacchetti per prima cosa girano nella catena di
prerouting, e poi nelle altre catene (che siano input o forward), e il
postrouting avviene dopo le altre catene (output o forward).
In questo caso se non ci fosse la regola sopra, il pacchetto entrerebbe nella
catena di input (visto che e' diretto all'ip della scheda eth0), ma invece
grazie a questa regola il pacchetto passa nella catena di forward (infatti non
e' piu' diretto ad un ip "locale" cioe' presente sulla macchina stessa).
#faccio snat dei computer in LAN (e quindi gli permetto di uscire su internet)
$IPT -t nat -A POSTROUTING -o $NET -s $RANGE_IP_LAN -j SNAT --to-source
$IP_NET
questa regola serve per far navigare su internet tutte le connessioni che
provengono dalla LAN, praticamente all'uscita della catena di forward, viene
manipolato il pacchetto cambianto l'ip sorgente (che passa da un ip della LAN
che lo ha generato all'ip pubblico del firewall), iptables tenendo traccia
delle connessioni, quando arrivano i pacchetti di risposta, li redirige
automaticamente all'ip della LAN che li aveva generati.
#divido le connessioni (FORWARD) in base alla provenienza/destinazione
$IPT -A FORWARD -i $NET -o $LAN -j net_to_lan
$IPT -A FORWARD -i $LAN -o $NET -j lan_to_net
$IPT -A FORWARD -i $NET -o $DMZ -j net_to_dmz
$IPT -A FORWARD -i $DMZ -o $NET -j dmz_to_net
$IPT -A FORWARD -i $LAN -o $DMZ -j lan_to_dmz
$IPT -A FORWARD -i $DMZ -o $LAN -j dmz_to_lan
#divido anche le connessioni in input....
$IPT -A INPUT -i $NET -j net_to_server
$IPT -A INPUT -i $LAN -j lan_to_server
$IPT -A INPUT -i $DMZ -j dmz_to_server
#... e output
$IPT -A OUTPUT -o $NET -j server_to_net
$IPT -A OUTPUT -o $DMZ -j server_to_dmz
$IPT -A OUTPUT -o $LAN -j server_to_lan
la divisione delle connessioni in base all'interfaccia di entrata/uscita, in
questo caso puo' sembrare un po inutile, visto le regole che applichiamo dopo,
ma diventa comodissima nel caso si voglia aggiungere qualcosa piu' avanti.
Tutto lo script rimane molto piu' pulito e comprensibile, inoltre siccome
conta in che ordine vengono chiamate le regole, se aggiungiamo un nuovo tipo
di connessione, possiamo aggiungere le regole che la riguardano in fondo al
nostro script, senza preoccuparci in che posizione le mettiamo (ovviamente la
regola di "ingresso" alla connessione deve essere nel punto giusto!)
veniamo alla parte principale del firewall:
#da internet verso la LAN accetto solo le connessioni related,estabilished
$IPT -A net_to_lan -m state --state RELATED,ESTABLISHED -j ACCEPT
#dalla LAN permetto di uscire su tutte le porte
$IPT -A lan_to_net -j ACCEPT
con queste due regole accetto tutte le connessioni fatte dalla LAN verso
internet e accetto le risposte.
#dalla DMZ verso internet accetto solo le connesioni related o estabilished
$IPT -A dmz_to_net -m state --state RELATED,ESTABLISHED -j ACCEPT
#accetto le connessioni verso il server web in DMZ
$IPT -A net_to_dmz -d $SERVER_WEB -p tcp --dport 80 -j ACCEPT
con queste permetto di ricevere le connessioni sulla porta 80 al server in DMZ
e rispondere, ma non permetto di iniziare connessioni
#dalla LAN posso accedere a tutte le porte del server in DMZ (tipo per poterci
accedere via ssh per poterlo gestire)
$IPT -A lan_to_dmz -j ACCEPT
#dalla dmz verso la lan accetto solamente le connessioni related ed
estabilished...
$IPT -A dmz_to_lan -m state --state RELATED,ESTABLISHED -j ACCEPT
qui permetto agli ip in LAN di accedere ai server in DMZ, e ovviamente devo
accettare le risposte. Anche in questo caso non permetto al server in DMZ di
fare connessioni dirette verso la LAN.
#accetto tutte le connessioni fatte dalla LAN verso il firewall (considero la
mia rete interna SICURA)
$IPT -A lan_to_server -j ACCEPT
#accetto solo le connessioni related o estabilished che il firewall fa alla
LAN
$IPT -A server_to_lan -j ACCEPT
qui accetto le connessioni dalla LAN verso il firewall e le risposte, anche in
questo caso, non permetto al firewall di iniziare connessioni verso la LAN.
complicazioni
sembrerebbe che il nostro firewall sia a posto, ma in verita' non e' proprio
cosi, infatti abbiamo che:
non riusciamo a capire se il nostro server in DMZ e' stato compromesso
sia il firewall sia il server web non possono fare connessioni verso
internet, compresi gli IMPORTANTISSIMI aggiornamenti
i 2 server non riescono nemmeno a risolvere i nomi
quindi le cose da fare sono:
ad aggiungere un paio di log, nel caso che:
il server web tenti di fare connessioni verso internet o verso la LAN o
verso il server
il firewall tenti di fare connessioni verso la LAN o la DMZ o INTERNET
permettere sia al firewall sia al server web di raggiungere degli ip su
internet per fare gli update
permettere di risolvere i nomi a entrambi
quindi il nuovo script per il firewall diventa:
#!/bin/bash
IPT=/sbin/iptables
NET="eth0"
LAN="eth1"
DMZ="eth2"
LO="lo"
IP_NET="30.30.30.30."
IP_LAN="192.168.10.1"
IP_DMZ="192.168.20.1"
IP_LO="127.0.0.1"
IP_WEB_UPDATE="40.40.40.40"
IP_FTP_UPDATE="50.50.50.50"
IP_DNS1="45.45.45.45"
IP_DNS2="55.55.55.55"
RANGE_IP_LAN="192.168.10.0/24"
RANGE_IP_DMZ="192.168.20.0/24"
SERVER_WEB="192.168.20.20"
#pulisco tutto
$IPT -F
$IPT -F INPUT
$IPT -F OUTPUT
$IPT -F FORWARD
$IPT -F -t mangle
$IPT -F -t nat
$IPT -X
#imposto il comportamento di default
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
#abilito l'ip forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
#creo dei chan nuovi per "ogni" tipo di connessione (vedi sotto)
$IPT -N net_to_lan
$IPT -N lan_to_net
$IPT -N net_to_dmz
$IPT -N dmz_to_net
$IPT -N lan_to_dmz
$IPT -N dmz_to_lan
$IPT -N server_to_net
$IPT -N net_to_server
$IPT -N lan_to_server
$IPT -N server_to_lan
$IPT -N dmz_to_server
$IPT -N server_to_dmz
#accetto in input sull'interfaccia LO tutto quello che viene dagli ip locali
$IPT -A INPUT -p ALL -i $LO -s $IP_LO -j ACCEPT
$IPT -A INPUT -p ALL -i $LO -s $IP_LAN -j ACCEPT
$IPT -A INPUT -p ALL -i $LO -s $IP_NET -j ACCEPT
$IPT -A INPUT -p ALL -i $LO -s $IP_WRL -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO -d $IP_LO -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO -d $IP_LAN -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO -d $IP_NET -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO -d $IP_WRL -j ACCEPT
#rispondo ai ping (non fondamentale, ma a volte e' comodo)
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
#redirigo le chiamate fatte sulla porta 80 al server in DMZ
$IPT -t nat -A PREROUTING -i $NET -d $IP_NET -p tcp --dport 80 -j DNAT --to
$SERVER_WEB
#faccio snat dei computer in LAN (e quindi gli permetto di uscire su internet)
$IPT -t nat -A POSTROUTING -o $NET -s $RANGE_IP_LAN -j SNAT --to-source
$IP_NET
#divido le connessioni (FORWARD) in base alla provenienza/destinazione
$IPT -A FORWARD -i $NET -o $LAN -j net_to_lan
$IPT -A FORWARD -i $LAN -o $NET -j lan_to_net
$IPT -A FORWARD -i $NET -o $DMZ -j net_to_dmz
$IPT -A FORWARD -i $DMZ -o $NET -j dmz_to_net
$IPT -A FORWARD -i $LAN -o $DMZ -j lan_to_dmz
$IPT -A FORWARD -i $DMZ -o $LAN -j dmz_to_lan
#divido anche le connessioni in input....
$IPT -A INPUT -i $NET -j net_to_server
$IPT -A INPUT -i $LAN -j lan_to_server
$IPT -A INPUT -i $DMZ -j dmz_to_server
#... e output
$IPT -A OUTPUT -o $NET -j server_to_net
$IPT -A OUTPUT -o $DMZ -j server_to_dmz
$IPT -A OUTPUT -o $LAN -j server_to_lan
#da internet verso la LAN accetto solo le connessioni related,estabilished
$IPT -A net_to_lan -m state --state RELATED,ESTABLISHED -j ACCEPT
#dalla LAN permetto di uscire su tutte le porte
$IPT -A lan_to_net -j ACCEPT
#dalla DMZ verso internet accetto solo le connesioni related o estabilished
$IPT -A dmz_to_net -m state --state RELATED,ESTABLISHED -j ACCEPT
#permetto gli update
$IPT -A dmz_to_net -d $IP_WEB_UPDATE -p tcp --dport 80 -j ACCEPT
$IPT -A dmz_to_net -d $IP_FTP_UPDATE -p tcp --dport 21 -j ACCEPT
#permetto di risolvere nomi
$IPT -A dmz_to_net -d $IP_DNS1 -p udp --dport 53 -j ACCEPT
$IPT -A dmz_to_net -d $IP_DNS2 -p udp --dport 53 -j ACCPET
#se il tipo di connessione non e' fra quelli permessi, lo loggo
$IPT -A dmz_to_net -j LOG --log-prefix dmz_to_net:
#accetto le connessioni verso il server web in DMZ
$IPT -A net_to_dmz -d $SERVER_WEB -p tcp --dport 80 -j ACCEPT
#devo anche accettare le connessioni stabilite dal server web per
aggiornamenti e dns
$IPT -A net_to_dmz -m state --state RELATED,ESTABLISHED -j ACCEPT
#dalla LAN posso accedere a tutte le porte del server in DMZ (tipo per poterci
accedere via ssh per poterlo gestire)
$IPT -A lan_to_dmz -j ACCEPT
#dalla dmz verso la lan accetto solamente le connessioni related ed
estabilished...
$IPT -A dmz_to_lan -m state --state RELATED,ESTABLISHED -j ACCEPT
#loggo tutte le altre connessioni dal server web verso la lan
$IPT -A dmz_to_lan -j LOG --log-prefix dmz_to_lan:
#accetto tutte le connessioni fatte dalla LAN verso il server (considero la
mia rete interna SICURA)
$IPT -A lan_to_server -j ACCEPT
#accetto solo le connessioni related o estabilished che il server fa alla LAN
$IPT -A server_to_lan -j ACCEPT
#permetto gli update del firewall
$IPT -A server_to_net -d $IP_WEB_UPDATE -p tcp --dport 80 -j ACCEPT
$IPT -A server_to_net -d $IP_FTP_UPDATE -p tcp --dport 21 -j ACCEPT
#permetto di risolvere nomi
$IPT -A server_to_net -d $IP_DNS1 -p udp --dport 53 -j ACCEPT
$IPT -A server_to_net -d $IP_DNS2 -p udp --dport 53 -j ACCPET
#se il tipo di connessione non e' fra quelli permessi, lo loggo
$IPT -A server_to_net -j LOG --log-prefix dmz_to_net:
#permetto al firewall che riceva le risposte
$IPT -A net_to_server -m state --state RELATED,ESTABLISHED -j ACCEPT
#loggo i tentativi del server in dmz di accedere al firewall
$IPT -A dmz_to_server -j LOG --log-prefix dmz_to_server:
In questo modo dovremmo essere piu' o meno a posto, comunque con
configurazioni diverse le cose potrebbero complicarsi, ma come base potrebbe
funzionare.
cambiamenti possibili/idee varie
se sia il server web sia il firewall usano la stessa distribuzione, e quindi
gli stessi server per fare update (oltre che gli stessi dns), si potrebbero
cambiare alcuni parti del firewall, in modo da rendere piu' comoda l'aggiunta
di altri eventuali ip per update o altri servizi che i server possono
raggiungere in internet.
#dalla DMZ verso internet accetto solo le connesioni related o estabilished
$IPT -A dmz_to_net -m state --state RELATED,ESTABLISHED -j ACCEPT
#permetto gli update
$IPT -A dmz_to_net -d $IP_WEB_UPDATE -p tcp --dport 80 -j ACCEPT
$IPT -A dmz_to_net -d $IP_FTP_UPDATE -p tcp --dport 21 -j ACCEPT
#permetto di risolvere nomi
$IPT -A dmz_to_net -d $IP_DNS1 -p udp --dport 53 -j ACCEPT
$IPT -A dmz_to_net -d $IP_DNS2 -p udp --dport 53 -j ACCPET
#se il tipo di connessione non e' fra quelli permessi, lo loggo
$IPT -A dmz_to_net -j LOG --log-prefix dmz_to_net:
#permetto gli update del firewall
$IPT -A server_to_net -d $IP_WEB_UPDATE -p tcp --dport 80 -j ACCEPT
$IPT -A server_to_net -d $IP_FTP_UPDATE -p tcp --dport 21 -j ACCEPT
#permetto di risolvere nomi
$IPT -A server_to_net -d $IP_DNS1 -p udp --dport 53 -j ACCEPT
$IPT -A server_to_net -d $IP_DNS2 -p udp --dport 53 -j ACCPET
#se il tipo di connessione non e' fra quelli permessi, lo loggo
$IPT -A server_to_net -j LOG --log-prefix dmz_to_net:
queste due parti potrebbero diventare cosi:
$IPT -N permitted
$IPT -A permitted -d $IP_WEB_UPDATE -p tcp --dport 80 -j ACCEPT
$IPT -A permitted -d $IP_FTP_UPDATE -p tcp --dport 21 -j ACCEPT
#permetto di risolvere nomi
$IPT -A permitted -d $IP_DNS1 -p udp --dport 53 -j ACCEPT
$IPT -A permitted -d $IP_DNS2 -p udp --dport 53 -j ACCPET
#se il tipo di connessione non e' fra quelli permessi, lo loggo
$IPT -A permitted -j LOG --log-prefix dmz_to_net:
#dalla DMZ verso internet accetto solo le connesioni related o estabilished
$IPT -A dmz_to_net -m state --state RELATED,ESTABLISHED -j ACCEPT
#permetto un po di cose ai server in dmz
$IPT -A dmz_to_net -j permitted
#permetto un po di cose al firewall
$IPT -A server_to_net -j permitted
inoltre se abbiamo molti server in dmz si potrebbero dividere le connessioni
per ogni server del tipo al posto di:
$IPT -A FORWARD -i $NET -o $DMZ -j net_to_dmz
$IPT -A FORWARD -i $DMZ -o $NET -j dmz_to_net
$IPT -A FORWARD -i $NET -o $DMZ -d $IP_WEB -j net_to_dmz_web
$IPT -A FORWARD -i $NET -o $DMZ -d $IP_SMTP -j net_to_dmz_smtp
$IPT -A FORWARD -i $DMZ -o $NET -s $IP_WEB -j dmz_to_net_web
$IPT -A FORWARD -i $DMZ -o $NET -s $IP_SMTP -j dmz_to_net_smtp
questo per avere un controllo piu' granulare su cosa puo' fare ogni server in
DMZ e non trattandoli tutti genericamente.
ATTENZIONE!
Vi ricordo che prima di implementare un firewall "importante" e' meglio darsi un'occhiata a http://www.netfilter.org/ non prendete tutto per giusto quello che ho scritto! Ovviamente se notate errori fatemelo sapere, stessa cosa vale se avete suggerimenti
Ciao!