14.2. Firewall o filtraggio dei pacchetti
Il firewall è un punto di filtraggio di rete ed è efficace solo per i pacchetti che devono transitare da esso. Perciò può essere efficace solo se il passaggio attraverso il firewall è l'unico instradamento possibile per quei pacchetti.
La mancanza di una configurazione standard (e il motto «processo, non prodotto») spiega l'assenza di una soluzione chiavi in mano. Ci sono, comunque, strumenti che semplificano la configurazione del firewall netfilter, con una rappresentazione grafica delle regole di filtraggio. fwbuilder
tra questi è senza dubbio uno dei migliori.
The Linux kernel embeds the netfilter firewall. It can be controlled from user-space with the iptables
and ip6tables
commands. The difference between these two commands is that the former acts on the IPv4 network, whereas the latter acts on IPv6. Since both network protocol stacks will probably be around for many years, both tools will need to be used in parallel.
14.2.1. Funzionamento di netfilter
netfilter utilizza quattro tabelle distinte nelle quali memorizza le regole che controllano tre tipologie di operazioni sui pacchetti:
filter
riguarda le regole di filtraggio (accettare, rifiutare o ignorare un pacchetto);
nat
riguarda la traduzione di indirizzi e porte di origine o di destinazione dei pacchetti; da notare che questa tabella esiste solo per l'IPv4;
mangle
riguarda altre trasformazioni sui pacchetti IP (inclusi il campo e le opzioni del ToS: Type of Service);
raw
permette altre modifiche manuali sui pacchetti prima che giungano al sistema di monitoraggio delle connessioni.
Ogni tabella contiene delle liste di regole chiamate catene. Per gestire i pacchetti i firewall utilizzano catene standard in base a circostanze predefinite. L'amministratore può creare altre catene, che saranno utilizzate solo quando una delle catene standard vi fa riferimento (direttamente o indirettamente).
La tabella filter
contiene tre catene standard:
INPUT
: riguarda i pacchetti che hanno come destinazione il firewall stesso;
OUTPUT
: riguarda i pacchetti emessi dal firewall;
FORWARD
: riguarda i pacchetti che transitano attraverso il firewall (che non è né la sorgente, né la destinazione).
Anche la tabella nat
contiene tre catene standard:
PREROUTING
: per modificare i pacchetti non appena arrivano;
POSTROUTING
: per modificare i pacchetti quando sono pronti per essere spediti;
OUTPUT
: per modificare i pacchetti generati dal firewall stesso.
Ogni catena è una lista di regole; ogni regola è un insieme di condizioni e un'azione da intraprendere quando le condizioni sono soddisfatte. Quando viene analizzato un pacchetto, il firewall esamina la catena opportuna, regola per regola; quando le condizioni di una regola sono soddisfatte, esso, per continuare l'elaborazione, «salta» (da qui l'opzione -j
dei comandi) all'azione specificata. Sono stati standardizzati i comportamenti più comuni ed esistono azioni dedicate per ognuno. Intraprendere una di queste azioni standard interrompe l'avanzamento nella catena, dato che il destino del pacchetto è già stato deciso (salvo l'eccezione descritta in seguito):
ACCEPT
: permette al pacchetto di continuare per la sua strada;
REJECT
: rifiuta il pacchetto con un pacchetto di errore ICMP (l'opzione --reject-with tipo
di iptables
permette di selezionare il tipo di errore);
DROP
: elimina (ignora) il pacchetto;
LOG
: registra (via syslogd
) un messaggio con la descrizione del pacchetto; da notare che questa azione non interrompe l'elaborazione, e l'esecuzione della catena prosegue con la regola successiva, ed è per questo che per registrare i pacchetti rifiutati è necessario usare insieme una regola LOG e una REJECT o DROP;
ULOG
: registra un messaggio via ulogd
, che può essere maggiormente personalizzato ed è più efficiente di syslogd
per analizzare una grande mole di messaggi; da notare che questa azione, come «LOG», anch'essa fa proseguire l'elaborazione con la regola successiva nella catena corrente;
nome_catena: salta alla catena specificata ed elabora le relative regole;
RETURN
: interrompe l'elaborazione della catena corrente, e ritorna alla catena chiamante; nel caso in cui la catena corrente sia standard, non esiste alcuna catena chiamante, perciò viene eseguita l'azione predefinita (specificata dall'opzione -P
di iptables
);
SNAT
(solo nella tabella nat
, quindi IPv4 in Wheezy — supporto NAT per IPv6 è presente a partire dal kernel Linux 3.7): applica il Sorgente NAT (opzioni ulteriori descrivono l'esatta modifica da applicare);
DNAT
(solo nella tabella nat
, quindi solo IPv4 in Wheezy): applica la Destinazione NAT (opzioni ulteriori descrivono l'esatta modifica da applicare);
MASQUERADE
(solo nella tabella nat
, quindi solo IPv4 in Wheezy): applica il mascheramento (caso speciale di Sorgente NAT);
REDIRECT
(solo nella tabella nat
, quindi solo IPv4 in Wheezy): reinstrada un pacchetto verso una data porta dello stesso firewall; può essere usato per creare un proxy trasparente alla rete che funziona senza necessità di configurazioni lato client, dato che il client pensa di connettersi al destinatario mentre le comunicazioni in realtà attraversano il proxy.
Altre azioni, in particolare quelle riguardanti la tabella mangle
, esulano dagli scopi di questo libro. Una lista integrale si ottiene con iptables(8) e ip6tables(8).
14.2.2. Sintassi di iptables
e ip6tables
I comandi iptables
e ip6tables
permettono la manipolazione di tabelle, catene e regole. L'opzione -t tabella
individua su quale tabella vanno ad operare (filter
è la predefinita).
The -N chain
option creates a new chain. The -X chain
deletes an empty and unused chain. The -A chain rule
adds a rule at the end of the given chain. The -I chain rule_num rule
option inserts a rule before the rule number rule_num. The -D chain rule_num
(or -D chain rule
) option deletes a rule in a chain; the first syntax identifies the rule to be deleted by its number, while the latter identifies it by its contents. The -F chain
option flushes a chain (deletes all its rules); if no chain is mentioned, all the rules in the table are deleted. The -L chain
option lists the rules in the chain. Finally, the -P chain action
option defines the default action, or “policy”, for a given chain; note that only standard chains can have such a policy.
Each rule is expressed as conditions -j action action_options
. If several conditions are described in the same rule, then the criterion is the conjunction (logical and) of the conditions, which is at least as restrictive as each individual condition.
La condizione -p protocollo
verifica il campo protocollo del pacchetto IP. I valori più usati sono tcp
, udp
, icmp
e icmpv6
. Anteporre un punto esclamativo alla condizione la nega, facendola corrispondere a «qualunque pacchetto con un protocollo differente da quello specificato». Questa meccanismo di negazione non è specifico solo per l'opzione -p
, ma può essere utilizzato anche per tutte le altre condizioni.
La condizione -s indirizzo
oppure -s rete/maschera
verifica l'indirizzo sorgente del pacchetto. Ugualmente, -d indirizzo
oppure -d rete/maschera
verifica l'indirizzo destinazione.
La condizione -i interfaccia
seleziona i pacchetti provenienti dalla data interfaccia di rete. -o interfaccia
seleziona quelli uscenti da una specifica interfaccia.
Ci sono condizioni più specifiche, che dipendono da quelle generiche descritte sopra. Per esempio, la condizione -p tcp
può essere raffinata con ulteriori condizioni sulle porte TCP, con clausole tipo --source-port porta
e --destination-port porta
.
La condizione --state stato
verifica lo stato di un pacchetto in una connessione (questa richiede il modulo del kernel ipt_conntrack
, per il monitoraggio delle connessioni). Lo stato NEW
descrive un pacchetto che instaura una nuova connessione; ESTABLISHED
descrive i pacchetti appartenenti ad una connessione già in essere, e RELATED
descrive i pacchetti che instaurano una connessione correlata con una già esistente (che è utile per le connessioni ftp-data
in modalità «attiva» del protocollo FTP).
La sezione precedente elenca tutte le possibili azioni, ma non le rispettive opzioni. L'azione LOG
, per esempio, ha le seguenti opzioni:
--log-priority
, con valore predefinito warning
, indica la priorità dei messaggi di syslog
.
--log-prefix
permette l'inserimento di un prefisso di testo per differenziare i messaggi di log;
--log-tcp-sequence
, --log-tcp-options
e --log-ip-options
indicano dati ulteriori da integrare nel messaggio: rispettivamente, il numero di sequenza TCP, opzioni TCP e opzioni IP.
The DNAT
action provides the --to-destination address:port
option to indicate the new destination IP address and/or port. Similarly, SNAT
provides --to-source address:port
to indicate the new source IP address and/or port.
The REDIRECT
action (only available if NAT is available — on Wheezy, this means IPv4 only) provides the --to-ports port(s)
option to indicate the port, or port range, where the packets should be redirected.
Per la creazione di ogni regola è necessaria l'invocazione di iptables
/ip6tables
. Digitare questi comandi manualmente può essere noioso, perciò sono solitamente memorizzati in uno script in modo tale che ad ogni avvio della macchina venga richiamata automaticamente la stessa configurazione. Questo script può essere scritto a mano, ma può essere interessante prepararlo con uno strumento di alto livello quale fwbuilder
.
Il principio è semplice. Come primo passo, è necessario descrivere tutti gli elementi coinvolti nelle regole effettive:
il firewall stesso, con le sue interfacce di rete;
le reti, con i loro corrispondenti intervalli di IP;
i server;
le porte che appartengono ai servizi presenti nei server.
Le regole sono quindi create con semplici azioni di trascina e rilascia sugli oggetti. Alcuni menu contestuali permettono di modificare le condizioni (la negazione, per esempio). Dopodiché deve essere scelta e configurata l'azione.
Per quanto concerne l'IPv6, si possono creare due diversi insiemi di regole per IPv4 e IPv6, oppure crearno uno e lasciare che fwbuilder
traduca le regole in base con gli indirizzi assegnati agli oggetti.
fwbuilder
can then generate a script configuring the firewall according to the rules that have been defined. Its modular architecture gives it the ability to generate scripts targeting different systems (iptables
for Linux, ipf
for FreeBSD and pf
for OpenBSD).
Già a partire da Squeeze le versioni del pacchetto fwbuilder contengono sia l'interfaccia grafica che i moduli per ogni sistema di firewall (questi erano prima suddivisi in vari pacchetti, uno per ogni sistema di destinazione):
#
aptitude install fwbuilder
14.2.4. Installare le regole ad ogni avvio
Se il firewall mira a difendere una connessione di rete PPP intermittente, il modo più semplice di lanciare lo script è di installarlo come /etc/ppp/ip-up.d/0iptables
(da notare che sono presi in considerazione solo i file senza punti nel nome). Il firewall viene in questo modo ricreato ogni volta che si instaura la connessione PPP.
Negli altri casi, si consiglia di posizionare lo script di configurazione in una direttiva up
del file /etc/network/interfaces
. Nel seguente esempio, lo script è memorizzato in /usr/local/etc/arrakis.fw
.
Esempio 14.1. File interfaces
che richiama lo script del firewall
auto eth0
iface eth0 inet static
address 192.168.0.1
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
up /usr/local/etc/arrakis.fw