Configurare Netfilter con Shorewall
Introduzione
Netfilter è il framework di filtraggio pacchetti presente nei Kernel Linux (>= 2.4). Il software userspace associato a Netfilter è iptables ed è utilizzato per configurare le regole di filtraggio dei pacchetti. Shorewall è uno strumento ad alto livello per configurare Netfilter.
La guida si rivolge a chi come me deve amministrare quotidianamente un cospicuo numero di firewall Linux e si rende conto della difficoltà oggettiva a farlo con i classici shell script iptables.
iptables
iptables(8) è lo strumento base per costruire firewall.
Si utilizza il comando iptables per specificare le politiche predefinite, le regole di INPUT, quelle di OUTPUT e quelle di FORWARDING. Solitamente si raccoglie la serie di comandi in uno shell script destinato quasi sempre a crescere nel tempo man mano che le politiche di firewalling divengono più specifiche o devono descrivere nuove esigenze. Spesso ci si trova ad amministrare un firewall descritto da uno shell script anche complesso, ma sicuramente lungo che oggettivamente può creare difficoltà nella manutenzione del firewall. Inoltre è sicuramente più difficile stabilire, leggendo lo script, se le politiche di firewalling sono implementate correttamente.
Shorewall
Shoreline Firewall (in breve Shorewall) rientra nella categoria degli strumenti ad alto livello per configurare Netfilter.
Questo tipo di strumenti permettono di specificare regole di firewalling ad un livello d'astrazione più elevato di quello offerto da un semplice shell script iptables, utilizzando un linguaggio spesso vicino al modo in cui si definisce la politica di firewalling.
Per specificare una politica di firewalling si potrebbe procedere come segue:
- Individuazione delle zone di rete, p.e. rete locale, pubblica e DMZ.
- Politiche predefinite per il traffico da una zona all'altra.
- Regole di firewalling (non sono altro che delle eccezioni alle politiche predefinite di cui sopra.
Politiche di Firewalling per XYZ Reti - locale - pubblica - DMZ Politiche di traffico predefinite pubblica -> locale DROP pubblica -> DMZ DROP locale -> pubblica REJECT locale -> DMZ ACCEPT DMZ -> locale DROP DMZ -> pubblica REJECT Regole locale -> pubblica:any:web ACCEPT locale -> pubblica:application_server:81 ACCEPT [...]
Ovviamente si tratta solo di un breve esempio, tuttavia si vedrà di seguito come Shorewall utilizzi una procedura analoga e una sintassi simile a quella mostrata qui sopra.
Il funzionamento di Shorewall consiste nel leggere dei file di configurazione, compilarli in una serie di comandi iptables ed eseguirli. Quindi non si tratta di un demone e il firewall funziona nello esattamente come quando lo si costruisce con il classico shell script.
Installazione in Debian GNU/Linux
L'installazione è semplicissima:
~# apt-get install shorewall
Terminata la configurazione, prima di avviare il servizio, è necessario editare /etc/default/shorewall per impostare la variabile startup:
# prevent startup with default configuration # set the below varible to 1 in order to allow shorewall to start startup=1
A questo punto procedere con l'usuale:
/etc/init.d/shorewall start
Dichiarazione delle Interfacce di Rete
Le interfacce di rete sono dichiarate nel file /etc/shorewall/interfaces:
#ZONE INTERFACE BROADCAST OPTIONS net eth0 detect blacklist,norfc1918,nosmurfs,routefilter loc eth1 detect
Sono state dichiarate due interfacce: l'interfaccia publica sta sulla eth0, mentre la LAN sulla eth1. Alle interfacce sono associate le etichette net e loc. Nel campo OPTIONS sono specificate delle opzioni attive sull'interfaccia net:
- blacklist
- all'interfaccia è associato il file /etc/shorewall/blacklist, in cui si specificano gli indirizzi IP da bloccare
- norfc1918
- l'interfaccia non deve accettare pacchetti il cui indirizzo sorgente è specificato nell'RFC1918 (principalmente indirizzi privati
- nosmurfs
- filtra i pacchetti per gli smurfs, cioè quelli che hanno come sorgente un indirizzo di broadcast
- routefilter
- contro misura per spoofing
Per maggiori informazioni riferirsi a interfaces(5).
Zone
Le zone della rete sono dichiarate in /etc/shorewall/zones:
############################################################# #ZONE TYPE OPTIONS IN OUT # OPTIONS OPTIONS fw firewall net ipv4 loc ipv4
Sono dichiarate una zona firewall, net (internet) e loc (la rete locale). Il campo TYPE individua il tipo di zona:
- firewall
- è il firewall stesso e deve essere presente una sola zona di questo tipo
- ipv4
- è il tipo standard predefinito
- ipsec
- la comunicazione con gli host presenti in questa zona è criptata
Per maggiorni informazioni riferirsi a zones(5).
Politiche Predefinite
Le politiche predefinite specificano la politica di interconnessione delle zone dichiarate in /etc/shorewall/zones. Si dichiarano nel file /etc/shorewall/policy:
#SOURCE DEST POLICY LOG BURST:LIMIT # LEVEL loc net REJECT info net all DROP info all all REJECT info
Sorgente e destinazione possono essere:
- zone
- un nome di zona definito nel file /etc/shorewall/zones
- $FW
- è il firewall stesso
- all
- tutte le zone
Le politiche più comuni:
- ACCEPT
- la connessione viene accettata
- DROP
- la connessione viene ignorata silenziosamente
- REJECT
- per le connessioni TCP il firewall risponde con RST (reset), per le altre connessioni il firewall risponde con un ICMP - unreacheable.
Se il campo LOG è impostato, la connessioni sono registrate secondo il log level dichiarato. È possibile anche l'utilizzo di ULOG per l'invio dei log del firewall all'infrastruttura ULOG. Per l'utilizzo di ULOG è necessari o anche modificare il file /etc/shorewall/shorewall.conf.
Impostando il campo BURST:LIMIT si specifica il rateo massimo di connessioni TCP e la misura di un burst accettabile.
Per maggiori informazioni riferirsi a policy(5).
Parametrizzazione
In /etc/shorewall/params si definiscono variabili e liste da utilizzare nelle regole o anche nelle interfacce. Per esempio:
# Variabile HOSTA="1.2.3.4" HOSTB="1.2.3.5" # Lista di variabili MANGEMENTHOSTS="$HOSTA,$HOSTB"
Per utilizzare nelle regole una variabile occorre specificarla nella forma $VARIABILE, esattamente come avviene negli shell script.
Per maggiori informazioni riferirsi a params(5).
Regole
Le regole vanno specificate nel file /etc/shorewall/rules.
# Macro/ACTION SRC DST SSH/ACCEPT net:$MANGEMENTHOSTS $FW # ACCEPT dmz:$MAILSERVER net:$PYZOR udp 24441
Per maggiori informazioni riferirsi a rules(5).
Macro predefinite
Le macro permettono di specificare le regole in modo semplice e sintetico. Shorewall viene distribuito con una serie di macro predefinite, installate in /usr/share/shorewall. Sono definite in file del tipo macro.NOMEMACRO. Per esempio macro.POP3 individua il traffico in transito verso la porta 110 che normalmente è appunto utilizzata dal protocollo POP3.
Regole definite dall'utente
Macro definite dall'utente
L'utente può aggiungere macro a quelle già disponibili definendole in file tipo macro.* da creare in /etc/shorewall. Supponendo di voler cambiare la porta su cui ascola sshd da 22 a 2222, possiamo definire la seguente macro:
#ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/ # PORT PORT(S) DEST LIMIT GROUP PARAM - - tcp 2222 #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
Blacklist
Il file /etc/shorewall/blacklist è utilizzato per il blacklisting statico. Si possono specificare indirizzi IP e MAC. Quando un pacchetto giunge sull'interfaccia in cui è abilitata l'opzione blacklist, il firewall controlla se l'indirrizzo IP sorgente e MAC (se disponibile) sono inclusi nella blacklist e quindi se il pacchetto va bloccato. È possibile anche specificare protocolla e porta.
#ADDRESS/SUBNET PROTOCOL PORT # Una rete brasiliana 200.129.0.0/16 # L'host 1.2.3.4 non deve collegarsi a squid. 1.2.3.4 tcp 3128
Per maggiori informazioni blacklist(5).
La blacklist può avere anche un carattere dinamico. Gli elementi presenti nella blacklist saranno "dimenticati" ogni volta che shorewall sarà riavviato, a meno che essi non siano stati salvati.
- shorewall drop <ipaddresslist>
- inserisce gli IP nella blacklist dinamica con politica DROP
- shorewall reject <ipaddresslist>
- inserisce gli IP nella blacklist dinamica con politica REJECT
- shorewall allow <ipaddresslist>
- toglie gli IP dalla blacklist dinamica
- shorewall show dynamic
- mostra gli elementi presenti nella blacklist dinamica
- shorewall save
- salva la configurazione della blacklist dinamica, in modo che al prossimo riavvia sia ripristinata
L'utilizzo delle blacklist dinamiche è particolarmente utile quando affiancato a programmi esterni come ad es. strumenti che effettuano il blacklisting automatico degli IP che tentano attacchi di tipo brute force a servizi quali POP3, FTP etc.
Abilitare il forwarding
In /etc/shorewall/shorewall.conf l'opzione IP_FORWARDING va impostata su On. I casi in cui l'IP_FORWARDING non va attivato sono due:
- Il firewall è installato su un sistema isolato, per esempio un server pubblico.
- L'accesso verso l'esterno avviene esclusivamente tramite servizi di proxy (installati sul firewall).
Masquerading (NAT)
L'IP Masquerading è una form di NAT che permette di far condividere una connessione internet ad una LAN in modo semplice e comodo. Supponiamo di avere la LAN collegata alla scheda di rete eth0 e la connettività a eth1. Per fare in modo che la LAN sia "mascherata" dall'IP della connessione internet, editare il file /etc/shorewall/masq:
############################################################################### #INTERFACE SUBNET ADDRESS PROTO PORT(S) IPSEC eth1 eth0 #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE
Eseguire il DNAT
DNAT è l'acronimo di Destination network address translation. È una tecnica per cambiare l'indirizzo IP di destinazione di un pacchetto e tenere traccia dei pacchetti di risposta. Detto in altre parole facciamo DNAT quando "giriamo una porta verso una macchina interna al firewall".
Per inoltrare le richieste smtp, pop3 e imap da internet verso la macchina in DMZ 192.168.10.5:
#ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL # PORT PORT(S) DEST DNAT net dmz:192.168.10.5 tcp smtp,pop3
Eventualmente è possibile cambiare la coppia di porte origine/destinazione.
Il comando shorewall
--Nicsar 11:48, 23 feb 2009 (CET) (Nicola Sarobba)