[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]

215. Firewall secondo la gestione del kernel Linux 2.0.*

Questo capitolo viene conservato solo a sostegno di chi utilizza ancora i kernel Linux 2.0.*, e di conseguenza potrebbe utilizzare ancora il programma ipfwadm.

All'interno di una rete, il firewall è un componente che serve a proteggerne una parte rispetto al resto. Di solito, si tratta di qualcosa che si interpone tra una rete privata e una rete pubblica, come Internet, per evitare un accesso indiscriminato alla rete privata da parte di nodi collocati all'esterno di questa.

Il firewall, a parte il significato letterale del nome, è una sorta di filtro (passivo o attivo) che si interpone al traffico di rete, e che pertanto deve essere regolato opportunamente, in base agli obbiettivi che si intendono raggiungere.

			+----------+          Rete privata da proteggere
- - - ------------------| Firewall |------------*-----------*-------- - - -
Rete pubblica		+----------+		|           |
(Internet)				    +--------+	+--------+
					    |  host  |	|  host  |
					    +--------+	+--------+

Figura 215.1: Il firewall è un filtro che si interpone tra una rete privata e una rete pubblica.

Generalmente, i compiti del firewall vengono svolti da un elaboratore configurato opportunamente, e munito di almeno due interfacce di rete: una per l'accesso alla rete esterna e una per la rete privata.

Questo capitolo, dopo una breve introduzione generale ai concetti legati ai firewall, affronta in dettaglio solo le funzionalità di filtro di pacchetto IP, native del kernel Linux.

215.1 Firewall elementare

Il firewall elementare è un elaboratore con due interfacce di rete, per le quali siano stati definiti gli instradamenti nel modo consueto, ma dove sia stato impedito il transito del traffico tra un'interfaccia e l'altra.

L'utilità di un filtro del genere è minima. Probabilmente si potrebbe utilizzare come server SMTP e come punto di arrivo per i messaggi di posta elettronica, che gli utenti della rete privata potrebbero scaricare attraverso un protocollo come POP3, o IMAP. Inoltre, gli utenti che desiderano accedere alla rete esterna, potrebbero utilizzare Telnet per collegarsi al firewall per poi avviare da lì il programma client adatto all'operazione che vogliono compiere.

Evidentemente, questa non deve essere intesa come una scelta ottimale, anzi, di sicuro si tratta di un approccio sbagliato dal punto di vista della sicurezza, ma serve a rendere l'idea del significato che può avere un firewall.

Volendo, l'inserimento di una cache proxy all'interno del firewall potrebbe permettere agli utenti della rete privata che dispongono di software adatto, di accedere alle risorse della rete esterna (di solito solo con i protocolli HTTP e FTP).

All'estremo opposto, un router è un firewall che consente il transito di tutto il traffico, senza porre alcun limite, né controllo.

215.2 Tipologie fondamentali

Si distinguono due tipi fondamentali di firewall: filtri di pacchetto IP e server proxy.

I filtri di pacchetto IP permettono di bloccare o abilitare selettivamente il traffico che attraversa il firewall, definendo i protocolli (o meglio, il tipo di pacchetto), gli indirizzi IP e le porte utilizzate.

Questo tipo di sistema permette al massimo di controllare i tipi di servizio che possono essere utilizzati in una direzione e nell'altra, da e verso determinati indirizzi IP, ma senza la possibilità di annotare in un registro i collegamenti che sono stati effettuati (salvo eccezioni), né di poter identificare gli utenti che li utilizzano. In un certo senso, questo tipo di firewall è come un router su cui si può solo filtrare i tipi di pacchetto che si vogliono lasciar transitare.

I server proxy rappresentano una sorta di intermediario che si occupa di intrattenere le connessioni per conto di qualcun altro nella rete privata. Per tornare all'esempio del firewall elementare, è come se un utente aprisse una connessione Telnet verso il proxy, e poi da lì utilizzasse un programma client adatto per il tipo di collegamento che intende realizzare al di fuori della sua rete privata.

Dal momento che il proxy ha un ruolo attivo nelle connessioni, può tenere un registro delle azioni compiute, ed eventualmente anche tentare di identificare l'utente che tenta di utilizzarlo.

Per completare il discorso, una cache proxy è qualcosa di simile al server proxy a cui si sta facendo riferimento. La differenza sta essenzialmente nella specializzazione, che nel primo caso è puntata alla gestione di una memoria cache, mentre nel secondo è rivolta alla protezione della rete privata.

215.3 Filtri di pacchetto IP del kernel Linux

Il kernel Linux può gestire direttamente il filtro dei pacchetti IP, cosa che quindi rappresenta la scelta più semplice per la realizzazione di un firewall con questo sistema operativo. A parte le limitazioni che può avere un tale tipo di firewall, il suo inserimento nella rete non genera effetti collaterali particolari, dal momento che poi non c'è bisogno di utilizzare software speciale per i client, come avviene invece nel caso di un firewall proxy.

Trattandosi di un'attività del kernel, è necessario che questo sia stato predisposto in fase di compilazione, oppure sia accompagnato dai moduli necessari.

In aggiunta, è opportuno aggiungere anche le funzionalità seguenti per il controllo dei pacchetti e il mascheramento IP.

È importante osservare che quando si utilizza il sistema del filtro di pacchetto IP, è necessario consentire il transito dei pacchetti attraverso il firewall, abilitando in pratica le funzionalità di forwarding/gatewaying come nel caso di un router normale.

Una volta inserita nel kernel la funzionalità di forwarding/gatewaying, questa può essere controllata attraverso un file del filesystem virtuale /proc/. Per motivi di sicurezza, alcune distribuzioni GNU/Linux sono predisposte in modo da disattivare questa funzionalità attraverso uno dei comandi inseriti nella procedura di inizializzazione del sistema. Per riattivare il forwarding/gatewaying, si può agire nel modo seguente:

echo 1 > /proc/sys/net/ipv4/ip_forward

215.3.1 ipfwadm per l'amministrazione del firewall

La gestione del filtro di pacchetto IP del kernel deve essere regolata in qualche modo, e questo avviene attraverso il programma ipfwadm (IP Firewall Administration). Dal momento che le funzionalità di firewall del kernel sono piuttosto estese, la sintassi di questo programma è molto articolata, e se ne può apprendere l'utilizzo solo gradualmente.

Inoltre, è bene chiarire subito che le funzionalità di firewall del kernel non sono configurabili attraverso un file di configurazione; quindi, al massimo, tutto quello che si può fare è la realizzazione di uno script contenente una serie di comandi con ipfwadm.

ipfwadm interviene su un elenco di regole riferite alle funzionalità di firewall del kernel; un po' come avviene con la tabella degli instradamenti di un router. L'ordine in cui sono elencate tali regole è importante, quindi si deve poter distinguere tra l'inserimento di una regola all'inizio o alla fine dell'elenco esistente.

Salvo eccezioni particolari, che verranno descritte nel contesto opportuno, la sintassi per l'utilizzo di ipfwadm è quella seguente:

ipfwadm <categoria-di-intervento> <comando> <parametri> [<opzioni>]

La categoria di intervento di ipfwadm è rappresentata da una sigla, e serve a stabilire a cosa si riferisce la regola definita attraverso gli argomenti successivi.

215.3.2 Comandi principali per la gestione del firewall

Dopo l'indicazione della categoria di intervento per ipfwadm, deve essere indicato un comando, cioè un tipo di opzione più o meno articolato che stabilisce l'azione da compiere all'interno della regola che viene definita.

Alcuni comandi

-f

Cancella tutte le regole riferite alla categoria di intervento indicata anteriormente.

Se si utilizza il comando -f, non possono essere indicati né parametri, né opzioni, dato il significato che assume l'istruzione.

-l

Emette attraverso lo standard output le regole riferite della categoria di intervento indicata.

Se si utilizza il comando -l, non possono essere indicati dei parametri (a parte la possibilità di utilizzare anche il comando -z, che riguarda però la contabilizzazione dei dati in transito), mentre qualche opzione può essere aggiunta.

-a {accept|deny|reject}

-i {accept|deny|reject}

Inserisce la regola definita dai parametri e dalle opzioni successive, alla fine (-a, append), oppure all'inizio (-i) dell'elenco.

Quando si tratta di una regola di firewall (ovvero, ciò a cui si fa riferimento in queste sezioni), è obbligatoria l'indicazione di una politica rappresentata da una parola chiave: accept, deny o reject. Il significato dovrebbe essere intuitivo: accettare, rifiutare o rigettare i pacchetti che soddisfano la definizione fatta attraverso i parametri successivi.

La differenza tra deny e reject sta nel fatto che, nel primo caso il rifiuto è silenzioso, mentre nel secondo viene generata una segnalazione di errore inviata all'origine del pacchetto.

-d {accept|deny|reject} <parametri>

Permette di eliminare una regola dal gruppo appartenente alla categoria specificata. Per ottenere la sua eliminazione, occorre indicare la stessa politica e gli stessi parametri utilizzati per crearla.

-p {accept|deny|reject}

Serve a definire una politica predefinita, riferita alla categoria selezionata, per tutte le situazioni che non corrispondono ad alcuna regola indicata espressamente.

In generale, se non viene definito diversamente, la politica predefinita è accept, e questo è necessario perché il sistema possa funzionare come router quando non viene stabilito nulla al riguardo del filtro dei pacchetti IP.

215.3.3 Parametri principali

Le opzioni sono gli argomenti di ipfwadm che definiscono la regola, che generalmente si vuole aggiungere. Prima di descrivere la sintassi di questi parametri, è bene chiarire alcune convenzioni che vengono utilizzate.

La definizione di un gruppo di indirizzi IP può essere fatta attraverso l'indicazione di una coppia <numero-IP>/<maschera>, con una barra obliqua di separazione tra i due. La maschera può essere indicata nel modo consueto, oppure con un numero che esprime la quantità di bit iniziali da porre al valore 1. A titolo di esempio, la tabella 215.1 mostra l'equivalenza tra alcune maschere di rete tipiche e questo numero di abbreviazione.

Maschera di rete Abbreviazione Sottorete
255.0.0.0 8 Classe A
255.255.0.0 16 Classe B
255.255.255.0 24 Classe C
255.255.255.255 32 punto-punto

Tabella 215.1: Maschere di rete tipiche per IPv4.

Quando si vuole fare riferimento a indirizzi imprecisati, si utilizza solitamente l'indirizzo 0.0.0.0, che può essere indicato anche in forma simbolica attraverso la parola chiave any. Nello stesso modo il gruppo di indirizzi 0.0.0.0/0, cioè ogni indirizzo, può essere rappresentato nei rapporti (quelli che si ottengono con il comando -l) con la parola chiave anywhere.

Alcune regole possono fare riferimento all'utilizzo di porte, o intervalli di porte particolari (qui si trascura volontariamente il problema dei pacchetti ICMP). Queste porte possono essere espresse attraverso un nome, come definito nel file /etc/services, oppure per numero, cosa che di solito si preferisce per questo tipo di applicazione. Gli intervalli di porte, in particolare, vengono espressi nella forma seguente:

<porta-iniziale>:<porta-finale>

Il kernel è in grado di gestire un numero limitato di regole che contengano riferimenti precisi a porte. Di solito è consentita l'indicazione massima di 10 porte, dove gli intervalli valgono per due.

Alcuni parametri

-P {tcp|udp|icmp|all}

Stabilisce il tipo di protocollo della regola che viene definita. La parola chiave all rappresenta qualsiasi protocollo, ed è l'impostazione predefinita se questo parametro non viene utilizzato.

L'indicazione del protocollo è obbligatoria quando si specificano le porte di un'origine o di una destinazione.

-S <indirizzo>[/<maschera>] [<porta>|<intervallo-di-porte>]...

Permette di definire l'origine dei pacchetti. L'indirizzo viene indicato generalmente in forma numerica, anche se c'è la possibilità di usare un nome di dominio. La maschera, eventuale, serve a indicare un gruppo di indirizzi.

Se questo parametro viene omesso, si intende implicitamente -S 0.0.0.0/0, ovvero -S any/0, che rappresenta tutti gli indirizzi possibili.

-D <indirizzo>[/<maschera>] [<porta>|<intervallo-di-porte>]...

Permette di definire la destinazione dei pacchetti. L'indirizzo viene indicato generalmente in forma numerica, anche se c'è la possibilità di usare un nome di dominio. La maschera, eventuale, serve a indicare un gruppo di indirizzi.

Se questo parametro viene omesso, si intende implicitamente -D 0.0.0.0/0, ovvero -D any/0, che rappresenta tutti gli indirizzi possibili.

-V <indirizzo>

Permette di indicare l'indirizzo dell'interfaccia di rete attraverso la quale sono ricevuti o inviati i pacchetti della regola che si sta definendo.

Se questo parametro viene omesso, si intende implicitamente -V 0.0.0.0, che rappresenta eccezionalmente un qualunque indirizzo.

-W <interfaccia>

Permette di indicare il nome dell'interfaccia di rete attraverso la quale sono ricevuti o inviati i pacchetti della regola che si sta definendo.

Se questo parametro viene omesso, si intende fare riferimento implicitamente a qualunque interfaccia di rete.

215.3.4 Opzioni aggiuntive

Alcune opzioni finali possono essere importanti e vale la pena di conoscerle. È il caso di precisare che, anche se la sintassi indicata da ipfwadm(8) pone queste opzioni alla fine della riga di comando, queste possono apparire dopo i comandi, subito prima dei parametri.

Alcuni opzioni

-e

Questa opzione può essere usata solo in combinazione al comando -l, e permette di ottenere informazioni più dettagliate.

-n

Questa opzione viene usata normalmente assieme al comando -l, e fa in modo che le informazioni su indirizzi e porte siano espresse in forma numerica.

-b

Fa in modo che la regola valga in modo bidirezionale per i pacchetti IP.

-o

Attiva l'annotazione dei pacchetti che corrispondono alla regola, utilizzando il registro del sistema (per la precisione si tratta di messaggi del kernel, che di solito vengono intercettati dal demone klogd che poi li invia al registro del sistema).

215.3.5 Pratica con ipfwadm per la gestione del firewall

Ci sono tre utilizzi tipici di ipfwadm con cui è necessario avere confidenza prima di analizzare degli esempi più sostanziosi: l'elenco delle regole di una determinata categoria, la cancellazione di tutte le regole di una categoria e la definizione della politica predefinita.

ipfwadm -I -l[Invio]

IP firewall input rules, default policy: accept

ipfwadm -O -l[Invio]

IP firewall output rules, default policy: accept

ipfwadm -F -l[Invio]

IP firewall forward rules, default policy: accept

L'esempio mostra l'uso dei comandi necessari a visualizzare le regole delle categorie riferite alla funzionalità di controllo dell'input, dell'output e di attraversamento dei pacchetti IP. Se il kernel è predisposto per la loro gestione e non sono state definite regole di alcun tipo, quello che si vede è il risultato generato da questi comandi. Si osservi in particolare che la politica predefinita è sempre accept.

In generale, quando si predispone uno script con tutte le regole di firewall che si vogliono applicare, si inizia dall'azzeramento di quelle eventualmente esistenti, esattamente nel modo seguente:

#!/bin/sh

/sbin/ipfwadm -I -f
/sbin/ipfwadm -O -f
/sbin/ipfwadm -F -f
#...

Dal momento che le funzionalità di filtro del kernel Linux non devono interferire con quelle di routing, nel caso le prime non siano state definite, è necessario che la politica predefinita sia sempre accept. In generale, se si vuole configurare il proprio elaboratore come firewall, la situazione cambia, e dovrebbe essere conveniente il contrario, in modo da poter controllare la situazione. In pratica, dopo l'azzeramento delle regole delle varie categorie, è solitamente opportuno modificare le politiche predefinite, in modo da bloccare gli accessi e il transito dei pacchetti.

#...
/sbin/ipfwadm -I -p deny
/sbin/ipfwadm -O -p deny
/sbin/ipfwadm -F -p deny
#...

La definizione delle regole di firewall deve tenere conto dell'ordine in cui appaiono nell'elenco gestito all'interno del kernel, quindi, la scelta tra i comandi -a (aggiunta in coda) e -i (inserimento all'inizio) deve essere fatta in modo consapevole. A seconda della propria filosofia personale, si sceglierà probabilmente di utilizzare sempre solo un tipo, oppure l'altro.

Se si sceglie di «aggiungere» le regole, dovrebbe essere conveniente iniziare da quelle di rifiuto o rigetto (deny o reject), per finire con quelle di accettazione (accept).

Se si preferisce lasciare che la politica predefinita sia accept, è importante ricordare di aggiungere alla fine di tutte le regole di una categoria determinata, una regola che impedisca l'accesso in modo generalizzato, come mostrato nell'esempio seguente:

#...
# In coda a tutte le regole
/sbin/ipfwadm -I -a deny -S any/0 -D any/0 -o
/sbin/ipfwadm -O -a deny -S any/0 -D any/0 -o
/sbin/ipfwadm -F -a deny -S any/0 -D any/0 -o

Nell'esempio, è stata usata la parola chiave any, come sinonimo di 0.0.0.0, in modo da rappresentare qualunque indirizzo di origine e di destinazione (0.0.0.0/0). Come si può vedere ancora, è stata aggiunta l'opzione -o in modo da annotare nel registro del sistema i tentativi di accesso o di attraversamento non autorizzati. Questo tipo di strategia, soprattutto in considerazione della possibilità di attivare un controllo nel registro del sistema, può giustificare la scelta di lasciare la politica predefinita originale: accept.

Di solito, per la definizione delle regole di un firewall ci si limita a utilizzare la categoria -F, lasciando libero l'ingresso e l'uscita dei pacchetti (le categorie -I e -O). Infatti, le regole che controllano l'ingresso e l'uscita dei dati potrebbero essere utili per proteggere un nodo che non disponga della protezione di un firewall, oppure si trovi in un ambiente di cui non ci si possa fidare.

Alcuni esempi

/sbin/ipfwadm -F -a deny -S 224.0.0.0/3 -D any/0 -o

Questa regola impedisce il transito di tutti quei pacchetti che provengono da un'origine in cui l'indirizzo IP sia composto in modo da avere i prime tre bit a 1. Infatti, 224 si traduce nel numero binario 11100000, e questo esclude tutta la classe D e la classe E degli indirizzi IPv4. Si osservi l'aggiunta dell'opzione -o per ottenere l'annotazione nel registro dei tentativi di attraversamento.

Segue la visualizzazione della regola attraverso ipfwadm --l.

type  prot source               destination          ports
deny  all  224.0.0.0/3          anywhere             n/a

/sbin/ipfwadm -F -a deny -S 224.0.0.0/3 -o

Questo esempio è esattamente identico a quello precedente, perché la destinazione predefinita è proprio quella riferita a qualunque indirizzo.

/sbin/ipfwadm -F -a accept -P tcp -S 192.168.1.0/24 -D any/0 23

Consente ai pacchetti TCP provenienti dalla rete 192.168.1.0/255.255.255.0 di attraversare il firewall per raggiungere qualunque indirizzo, ma alla porta 23. In pratica concede di raggiungere un servizio Telnet.

Segue la visualizzazione della regola attraverso ipfwadm --l.

type  prot source               destination          ports
acc   tcp  192.168.1.0/24       anywhere             any -> telnet

---------

/sbin/ipfwadm -F -a deny -P tcp -S any/0 6000:6009 -D any/0 -o
/sbin/ipfwadm -F -a deny -P tcp -S any/0 -D any/0 6000:6009 -o

Blocca il transito delle comunicazioni riferite alla gestione remota di applicazioni per X. In questo caso, si presume di poter avere a che fare con sistemi che gestiscono fino a 10 server grafici contemporaneamente.

/sbin/ipfwadm -I -a deny -P tcp -S any/0 6000:6009 -D any/0 -o
/sbin/ipfwadm -O -a deny -P tcp -S any/0 -D any/0 6000:6009 -o

Blocca l'ingresso e l'uscita di comunicazioni riferite alla gestione remota di applicazioni per X. Questo potrebbe essere utile per proteggere un sistema che non si avvale di un firewall o che semplicemente non si fida della rete circostante.

215.3.5.1 Esempi raccolti da altri documenti

Nel documento Linux NET-3-HOWTO, Linux Networking di Terry Dawson (precisamente nella versione 1.2 del 1997), appare l'esempio di un firewall/router con lo scopo di proteggere una rete privata con indirizzi 172.16.37.0/255.255.255.0, come mostrato dalla figura 215.2.

-                                   -
 \                                  | 172.16.37.0
  \                                 |   /255.255.255.0
   \                 ---------      |
    |  172.16.174.30 | Linux |      |
NET =================|  f/w  |------|    ..37.19
    |    PPP         | router|      |  --------
   /                 ---------      |--| Mail |
  /                                 |  | /DNS |
 /                                  |  --------
-                                   -

Figura 215.2: Esempio tratto dal NET-3-HOWTO.

Segue lo script abbinato all'immagine di questa figura.

#!/bin/sh

# Flush the 'Forwarding' rules table
# Change the default policy to 'accept'
#
/sbin/ipfwadm -F -f
/sbin/ipfwadm -F -p accept
#
# .. and for 'Incoming'
#
/sbin/ipfwadm -I -f
/sbin/ipfwadm -I -p accept

# First off, seal off the PPP interface
# I'd love to use '-a deny' instead of '-a reject -y' but then it
# would be impossible to originate connections on that interface too.
# The -o causes all rejected datagrams to be logged. This trades
# disk space against knowledge of an attack of configuration error.
#
/sbin/ipfwadm -I -a reject -y -o -P tcp -S 0/0 -D 172.16.174.30

# Throw away certain kinds of obviously forged packets right away:
# Nothing should come from multicast/anycast/broadcast addresses
#
/sbin/ipfwadm -F -a deny -o -S 224.0/3 -D 172.16.37.0/24
#
# and nothing coming from the loopback network should ever be
# seen on a wire
#
/sbin/ipfwadm -F -a deny -o -S 127.0/8 -D 172.16.37.0/24

# accept incoming SMTP and DNS connections, but only
# to the Mail/Name Server
#
/sbin/ipfwadm -F -a accept -P tcp -S 0/0 -D 172.16.37.19 25 53
#
# DNS uses UDP as well as TCP, so allow that too
# for questions to our name server
#
/sbin/ipfwadm -F -a accept -P udp -S 0/0 -D 172.16.37.19 53
#
# but not "answers" coming to dangerous ports like NFS and
# Larry McVoy's NFS extension.  If you run squid, add its port here.
#
/sbin/ipfwadm -F -a deny -o -P udp -S 0/0 53 \
	-D 172.16.37.0/24 2049 2050

# answers to other user ports are okay
#
/sbin/ipfwadm -F -a accept -P udp -S 0/0 53 \
	-D 172.16.37.0/24 53 1024:65535

# Reject incoming connections to identd
# We use 'reject' here so that the connecting host is told
# straight away not to bother continuing, otherwise we'd experience
# delays while ident timed out.
#
/sbin/ipfwadm -F -a reject -o -P tcp -S 0/0 -D 172.16.37.0/24 113

# Accept some common service connections from the 192.168.64 and
# 192.168.65 networks, they are friends that we trust.
#
/sbin/ipfwadm -F -a accept -P tcp -S 192.168.64.0/23 \
	-D 172.16.37.0/24 20:23

# accept and pass through anything originating inside
#
/sbin/ipfwadm -F -a accept -P tcp -S 172.16.37.0/24 -D 0/0

# deny most other incoming TCP connections and log them
# (append 1:1023 if you have problems with ftp not working)
#
/sbin/ipfwadm -F -a deny -o -y -P tcp -S 0/0 -D 172.16.37.0/24

# ... for UDP too
#
/sbin/ipfwadm -F -a deny -o -P udp -S 0/0 -D 172.16.37.0/24

Un altro esempio interessante si trova nel Firewalling and Proxy Server HOWTO di Mark Grennan (versione 0.4 del 1996), dove appare uno script pensato per un firewall/router che ha lo scopo di proteggere una rete privata con indirizzi 196.1.2.0/255.255.255.0. Quello che viene mostrato di seguito è stato modificato, per eliminare alcuni errori evidenti.

#!/bin/sh
#
# setup IP packet Accounting and Forwarding
#
#   Forwarding
#
# By default DENY all services
ipfwadm -F -p deny
# Flush all commands
ipfwadm -F -f
ipfwadm -I -f
ipfwadm -O -f

# Forward email to your server
ipfwadm -F -a accept -b -P tcp -S 0.0.0.0/0 1024:65535 -D 196.1.2.10 25

# Forward email connections to outside email servers
ipfwadm -F -a accept -b -P tcp -S 196.1.2.10 25 -D 0.0.0.0/0 1024:65535

# Forward Web connections to your Web Server
/sbin/ipfwadm -F -a accept -b -P tcp -S 0.0.0.0/0 1024:65535 -D 196.1.2.11 80

# Forward Web connections to outside Web Server
/sbin/ipfwadm -F -a accept -b -P tcp -S 196.1.2.0/24 80 -D 0.0.0.0/0 1024:65535

# Forward DNS traffic
/sbin/ipfwadm -F -a accept -b -P udp -S 0.0.0.0/0 53 -D 196.1.2.0/24

215.4 Mascheramento IP

Il kernel Linux, assieme alla gestione del filtro dei pacchetti IP può occuparsi anche del mascheramento IP, cosa che consente di collegare una rete privata con indirizzi IP esclusi dalla rete pubblica, all'esterno.

A parte l'utilizzo comune che se ne fa di solito, il mascheramento IP fa in modo che, all'esterno della rete mascherata, appaia che l'origine dei pacchetti sia sempre il firewall. Fortunatamente, il firewall è poi in grado di distinguere quali siano stati i nodi (mascherati) che hanno originato la connessione, girando a loro i pacchetti di loro competenza.

			+---------------+
			|    Firewall   |          Rete privata mascherata
- - - ------------------| mascheramento |-------*-----------*-------- - - -
Rete pubblica		|      IP       |	|           |
(Internet)		+---------------+   +--------+	+--------+
					    |  host  |	|  host  |
					    +--------+	+--------+

Figura 215.3: Il firewall per il mascheramento IP.

In linea di principio, i nodi collocati nella rete privata mascherata, sono in grado di accedere all'esterno, per mezzo del firewall che offre il mascheramento degli indirizzi, mentre dall'esterno potrebbe mancare l'instradamento verso tali nodi. In effetti, quando la rete privata mascherata utilizza indirizzi IP esclusi dalla rete pubblica, tale instradamento (dall'esterno verso l'interno) non può esistere.

L'attivazione nel kernel delle funzionalità di mascheramento richiede prima di tutto che siano state attivate quelle di firewall, nello stesso modo già visto nella sezioni dedicate al filtro di pacchetto IP, dove in particolare sia stata poi aggiunta anche quella di mascheramento (come era stato già suggerito a suo tempo).

215.4.1 ipfwadm per l'amministrazione del mascheramento

La gestione del mascheramento IP del kernel è un'estensione di quella del filtro di pacchetto IP, e deve essere attivata espressamente attraverso ipfwadm, utilizzando la categoria -F (forward), assieme a una politica di accettazione (accept) con l'aggiunta dell'indicazione che si tratta di mascheramento.

Per ottenere questo, si possono usare due modi equivalenti: l'indicazione di una politica denominata masquerade (abbreviata frequentemente con m), che implica la politica accept, oppure l'aggiunta dell'opzione -m. La cosa si potrebbe rappresentare schematicamente attraverso gli schemi sintattici seguenti.

ipfwadm -F {-i|-a|-d} {m|masquerade} <parametri> [<opzioni>]

ipfwadm -F {-i|-a|-d} accept <parametri> -m [<altre-opzioni>]

Ricapitolando quindi, il mascheramento si ottiene definendo una regola di inoltro (forward), in cui si stato attivato il mascheramento dell'origine nei confronti della destinazione.

215.4.2 Mascheramento in pratica

In generale, il mascheramento IP si utilizza per consentire a una rete privata, che utilizza indirizzi IP esclusi da Internet, di accedere all'esterno. In questa situazione potrebbe essere sensata ugualmente una strategia di difesa attraverso le funzionalità di filtro già discusse nelle sezioni dedicate a questo argomento, perché dall'esterno, qualcuno potrebbe creare un proprio instradamento verso la rete privata.

In ogni caso, la situazione comune per il mascheramento IP è quella dello schema che appare in figura 215.4. L'interfaccia di rete del firewall connessa alla rete privata deve avere un indirizzo IP che appartenga a tale spazio, e inoltre deve essere stato previsto un instradamento corretto. L'altra interfaccia, quella rivolta verso la rete pubblica, avrà un indirizzo IP pubblico, e l'instradamento dovrà essere quello predefinito.

			+---------------+          192.168.1.0
			|    Firewall   |          Rete privata mascherata
- - - ------------------| mascheramento |-------*-----------*-------- - - -
Rete pubblica		|      IP       |	|           |
(Internet)		+---------------+   +--------+	+--------+
					    |  host  |	|  host  |
					    +--------+	+--------+

Figura 215.4: Il firewall per il mascheramento IP.

In questa situazione, la regola che consente alla rete privata di raggiungere l'esterno può essere definita con uno dei tre comandi seguenti (che in pratica sono identici).

/sbin/ipfwadm -F -a masquerade -S 192.168.1.0/24 -D any/0

/sbin/ipfwadm -F -a m -S 192.168.1.0/24 -D any/0

/sbin/ipfwadm -F -a accept -S 192.168.1.0/24 -D any/0 -m

Visualizzando la regola attraverso ipfwadm --l, si ottiene l'informazione seguente, dove si deve osservare che il tipo è indicato come acc/m, ovvero: accept/masquerade.

type  prot source               destination          ports
acc/m all  192.168.1.0/24       anywhere             n/a

Si è accennato al fatto che non si può escludere che qualcuno voglia provare a definire un proprio instradamento verso la rete privata che in condizioni normali dovrebbe essere irraggiungibile dall'esterno. Per questo, conviene escludere esplicitamente il traffico nella direzione opposta, oppure semplicemente definire che la politica predefinita del firewall deve essere deny.

#!/bin/sh
/sbin/ipfwadm -F -p deny
/sbin/ipfwadm -F -a masquerade -S 192.168.1.0/24 -D any/0

215.5 Proxy trasparente

Il proxy trasparente, o transparent proxy, è una funzionalità attraverso la quale si fa in modo di ridirigere il traffico verso il nodo locale, quando altrimenti sarebbe diretto verso altre macchine, a porte determinate.

Il kernel Linux fornisce questa funzionalità come estensione di quelle di filtro dei pacchetti IP; ma per farlo deve essere aggiunta esplicitamente la gestione di questa caratteristica.

Queste sezioni trattano il problema del proxy trasparente solo in modo informativo, dal momento che si tratta di una funzionalità ancora sperimentale e probabilmente non funzionante.

215.5.1 ipfwadm per il proxy trasparente

La ridirezione attraverso cui si ottiene il proxy trasparente, si definisce esclusivamente con la categoria -I, specificando una porta di ridirezione con l'opzione -r.

La sintassi di ipfwadm per questo scopo si traduce nello schema seguente:

ipfwadm -I {-i|-a|-d} accept -P <protocollo> -S <origine> -D <destinazione> <porte> -r <porta-locale>

Quello che si ottiene è che il traffico proveniente dagli indirizzi previsti, diretto verso le destinazioni indicate, complete dell'informazione sulle porte, viene ridiretto alla porta indicata dall'opzione -r nel nodo locale.

215.5.2 Proxy trasparente in pratica

Un proxy trasparente può funzionare solo se il traffico relativo deve attraversarlo per forza. Pertanto, si può attivare questa funzionalità solo in un router, che eventualmente può fungere sia da firewall che da filtro per il mascheramento IP. Di conseguenza, il proxy per il quale il servizio viene avviato, deve risiedere fisicamente nello stesso elaboratore che svolge il ruolo di router o di firewall.

			+---------------+
			|     Proxy     |          Rete privata mascherata
- - - ------------------|  trasparente  |-------*-----------*-------- - - -
Rete esterna 		|               |	|           |
        		+---------------+   +--------+	+--------+
					    |  host  |	|  host  |
					    +--------+	+--------+

Figura 215.5: Il proxy trasparente deve essere attraversato dal traffico che poi lì può essere ridiretto verso il proxy locale.

Lo scopo del proxy trasparente può essere semplicemente quello di «obbligare» a utilizzare una memoria cache proxy, senza importunare gli utenti pretendendo da loro che configurino i loro applicativi per questo, oppure può essere il modo attraverso cui si definisce un firewall proxy, impedendo l'attraversamento del proxy per mezzo del filtro di pacchetto IP.

A titolo di esempio viene mostrato in che modo si potrebbe ridirigere il traffico di una rete locale con indirizzi 192.168.1.0/24, quando questo è rivolto alla porta 80, cioè a un servizio HTTP, verso la porta locale 8080 (tipica di una cache proxy).

/sbin/ipfwadm -I -a accept -p tcp -S 192.168.1.0/24 -D any/0 80 -r 8080

Visualizzando la regola attraverso ipfwadm --l, si ottiene l'informazione seguente, dove si deve osservare che il tipo è indicato come acc/r, dove la lettera r segnala appunto la ridirezione.

type  prot source               destination          ports
acc/r tcp  192.168.0.0/24       anywhere             any -> http => 8080

215.6 Contabilizzazione del traffico

Il kernel Linux, assieme alla gestione del filtro dei pacchetti IP può anche tenere la «contabilità» del traffico. Si tratta semplicemente di definire una serie di contatori per il traffico in entrata o in uscita, da o verso indirizzi determinati. Il conteggio prosegue fino all'azzeramento successivo.

Per sfruttare questa funzionalità è necessario che il kernel sia stato predisposto opportunamente.

La contabilità del traffico non è un'attività esclusiva di un elaboratore che ricopra il ruolo di firewall, però, un firewall, o più semplicemente un router, è il luogo migliore per gestirla.

215.6.1 ipfwadm per la contabilità del traffico IP

Per definire i contatori che si vogliono avere in riferimento al traffico, si utilizza ipfwadm specificando la categoria -A (Accounting). Con questa categoria possono essere usati comandi e opzioni simili a quelli descritti per le funzionalità di firewall, ma non perfettamente uguali. La sintassi generale cambia nel modo seguente:

ipfwadm -A [in|out|both] <comando> <parametri> [<opzioni>]

Come si può osservare, la categoria -A richiede un argomento composto da una parola chiave che definisce la direzione del traffico: in, ingresso; out, uscita; both, entrambe. Se tale direzione non viene specificata, si intende implicitamente che sia stata usata la parola chiave both (entrambe).

215.6.2 Comandi principali per la gestione della contabilità del traffico

I comandi, cioè le opzioni che seguono immediatamente la categoria -A, hanno delle differenze importanti rispetto alla sintassi relativa alla gestione del firewall.

Alcuni comandi

-f

Cancella tutte le regole riferite alla categoria di intervento indicata anteriormente (in questo caso si tratta delle regole di contabilizzazione del traffico).

-l

Emette attraverso lo standard output le regole di definizione dei contatori, con i valori che tali contatori hanno raggiunto nel frattempo.

-z

Azzera tutti i conteggi. Si può usare anche assieme a -l, e in tal caso si ottiene la visualizzazione dei valori raggiunti, e subito dopo l'azzeramento.

-a

-i

Inserisce la regola di conteggio alla fine (-a, append), oppure all'inizio (-i) dell'elenco.

-d <parametri>

Permette di eliminare una regola dal gruppo appartenente alla categoria specificata. Per ottenere la sua eliminazione, occorre indicare gli stessi parametri utilizzati per crearla.

215.6.3 Contabilità del traffico in pratica

In generale, come è già stato mostrato in riferimento all'utilizzo di ipfwadm, quando si realizza uno script per la definizione di contatori di traffico, si inizia con l'azzeramento delle regole riferite a questa funzione.

#!/bin/sh
#...
/sbin/ipfwadm -A -f

Le regole di definizione dei contatori possono essere più o meno precise, a seconda dell'esigenza. La regola più vaga è quella seguente, in cui si misura tutto il traffico (compreso quello dell'interfaccia di loopback) senza distinguere se questo è in ingresso o in uscita.

/sbin/ipfwadm -A both -a

Visualizzando la regola attraverso il comando ipfwadm --l, si ottiene qualcosa simile a quello che segue.

IP accounting rules
 pkts bytes dir prot source               destination          ports
    4   280 i/o all  anywhere             anywhere             n/a

In questo caso, si può osservare che c'è stato un po' di traffico (veramente minimo), dal momento che sono transitati 280 byte in 4 pacchetti.

È evidente che la contabilizzazione del traffico è utile se può dare qualche indicazione in più. L'esempio seguente serve a misurare in modo distinto il traffico in ingresso e in uscita dall'interfaccia eth0.

/sbin/ipfwadm -A in -a -W eth0
/sbin/ipfwadm -A out -a -W eth0

In questo caso, per visualizzare le regole è necessario il comando ipfwadm ---e, altrimenti non si può notare che si fa riferimento a un'interfaccia precisa.

IP accounting rules
 pkts bytes dir prot opt  ifname  ifaddress  source    destination  ports
    6   348 in  all  ---- eth0    any        anywhere  anywhere     n/a
    5   447 out all  ---- eth0    any        anywhere  anywhere     n/a

L'esempio seguente mostra in che modo potrebbe essere controllato il traffico intrattenuto con un gruppo di nodi particolare. Si suppone si tratti della sottorete 192.168.1.0/24.

/sbin/ipfwadm -A in -a -S 192.168.1.0/24
/sbin/ipfwadm -A out -a -D 192.168.1.0/24

Il risultato di queste regole potrebbe essere il seguente:

IP accounting rules
 pkts bytes dir prot source               destination          ports
   22  2346 in  all  192.168.1.0/24       anywhere             n/a
   25  2598 out all  anywhere             192.168.1.0/24       n/a

Tuttavia, se l'elaboratore in cui si predispone la contabilizzazione del traffico fosse il router, o il firewall della rete dell'esempio precedente, potrebbe essere più interessante sapere qual è il traffico che transita effettivamente verso l'esterno o dall'esterno. Se si usassero le regole viste nell'esempio precedente, verrebbe considerato anche il traffico locale intrattenuto con tale elaboratore.

/sbin/ipfwadm -A out -a -S 192.168.1.0/24 -W eth1
/sbin/ipfwadm -A in -a -D 192.168.1.0/24 -W eth1

Questo esempio inverte la direzione in/out, proprio per misurare il traffico uscente (verso l'esterno) che proviene dalla rete locale, e quello entrante (dall'esterno) che sia diretto verso la rete locale. Tuttavia, per fare in modo che funzioni in modo corretto, è stato necessario specificare anche l'interfaccia a cui fare riferimento.

Infine, è possibile misurare anche il traffico sulle porte. L'esempio seguente cerca di misurare il traffico TCP complessivo verso l'indirizzo 192.168.1.1 (corrispondente al nodo locale), per la porta 8080 (cache proxy).

/sbin/ipfwadm -A both -a -P tcp -D 192.168.1.1 8080

Il risultato di questa regola potrebbe essere il seguente:

IP accounting rules
 pkts bytes dir prot source               destination          ports
   60  6072 i/o tcp  anywhere             192.168.1.1          any -> 8080

215.7 Riferimenti

---------------------------

Appunti Linux 1999.09.21 --- Copyright © 1997-1999 Daniele Giacomini --  daniele @ pluto.linux.it


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]