<- SL - Intro - Indice Generale - Copertina - SL - GCompris ->

Firewall


Creazione di un firewall per la gestione di una rete privata e una DMZ


di Stefano Sasso


L'articolo...

In questo articolo vedremo come configurare un firewall Linux per gestire una rete privata e una DMZ.



Chiariamo subito il concetto di rete pubblica e rete privata: una rete pubblica è quel tratto di rete visibile da tutto il "mondo". In questa rete possono essere situati un web server, un mail server, ecc...

La rete pubblica in gergo tecnico viene anche chiamata DMZ (De-Militarized Zone, Zona De-Militarizzata): è un tratto di rete in cui il firewall permette l'accesso a tutti.

La rete privata è una rete i cui computer possono accedere a internet ma non vengono visti dal "mondo".

Terminata l'introduzione iniziamo subito la configurazione di quello che sarà il nostro firewall.

Ovviamente su questo PC dovranno essere installate tre interfacce di rete: una che servirà per il collegamento internet, una per la rete privata e una per la DMZ.

Sul PC che fungerà da firewall installeremo la distribuzione che più ci aggrada, ricordandoci di utilizzare un kernel successivo alla versione 2.4, di cui utilizzeremo netfilter (iptables).

Per assegnare un indirizzo IP ad una scheda è possibile utilizzare il tool di configurazione della propria distribuzione, oppure il comando ifconfig:

# ifconfig eth0 netmask 255.0.0.0 63.65.76.122 up

eth0 è l'interfaccia collegata ad internet, 63.65.76.122 è l'indirizzo che ci è stato assegnato dal provider.

# ifconfig eth1 netmask 255.0.0.0 10.0.0.1 up

eth1 è l'interfaccia per il segmento di rete privata, 10.0.0.1 è l'IP della scheda per la rete privata.

# ifconfig eth2 netmask 255.255.255.0 192.168.0.1 up

eth2 è l'interfaccia per la DMZ, 192.168.0.1 è l'IP della scheda per la DMZ.

Passiamo ora alla creazione dello script per l'attivazione del firewall:

#!/bin/sh

# Definizione delle variabili necessarie allo script
INTERFACCIA_LAN="eth1" # interfaccia per la rete privata
INTERFACCIA_DMZ="eth2" # interfaccia per la rete pubblica (DMZ)
INTERFACCIA_INTERNET="eth0" # interfaccia per il collegamento a internet
LAN_IP="10.0.0.1" # ip della scheda di rete per la rete privata
LAN_IP_RANGE="10.0.0.1/10.255.255.255" # range degli indirizzi ip della lan
DMZ_IP="192.168.0.1" # ip della scheda di rete per la DMZ
INTERNET_IP="63.65.76.122" # ip assegnatoci dal provider

# Ora carichiamo i moduli del kernel necessari per il corretto funzionamento del firewall
modprobe iptable_filter
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_tftp
modprobe ip_conntrack_amanda
modprobe ip_conntrack_irc
modprobe ip_tables
modprobe ip_queue
modprobe ipt_multiport
modprobe ipt_mac
modprobe ipt_unclean
modprobe ipt_REJECT
modprobe ipt_state
modprobe ipt_owner
modprobe ipt_limit
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ip_nat_tftp
modprobe ip_nat_irc
modprobe ip_nat_snmp_basic
modprobe ip_nat_amanda
modprobe ipt_MASQUERADE
modprobe ipt_LOG

# Abilitiamo l'IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# Azzera tutte le catene precedentemente definite
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z

# Definisce le politiche predefinite
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Crea le nuove catene che verranno utilizzate per la gestione del firewall
iptables -N filter_bad_packets
iptables -N from_outside
iptables -N from_inside
iptables -N filter_lan_reserved
iptables -N dmz_to_outside
iptables -N dmz_to_inside
iptables -N outside_to_dmz
iptables -N inside_to_dmz

# Da qui inizia la gestione vera e propria del firewall
iptables -t nat -A POSTROUTING -o $INTERFACCIA_INTERNET -j SNAT --to-source $INTERNET_IP
# maschera gli indirizzi ip in modo che i computer della rete possano accedere a internet

##### Servizio: HTTP (Porta tcp/80) #####
# Da decommentare nel caso nella DMZ sia presente un web server
#WEBSERVER_IP="192.168.0.5" # ip del web server all'interno della DMZ
#iptables -t nat -A PREROUTING -p tcp -i $INTERFACCIA_INTERNET -d $INTERNET_IP --dport 80 -j DNAT --to-destination $WEBSERVER_IP
# manda tutti i pacchetti per la porta tcp/80 al web server
## Attenzione: per l'attivazione del web server ci saranno da decommentare altre linee più avanti
##### Fine servizio: HTTP #####

# Catene per la gestione del firewall:
# Catena FILTER_LAN_RESERVED: filtra i pacchetti relativi alla LAN
iptables -A filter_lan_reserved -s $LAN_IP -j DROP

# Catena FROM_INSIDE: filtra i pacchetti in arrivo dalla LAN
iptables -A from_inside -j filter_lan_reserved
iptables -A from_inside -s $LAN_IP_RANGE -j ACCEPT
# accetta tutti i pacchetti provenienti dalla LAN e diretti a internet o alla DMZ

# Catena FILTER_BAD_PACKETS: filtra i pacchetti alla ricerca di qualche pacchetto non valido
iptables -A filter_bad_packets -p tcp ! --syn -m state --state NEW -j DROP
# elimina tutti i pacchetti nuovi senza il syn flag
iptables -A filter_bad_packets -p all -m state --state INVALID -j DROP
# elimina tutti i pacchetti non validi

# Catena FROM_OUTSIDE: filtra i pacchetti provenienti da internet
iptables -A from_outside -p all -j filter_bad_packets
# fa un controllo per i pacchetti non validi
iptables -A from_outside -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
# fa passare verso la LAN solo i pacchetti relativi a connessioni già avvenute

# Catena OUTSIDE_TO_DMZ: regole per la gestione della DMZ
##### Servizio: HTTP (porta tcp/80) #####
# decommentare le seguenti linee nel caso ci sia un web server nella DMZ
#iptables -A outside_to_dmz -p tcp -d $WEBSERVER_IP --dport 80 --syn -m state --state NEW -j ACCEPT
#iptables -A outside_to_dmz -p tcp -d $WEBSERVER_IP --dport 80 --syn -m state --state ESTABLISHED,RELATED -j ACCEPT
##### Fine servizio: HTTP #####
iptables -A outside_to_dmz -j DROP
#invia alla DMZ solo i pacchetti per i servizi conosciuti, elimina gli altri

# Catena DMZ_TO_OUTSIDE
iptables -A dmz_to_outside -j ACCEPT
# fa uscire in internet tutti i pacchetti provenienti dalla DMZ

# Catena INSIDE_TO_DMZ
iptables -A inside_to_dmz -j from_inside
# per l'invio di pacchetti dalla LAN alla DMZ rimanda alla catena from_inside
iptables -A inside_to_dmz -j DROP

# Catena DMZ_TO_INSIDE
iptables -A dmz_to_inside -j from_outside
# per l'invio di pacchetti dalla DMZ alla LAN rimanda alla catena from_outside
iptables -A dmz_to_inside -j DROP

# Ora verificando le interfacce sorgente e destinazione inviamo i pacchetti verso le catene preposte per la loro analisi
iptables -A FORWARD -i $INTERFACCIA_INTERNET -o $INTERFACCIA_DMZ -j outside_to_dmz
iptables -A FORWARD -i $INTERFACCIA_DMZ -o $INTERFACCIA_INTERNER -j dmz_to_outside
iptables -A FORWARD -i $INTERFACCIA_LAN -o $INTERFACCIA_DMZ -j inside_to_dmz
iptables -A FORWARD -i $INTERFACCIA_DMZ -o $INTERFACCIA_LAN -j dmz_to_inside
iptables -A FORWARD -i $INTERFACCIA_INTERNET -o $INTERFACCIA_LAN -j from_outside
iptables -A FORWARD -i $INTERFACCIA_LAN -o $INTERFACCIA_INTERNET -j from_inside

Attenzione: le regole di questo firewall gestiscono i pacchetti della LAN e della DMZ ma non quelli locali.

Queste semplici regole costituiscono una base di partenza e possono, naturalmente, essere migliorate ed estese in funzione dei servizi ospitati nella DMZ e del grado di sicurezza che si vuole implementare.

In generale, per un nuovo servizio nella DMZ inserire la riga

iptables -t nat -A PREROUTING -p <protocollo:tcp|udp|all> -i $INTERFACCIA_INTERNET -d $INTERNET_IP \
 --dport <porta-del-servizio> -j DNAT --to-destination <IP-del-server-del-servizio>

prima dell'inizio delle catene per la gestione del firewall, e le righe

iptables -A outside_to_dmz -p <protocollo:tcp|udp|all> -d <IP-del-server-del-servizio> \
 --dport <porta-del-servizio> --syn -m state --state NEW -j ACCEPT
iptables -A outside_to_dmz -p <protocollo:tcp|udp|all> -d <IP-del-server-del-servizio> \
 --dport <porta-del-servizio> --syn -m state --state ESTABLISHED,RELATED -j ACCEPT

nella catena outside_to_dmz prima dell'ultima istruzione (iptables -A outside_to_dmz -j DROP).

Happy firewalling... :-)



L'autore

Stefano Sasso utilizza Linux dal 2000 e si diverte a programmare in Perl, PHP e Python. È anche amministratore del server web del suo liceo, dove frequenta la classe quarta.


<- SL - Intro - Indice Generale - Copertina - SL - GCompris ->