HexDEF6
18-04-2007, 19:26
Ciao, sto lavorando su un firewall, per una rete che comprende:
-server in DMZ
-accesso via rete cablata (una LAN trusted)
-accesso via wireless
il firewall girera' su una macchina con 4 schede di rete
eth0: INTERNET
eth1: LAN TRUSTED
eth2: DMZ
eth3: WIRELESS
la rete sara' cosi composta:
*server di frontiera con 4 schede di rete, dove girera' il firewall e alcuni servizi (tipo samba) accessibili solo dalla rete LAN
*DMZ con un paio di server (web e forse posta... visto che abbiamo parecchi ip pubblici potrebbero essere raggiungibili su ip differenti al server di frontiera, che quindi si dovra' beccare magari 3 ip pubblici diversi sulla eth0)
*SERVER INTERNI in cui si faranno delle prove e saranno raggiungibili solo dalla LAN (praticamente si possono considerare come delle normalissime workstation nella LAN)
* X workstation che potranno accedere sia alla DMZ sia ai servizi sul server di frontiera
*X access point che verranno connessi alla eth3 del server di frontiera (ma questa parte sara' fatta con piu' calma) dalla wireless si potra solamente navigare in internet previa autenticazione, ma non si avra' accesso ne alla DMZ ne alla LAN ne ai servizi sul server di frontiera
CONFIG
IPT=/sbin/iptables
NET="eth0"
LAN="eth1"
DMZ="eth2"
WRL="eth3"
LO="lo"
IP_NET="10.10.10.10"
IP_LAN="192.168.10.1"
IP_DMZ="192.168.20.1"
IP_WRL="192.168.30.1"
IP_LO="127.0.0.1"
IP_UPDATE="10.20.0.1"
RANGE_IP_LAN="192.168.10.0/24"
RANGE_IP_DHCP="192.168.10.XX/YY"
G_DMZ.sh
#!/bin/bash
rm ./*.dmz
. ./CONFIG
for file in ./DMZ/*
do
ip=$(basename $file)
gawk '{ if (($1 != "") && ($2 == "")) IP_DMZ = $1
if (($1 == "tcp") || ($1 == "udp")) {
print "$IPT -t nat -A PREROUTING -i $NET -d " IP " -p " $1 " --dport " $2 " -j DNAT --to " IP_DMZ >> pre
print "$IPT -t nat -A POSTROUTING -o $NET -s " IP_DMZ " -p " $1 " --sport " $2 " -j SNAT --to-source " IP >> post
}
if ($1 == "update") {
print "$IPT -A dmz_to_net -s " IP " -d " $2 " -j dmz_to_net_update" >> update
print "$IPT -t nat -A POSTROUTING -o $NET -s " IP_DMZ " -d " $2 " -j SNAT --to-source " IP >> snat_update
}
}
END { print "$IPT -t nat -A PREROUTING -i $LAN -d " IP " -j DNAT --to " IP_DMZ >> pre
print "$IPT -t nat -A POSTROUTING -o $LAN -s " IP_DMZ " -j SNAT --to-source " IP >> post }' IP=$ip pre=./prerouting.dmz post=./postrouting.dmz update=./update.dmz snat_update=./snat_update.dmz $file
done
chmod +x ./*.dmz
firewall.sh
#!/bin/bash
#faccio un source del file di configurazione (con le dichiarazioni delle reti ecc.)
. ./CONFIG
#lancio lo script che genera le regole di post e pre routing in base ai file di configurazione trovati in ./DMZ/
./G_DMZ.sh
#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 lan_to_net_dhcp
$IPT -N net_to_dmz
$IPT -N dmz_to_net
$IPT -N dmz_to_net_update
$IPT -N lan_to_dmz
$IPT -N lan_to_dmz_dhcp
$IPT -N dmz_to_lan
$IPT -N server_to_net
#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
#giro le richieste http sul server in DMZ e faccio uno SNAT per le risposte
#faccio DNAT e SNAT anche per gli utenti che chiamano IP_WEB dalla LAN
. ./prerouting.dmz
. ./postrouting.dmz
#snatto anche le connessioni fatte per fare l'update delle macchine
#da generare con uno script!
#$IPT -t nat -A POSTROUTING -o $NET -s $IP_WEB_DMZ -d $IP_UPDATE -j SNAT --to-source $IP_WEB
. ./snat_update.dmz
#source nat se esco su internet cambio l'ip del sorgente con l'ip pubblico di eth0
$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 per ora non prendo in considerazione la WRL
$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
#gestisco input e output del server di frontiera in base alla rete di provenienza
#se proviene dall'interfaccia di rete INTERNET, accetto solo le connessioni related ed estabilished
$IPT -A INPUT -i $NET -m state --state RELATED,ESTABLISHED -j ACCEPT
#considero trusted la LAN, e quindi accetto tutte le connessioni provenienti da essa
$IPT -A INPUT -i $LAN -j ACCEPT
#il server di frontiera non dovrebbe ricevere nulla dalla DMZ, quindi loggo e droppo
$IPT -A INPUT -i $DMZ -j LOG --log-prefix input_dmz:
$IPT -A INPUT -i $DMZ -j DROP
#il server puo' fare connessioni verso l'esterno (solo quelle permesse in server_to_net)
$IPT -A OUTPUT -o $NET -j server_to_net
#il server puo' "uscire" verso la LAN trusted (non fondamentale, magari da sostituire con related e estabilished)
$IPT -A OUTPUT -o $LAN -j ACCEPT
#il server non puo' fare connessioni verso la DMZ, quindi loggo e droppo
$IPT -A OUTPUT -o $DMZ -j LOG --log-prefix output_dmz:
$IPT -A OUTPUT -o $DMZ -j DROP
#controllo i tentativi di connessione al web server in dmz forse basta quello il log in prerouting (e il drop?)
#da scriptare pure questo!
#da scriptare... e occhio perche' se ci sono piu' porte usate sullo stesso server e' un casino!
$IPT -A INPUT -i $NET -d $IP_WEB -j LOG --log-prefix ip_web:
$IPT -A INPUT -i $NET -d $IP_WEB -j DROP
#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, tranne a chi e' in dhcp che viene rediretto in lan_to_net_dhcp
$IPT -A lan_to_net -s $RANGE_IP_DHCP -j lan_to_net_dhcp
$IPT -A lan_to_net -j ACCEPT
#limito la navigazione agli ip non statici o non registrati nel server dhcp....
$IPT -A lan_to_net_dhcp -p tcp --dport 80 -j ACCEPT
$IPT -A lan_to_net_dhcp -p tcp --dport 443 -j ACCEPT
$IPT -A lan_to_net_dhcp -p udp --dport 53 -j ACCEPT
$IPT -A lan_to_net_dhcp -p tcp --dport 21 -j ACCEPT
#....e loggo i tentativi di usare altre porte
$IPT -A lan_to_net_dhcp -j LOG --log-prefix lan_to_net_dhcp:
$IPT -A lan_to_net_dhcp -j DROP
#dalla DMZ verso internet accetto solo le connesioni related o estabilished, o per fare l'update della macchina...
$IPT -A dmz_to_net -m state --state RELATED,ESTABLISHED -j ACCEPT
#$IPT -A dmz_to_net -s $IP_WEB -d $IP_UPDATE -j dmz_to_net_update
. ./update.dmz
#e loggo tutto quello che prova ad accedere ad internet
$IPT -A dmz_to_net -j LOG --log-prefix dmz_to_net:
$IPT -A dmz_to_net -j DROP
#...se l'ip si trova nella lista degli update lascio passare la connessione
#ma loggo pure questo...da scriptare!
$IPT -A dmz_to_net_update -j LOG --log-prefix dmz_to_net_update:
$IPT -A dmz_to_net_update -j ACCEPT
#accetto tutte le connessioni fatte dalla LAN verso la DMZ....
$IPT -A lan_to_dmz -s $RANGE_IP_DHCP -j lan_to_dmz_dhcp
$IPT -A lan_to_dmz -j ACCEPT
#....ma per ora non consento agli utenti dhcp di lavorare sulla DMZ
$IPT -A lan_to_dmz_dhcp -j LOG --log-prefix lan_to_dmz_dhcp:
$IPT -A lan_to_dmz_dhcp -j DROP
#dalla dmz verso la lan accetto solamente le connessioni related ed estabilished...
$IPT -A dmz_to_lan -m state --state RELATED,ESTABLISHED -j ACCEPT
#...e le altre le loggo
$IPT -A dmz_to_lan -j LOG --log-prefix dmz_to_lan:
$IPT -A dmz_to_lan -j DROP
#permetto al server di uscire sulle porte 80 21 443 e di risolvere i nomi
$IPT -A server_to_net -p tcp --dport 80 -j ACCEPT
$IPT -A server_to_net -p tcp --dport 21 -j ACCEPT
$IPT -A server_to_net -p tcp --dport 443 -j ACCEPT
$IPT -A server_to_net -p udp --dport 53 -j ACCEPT
#ma se prova a fare altro lo loggo
$IPT -A server_to_net -j LOG --log-prefix server_to_net:
$IPT -A server_to_net -j DROP
Per ora c'e' solo la base, quindi se avete suggerimenti sono ben accetti...
man mano che vado avanti aggiornero il post....
tra le cose da fare:
*sistemare il firewall per la wireless (i cui client probabilmente dovranno autenticarsi in qualche maniera... server radius?)
*possibilita' di connessione per una vpn (openvpn) da internet e dalla rete wireless per poter accedere ai servizi presenti sul server di frontiera, nella DMZ e nella LAN
*(forse) permettere l'uscita dalla LAN a solo certe porte (ssh, http, https, pops, imaps, smtp)
*far funzionare il tutto :D
Ciao!
-server in DMZ
-accesso via rete cablata (una LAN trusted)
-accesso via wireless
il firewall girera' su una macchina con 4 schede di rete
eth0: INTERNET
eth1: LAN TRUSTED
eth2: DMZ
eth3: WIRELESS
la rete sara' cosi composta:
*server di frontiera con 4 schede di rete, dove girera' il firewall e alcuni servizi (tipo samba) accessibili solo dalla rete LAN
*DMZ con un paio di server (web e forse posta... visto che abbiamo parecchi ip pubblici potrebbero essere raggiungibili su ip differenti al server di frontiera, che quindi si dovra' beccare magari 3 ip pubblici diversi sulla eth0)
*SERVER INTERNI in cui si faranno delle prove e saranno raggiungibili solo dalla LAN (praticamente si possono considerare come delle normalissime workstation nella LAN)
* X workstation che potranno accedere sia alla DMZ sia ai servizi sul server di frontiera
*X access point che verranno connessi alla eth3 del server di frontiera (ma questa parte sara' fatta con piu' calma) dalla wireless si potra solamente navigare in internet previa autenticazione, ma non si avra' accesso ne alla DMZ ne alla LAN ne ai servizi sul server di frontiera
CONFIG
IPT=/sbin/iptables
NET="eth0"
LAN="eth1"
DMZ="eth2"
WRL="eth3"
LO="lo"
IP_NET="10.10.10.10"
IP_LAN="192.168.10.1"
IP_DMZ="192.168.20.1"
IP_WRL="192.168.30.1"
IP_LO="127.0.0.1"
IP_UPDATE="10.20.0.1"
RANGE_IP_LAN="192.168.10.0/24"
RANGE_IP_DHCP="192.168.10.XX/YY"
G_DMZ.sh
#!/bin/bash
rm ./*.dmz
. ./CONFIG
for file in ./DMZ/*
do
ip=$(basename $file)
gawk '{ if (($1 != "") && ($2 == "")) IP_DMZ = $1
if (($1 == "tcp") || ($1 == "udp")) {
print "$IPT -t nat -A PREROUTING -i $NET -d " IP " -p " $1 " --dport " $2 " -j DNAT --to " IP_DMZ >> pre
print "$IPT -t nat -A POSTROUTING -o $NET -s " IP_DMZ " -p " $1 " --sport " $2 " -j SNAT --to-source " IP >> post
}
if ($1 == "update") {
print "$IPT -A dmz_to_net -s " IP " -d " $2 " -j dmz_to_net_update" >> update
print "$IPT -t nat -A POSTROUTING -o $NET -s " IP_DMZ " -d " $2 " -j SNAT --to-source " IP >> snat_update
}
}
END { print "$IPT -t nat -A PREROUTING -i $LAN -d " IP " -j DNAT --to " IP_DMZ >> pre
print "$IPT -t nat -A POSTROUTING -o $LAN -s " IP_DMZ " -j SNAT --to-source " IP >> post }' IP=$ip pre=./prerouting.dmz post=./postrouting.dmz update=./update.dmz snat_update=./snat_update.dmz $file
done
chmod +x ./*.dmz
firewall.sh
#!/bin/bash
#faccio un source del file di configurazione (con le dichiarazioni delle reti ecc.)
. ./CONFIG
#lancio lo script che genera le regole di post e pre routing in base ai file di configurazione trovati in ./DMZ/
./G_DMZ.sh
#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 lan_to_net_dhcp
$IPT -N net_to_dmz
$IPT -N dmz_to_net
$IPT -N dmz_to_net_update
$IPT -N lan_to_dmz
$IPT -N lan_to_dmz_dhcp
$IPT -N dmz_to_lan
$IPT -N server_to_net
#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
#giro le richieste http sul server in DMZ e faccio uno SNAT per le risposte
#faccio DNAT e SNAT anche per gli utenti che chiamano IP_WEB dalla LAN
. ./prerouting.dmz
. ./postrouting.dmz
#snatto anche le connessioni fatte per fare l'update delle macchine
#da generare con uno script!
#$IPT -t nat -A POSTROUTING -o $NET -s $IP_WEB_DMZ -d $IP_UPDATE -j SNAT --to-source $IP_WEB
. ./snat_update.dmz
#source nat se esco su internet cambio l'ip del sorgente con l'ip pubblico di eth0
$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 per ora non prendo in considerazione la WRL
$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
#gestisco input e output del server di frontiera in base alla rete di provenienza
#se proviene dall'interfaccia di rete INTERNET, accetto solo le connessioni related ed estabilished
$IPT -A INPUT -i $NET -m state --state RELATED,ESTABLISHED -j ACCEPT
#considero trusted la LAN, e quindi accetto tutte le connessioni provenienti da essa
$IPT -A INPUT -i $LAN -j ACCEPT
#il server di frontiera non dovrebbe ricevere nulla dalla DMZ, quindi loggo e droppo
$IPT -A INPUT -i $DMZ -j LOG --log-prefix input_dmz:
$IPT -A INPUT -i $DMZ -j DROP
#il server puo' fare connessioni verso l'esterno (solo quelle permesse in server_to_net)
$IPT -A OUTPUT -o $NET -j server_to_net
#il server puo' "uscire" verso la LAN trusted (non fondamentale, magari da sostituire con related e estabilished)
$IPT -A OUTPUT -o $LAN -j ACCEPT
#il server non puo' fare connessioni verso la DMZ, quindi loggo e droppo
$IPT -A OUTPUT -o $DMZ -j LOG --log-prefix output_dmz:
$IPT -A OUTPUT -o $DMZ -j DROP
#controllo i tentativi di connessione al web server in dmz forse basta quello il log in prerouting (e il drop?)
#da scriptare pure questo!
#da scriptare... e occhio perche' se ci sono piu' porte usate sullo stesso server e' un casino!
$IPT -A INPUT -i $NET -d $IP_WEB -j LOG --log-prefix ip_web:
$IPT -A INPUT -i $NET -d $IP_WEB -j DROP
#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, tranne a chi e' in dhcp che viene rediretto in lan_to_net_dhcp
$IPT -A lan_to_net -s $RANGE_IP_DHCP -j lan_to_net_dhcp
$IPT -A lan_to_net -j ACCEPT
#limito la navigazione agli ip non statici o non registrati nel server dhcp....
$IPT -A lan_to_net_dhcp -p tcp --dport 80 -j ACCEPT
$IPT -A lan_to_net_dhcp -p tcp --dport 443 -j ACCEPT
$IPT -A lan_to_net_dhcp -p udp --dport 53 -j ACCEPT
$IPT -A lan_to_net_dhcp -p tcp --dport 21 -j ACCEPT
#....e loggo i tentativi di usare altre porte
$IPT -A lan_to_net_dhcp -j LOG --log-prefix lan_to_net_dhcp:
$IPT -A lan_to_net_dhcp -j DROP
#dalla DMZ verso internet accetto solo le connesioni related o estabilished, o per fare l'update della macchina...
$IPT -A dmz_to_net -m state --state RELATED,ESTABLISHED -j ACCEPT
#$IPT -A dmz_to_net -s $IP_WEB -d $IP_UPDATE -j dmz_to_net_update
. ./update.dmz
#e loggo tutto quello che prova ad accedere ad internet
$IPT -A dmz_to_net -j LOG --log-prefix dmz_to_net:
$IPT -A dmz_to_net -j DROP
#...se l'ip si trova nella lista degli update lascio passare la connessione
#ma loggo pure questo...da scriptare!
$IPT -A dmz_to_net_update -j LOG --log-prefix dmz_to_net_update:
$IPT -A dmz_to_net_update -j ACCEPT
#accetto tutte le connessioni fatte dalla LAN verso la DMZ....
$IPT -A lan_to_dmz -s $RANGE_IP_DHCP -j lan_to_dmz_dhcp
$IPT -A lan_to_dmz -j ACCEPT
#....ma per ora non consento agli utenti dhcp di lavorare sulla DMZ
$IPT -A lan_to_dmz_dhcp -j LOG --log-prefix lan_to_dmz_dhcp:
$IPT -A lan_to_dmz_dhcp -j DROP
#dalla dmz verso la lan accetto solamente le connessioni related ed estabilished...
$IPT -A dmz_to_lan -m state --state RELATED,ESTABLISHED -j ACCEPT
#...e le altre le loggo
$IPT -A dmz_to_lan -j LOG --log-prefix dmz_to_lan:
$IPT -A dmz_to_lan -j DROP
#permetto al server di uscire sulle porte 80 21 443 e di risolvere i nomi
$IPT -A server_to_net -p tcp --dport 80 -j ACCEPT
$IPT -A server_to_net -p tcp --dport 21 -j ACCEPT
$IPT -A server_to_net -p tcp --dport 443 -j ACCEPT
$IPT -A server_to_net -p udp --dport 53 -j ACCEPT
#ma se prova a fare altro lo loggo
$IPT -A server_to_net -j LOG --log-prefix server_to_net:
$IPT -A server_to_net -j DROP
Per ora c'e' solo la base, quindi se avete suggerimenti sono ben accetti...
man mano che vado avanti aggiornero il post....
tra le cose da fare:
*sistemare il firewall per la wireless (i cui client probabilmente dovranno autenticarsi in qualche maniera... server radius?)
*possibilita' di connessione per una vpn (openvpn) da internet e dalla rete wireless per poter accedere ai servizi presenti sul server di frontiera, nella DMZ e nella LAN
*(forse) permettere l'uscita dalla LAN a solo certe porte (ssh, http, https, pops, imaps, smtp)
*far funzionare il tutto :D
Ciao!