Kernel Linux 2.2: firewall e mascheramento IP

Le funzionalità di firewall e di mascheramento IP, essendo incorporate nel kernel, devono essere abilitate prima della compilazione (sezione 29.2.9).

È 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 inoltro dei pacchetti (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 file system virtuale /proc/. Generalmente, tale funzionalità viene disabilitata espressamente, per motivi di sicurezza, dalla procedura di inizializzazione del sistema. Per riattivare l'inoltro tra le interfacce di rete, si può agire nel modo seguente:

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

180.1 Schema generale di funzionamento del kernel
Gli elementi del kernel che si occupano delle funzionalità di filtro IP sono definite IP chain. Si distinguono tre punti di controllo (chain): uno in ingresso, uno di inoltro e uno in uscita. A seconda delle circostanze, un pacchetto IP può essere sottoposto alla verifica di uno o più di questi punti di controllo, che vengono programmati in base a delle regole. Quando un pacchetto sottoposto a controllo corrisponde a una regola, la sua sorte viene definita dall'obiettivo di questa (ammesso che sia stato definito).

Figura 180.1. Schema dei punti di controllo della gestione del kernel Linux 2.2.*.

.-------------. .-------------. .-------------.
| Ingresso | | Inoltro | | Uscita |
| | | | | |
| Regole per | | Regole per | | Regole per |
| l'ingresso | | l'attraver- | | l'uscita |
| dei | | samento dei | | dei |
| pacchetti | | pacchetti | | pacchetti |
| | | | | |
| | | | | |
| Politica | | Politica | | Politica |
| predefinita | | predefinita | | predefinita |
`-------------' `-------------' `-------------'

Un pacchetto proveniente da un'interfaccia qualunque, diretto allo stesso firewall o passante per questo, è soggetto al controllo di ingresso; un pacchetto passante, dopo il controllo di ingresso viene sottoposto al controllo di inoltro; un pacchetto che deve uscire attraverso un'interfaccia del firewall è sottoposto al controllo di uscita. In pratica, i pacchetti che devono attraversare il firewall sono sottoposti a tutti i punti di controllo in questa sequenza.

Quando un pacchetto IP è sottoposto al vaglio di un punto di controllo e all'interno di questo non c'è alcuna regola che lo prenda in considerazione, la sua sorte è stabilita dalla politica predefinita (policy) per quel filtro. Generalmente, questa politica è tale per cui gli viene concesso il transito.

180.2 ipchains per l'amministrazione del firewall
La gestione del filtro di pacchetto IP del kernel deve essere regolata in qualche modo, cosa che avviene attraverso il programma ipchains. 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.

ipchains 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, alla fine o in un'altra posizione dell'elenco esistente.

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

ipchains opzione_di_comando punto_di_controllo [regola] [obiettivo]

L'opzione di comando serve a stabilire il tipo di intervento nel sistema di gestione del firewall. L'elenco seguente si riferisce alle opzioni che permettono la cancellazione o l'inserimento delle regole in un punto di controllo:

-F | --flush

elimina tutte le regole del punto di controllo specificato;

-D | --delete

elimina una o più regole dal punto di controllo specificato;

-A | --append

aggiunge una regola in coda a quelle del punto di controllo selezionato;

-I | --insert

inserisce una regola in una posizione stabilita del punto di controllo selezionato;

-R | --replace

sostituisce una regola del punto di controllo selezionato.

Altre opzioni non modificano le regole; in particolare:

-L | --list

elenca le regole di un uno o di tutti i punti di controllo;

-P | --policy

cambia la politica predefinita per il punto di controllo specificato;

Altre opzioni verranno mostrate quando sarà più opportuno.

Il punto di controllo viene indicato attraverso un nome. Si tratta di input, forward e output, che intuitivamente fanno riferimento all'ingresso, all'inoltro e all'uscita.

Il programma ipchains permette di gestire delle regole all'interno di contenitori aggiuntivi a cui si fa riferimento a partire da regole inserite nei punti di controllo normali. Nella terminologia di ipchains si parla sempre di chain, sia per indicare i punti di controllo, sia per indicare questi elenchi di regole aggiuntive.

Infine, una regola comune è conclusa con l'indicazione di un obiettivo. L'obiettivo è la definizione della sorte da dare al pacchetto intercettato, indicata attraverso una parola chiave. Le più importanti per iniziare ad apprendere la configurazione del firewall sono: ACCEPT, DENY e REJECT.

ACCEPT

consente il transito del pacchetto;

DENY

impedisce il transito del pacchetto, limitandosi a ignorarlo;

REJECT

impedisce il transito del pacchetto notificando all'origine il rifiuto (viene inviato un messaggio ICMP specificante che il pacchetto è stato rifiutato).

Esempi
ipchains -A input regola -j DENY

Lo schema mostra l'aggiunta di una regola di ingresso, non meglio definita, per la quale viene applicato l'obiettivo DENY.

ipchains -R input 1 regola -j DENY

Lo schema mostra la sostituzione della prima regola di ingresso con un'altra regola non meglio definita, per la quale viene applicato l'obiettivo DENY.

ipchains -I input 1 regola -j ACCEPT

Lo schema mostra l'inserimento nella prima posizione di una regola di ingresso per la quale viene consentito il transito dei pacchetti (ACCEPT).

# ipchains -D input 2

Questo comando elimina la seconda regola di ingresso.

# ipchains -F input

Questo comando elimina tutte le regole di ingresso.

# ipchains -F

Questo comando elimina tutte le regole di tutti i punti di controllo.

# ipchains -P input DENY

Cambia la politica predefinita di ingresso specificando che, in mancanza di regole, i pacchetti devono essere bloccati.

180.2.1 Opzioni di contorno
Prima di affrontare l'analisi delle regole che possono essere inserite nei punti di controllo del firewall, è meglio descrivere subito l'utilizzo di alcune opzioni di contorno che hanno un'importanza minore, oppure che si possono utilizzare indipendentemente dal tipo di protocollo a cui si fa riferimento con una regola.

Opzioni
-v | --verbose

Questa opzione si utilizza generalmente assieme all'opzione di comando -L, allo scopo di rendere più dettagliata l'informazione che si ottiene.

-n | --numeric

Quando ipchains viene usato per ottenere delle informazioni, con questa opzione si fa in modo che gli indirizzi numerici non siano convertiti in nomi. Ciò può essere utile per evitare l'attesa di una risoluzione da parte del sistema DNS che potrebbe essere inaccessibile.

-p [!] {tcp|udp|icmp|all}

--protocol [!] {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 non viene specificato. Le parole chiave che identificano i protocolli possono essere espresse anche attraverso lettere maiuscole. Il punto esclamativo, se utilizzato, serve a fare riferimento a tutti i protocolli fuorché quello indicato.

-l | --log

Questa è un'opzione che si utilizza nella dichiarazione di una regola e serve a richiedere l'annotazione nel registro del sistema di ogni pacchetto che corrisponda alla regola stessa. È evidente che si tratta di una possibilità da usare per compiere delle verifiche solo quando ne esiste la necessità.

-i [!] interfaccia

--interface [!] interfaccia

Questa è un'opzione che si utilizza nella dichiarazione di una regola e serve a indicare il nome dell'interfaccia di rete attraverso la quale sono ricevuti o inviati i pacchetti della regola che si sta definendo. Quando questa opzione non viene usata, si intende fare riferimento implicitamente a qualunque interfaccia di rete.

-j obiettivo

--jump obiettivo

Questa è un'opzione che si utilizza nella dichiarazione di una regola e serve a definire l'obiettivo, attraverso una parola chiave tra quelle consuete, oppure il riferimento a un gruppo di regole creato a parte.

Esempi
# ipchains -L input -v

Elenca le regole di ingresso in modo dettagliato.

# ipchains -L output -n

Elenca le regole di uscita senza tradurre gli indirizzi in nomi.

ipchains -A punto_di_controllo regola -l -j DENY

Lo schema mostra l'indicazione di una regola non meglio definita, con la quale di vogliono intercettare dei pacchetti da bloccare (l'obiettivo è DENY). Questi pacchetti, anche se vengono bloccati, sono annotati nel registro del sistema.

ipchains -A punto_fi_controllo regola -i eth0 -j DENY

Lo schema mostra l'aggiunta in coda di una regola non meglio identificata, nella quale viene specificato in particolare che deve riferirsi al traffico entrante o uscente dall'interfaccia eth0. Per i pacchetti che vengono intercettati dalla regola, viene applicato l'obiettivo DENY.

ipchains -A punto_di_controllo -p tcp regola -i eth0 -j DENY

Lo schema mostra l'aggiunta in coda di una regola non meglio identificata, nella quale viene specificato in particolare che deve riferirsi al traffico TCP entrante o uscente dall'interfaccia eth0. Per i pacchetti che vengono intercettati dalla regola, viene applicato l'obiettivo DENY.

ipchains -A punto_di_controllo -p ! tcp regola -i ! eth0 -j DENY

Lo schema mostra l'aggiunta in coda di una regola non meglio identificata, nella quale viene specificato in particolare che deve riferirsi a tutto il traffico che non sia TCP, entrante o uscente da un'interfaccia qualunque purché non sia eth0. Per i pacchetti che vengono intercettati dalla regola, viene applicato l'obiettivo DENY.

180.2.2 Regole che non fanno riferimento a un protocollo
Le regole che non indicano un protocollo particolare possono servire esclusivamente a individuare il traffico riferito a un'origine e a una destinazione, con l'indicazione eventuale dell'interfaccia:

[-p all] [-s [!] origine] [-d [!] destinazione] [-i interfaccia]

Come si vede dallo schema, si possono utilizzare le opzioni -s e -d per indicare rispettivamente l'origine e la destinazione di un pacchetto. In aggiunta, si potrebbe inserire l'indicazione di una certa interfaccia attraverso cui i pacchetti vengono ricevuti o trasmessi; inoltre, volendo indicare espressamente che non si fa riferimento a un protocollo particolare, si può aggiungere l'opzione -p con l'argomento all.

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 uno.

Quando si vuole fare riferimento a indirizzi imprecisati, si utilizza solitamente l'indirizzo 0.0.0.0, che può essere indicato anche con un solo zero; questo si abbina di solito alla maschera nulla: 0.0.0.0/0 o 0/0. Tuttavia, per fare riferimento a qualunque indirizzo, è sufficiente omettere la sua indicazione, in pratica basta fare a meno di indicare l'opzione -s o -d.

L'indicazione di un indirizzo può essere fatta utilizzando direttamente il nome di dominio corrispondente, ma questo richiede la disponibilità di un servizio DNS; ciò può essere conveniente quando si tratta di un firewall connesso stabilmente con la rete esterna, altrimenti si creerebbero delle attese inutili e fastidiose, nel tentativo di risolvere dei nomi che non sono di competenza delle zone locali. Pertanto, in generale è preferibile indicare indirizzi in forma numerica.

Il punto esclamativo che può essere inserito facoltativamente di fronte all'indicazione di un indirizzo IP, o di un gruppo di indirizzi, rappresenta la negazione logica e serve a fare riferimento al gruppo di indirizzi complementare.

Rappresentazione dell'origine e della destinazione
-s [!] indirizzo[/maschera]

--source [!] indirizzo[/maschera]

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 0/0, che rappresenta tutti gli indirizzi possibili.

-d [!] indirizzo[/maschera]

--destination [!] indirizzo[/maschera]

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 0/0, che rappresenta tutti gli indirizzi possibili.

Esempi
# ipchains -A input -s 192.168.100.0/24 -j DENY

Blocca tutto il traffico in ingresso proveniente dalla rete 192.168.100.*.

# ipchains -A input -s 192.168.100.0/24 -d 0/0 -j DENY

Esattamente come nell'esempio precedente.

# ipchains -A input -s 192.168.100.0/24 -d 0/0 -i eth0 -j DENY

Come nell'esempio precedente, specificando però che questo traffico in ingresso deve provenire dall'interfaccia eth0 (se provenisse da un'altra interfaccia, non verrebbe intercettato da questa regola).

# ipchains -A input -d 192.168.100.0/24 -j DENY

Blocca tutto il traffico in ingresso che risulta destinato alla rete 192.168.100.*.

# ipchains -A input -s 0/0 -d 192.168.100.0/24 -j DENY

Esattamente come nell'esempio precedente.

# ipchains -A input -s 0/0 -d ! 192.168.100.0/24 -j DENY

Blocca tutto il traffico in ingresso che risulta destinato a indirizzi diversi dalla rete 192.168.100.*.

# ipchains -A output -d 192.168.100.0/24 -j DENY

Blocca tutto il traffico in uscita che risulta destinato alla rete 192.168.100.*. Rispetto all'applicazione di questa regola nel punto di controllo di ingresso, in questo caso si impedisce anche al firewall stesso di accedere a questi indirizzi.

180.2.3 Regole per i protocolli TCP e UDP
Il modo con cui si possono definire le regole necessarie a individuare i pacchetti, dipendono dal tipo di protocollo utilizzato. Generalmente si è interessati maggiormente a controllare i protocolli TCP e UDP, che hanno in comune l'utilizzo delle porte.

Dovendo fare riferimento a un protocollo TCP o UDP si utilizza l'opzione -p, seguita dalla parola chiave tcp o udp. Dal momento che i protocolli TCP e UDP utilizzano le porte, l'origine e la destinazione possono includere questa informazione.

Le porte possono essere indicate in modo preciso (una soltanto), oppure attraverso un intervallo. Queste porte possono essere espresse attraverso un nome, come definito nel file /etc/services, oppure per numero, cosa che di solito si preferisce per evitare ambiguità o malintesi. Gli intervalli di porte, in particolare, vengono espressi nella forma seguente:

porta_iniziale:porta_finale

Se si indica un intervallo, che si determina per la presenza dei due punti, se manca l'indicazione della porta iniziale si intende in modo predefinito la numero zero, se invece manca quella finale si intende la porta 65 535. Come nel caso degli indirizzi IP, l'indicazione della porta o dell'intervallo di queste può essere preceduta dal punto esclamativo in qualità di negazione logica.

Opzioni per i protocolli TCP e UDP
-s [!] indirizzo[/maschera] [!] [porta|intervallo_di_porte]

--source [!] indirizzo[/maschera] [!] [porta|intervallo_di_porte]

-d [!] indirizzo[/maschera] [!] [porta|intervallo_di_porte]

--destination [!] indirizzo[/maschera] [!] [porta|intervallo_di_porte]

Con i protocolli TCP e UDP, l'origine e la destinazione possono includere l'indicazione delle porte.

[!] -y | [!] --syn

All'interno di una regola, fa in modo di identificare solo i pacchetti del protocollo TCP che hanno il bit SYN attivato, assieme ai bit ACK e FIN azzerati. Questo serve a isolare i pacchetti che nel protocollo TCP richiedono l'inizializzazione della connessione. In pratica, si tratta di un modo alternativo per bloccare una connessione TCP in un solo verso. Se si usa il punto esclamativo di negazione si intende fare riferimento a pacchetti diversi dal tipo SYN.

Esempi
# ipchains -A input -p tcp -s ! 192.168.0.0/16 <-'
`->-d 192.168.0.0/16 80 -j REJECT

Impedisce l'accesso ai servizi HTTP (protocollo TCP, porta 80) della rete 192.168.*.* a tutti gli indirizzi estranei alla rete stessa.

# ipchains -A input -p tcp -s ! 192.168.0.0/16 <-'
`->-d 192.168.0.0/16 80 -y -j REJECT

Come nell'esempio precedente, limitandosi a intervenire nei pacchetti SYN.

180.2.4 Regole per il protocollo ICMP
Il protocollo ICMP è molto importante ai fini di controllo del funzionamento della rete; in questo senso è rara la possibilità che sia il caso di bloccarne il transito attraverso il firewall. Tuttavia, dal momento che i fini del firewall non si limitano al blocco del traffico, è comunque importante poter indicare una regola che sappia selezionare un tipo particolare di pacchetto ICMP. La tabella 176.2 elenca i tipi di pacchetto ICMP e il loro utilizzo.

Per indicare una regola che faccia riferimento a un tipo particolare di pacchetto ICMP, si sfruttano le opzioni che servono a specificare l'origine o la destinazione, aggiungendo il numero o il nome del tipo ICMP. In pratica, questa informazione va a sostituire il numero di porta nel caso dei protocolli TCP e UDP.

È estremamente importante che non vengano bloccati i messaggi ICMP di tipo 3.

Opzioni per il protocollo ICMP
-s [!] indirizzo[/maschera] [!] [tipo]

--source [!] indirizzo[/maschera] [!] [tipo]

-d [!] indirizzo[/maschera] [!] [tipo]

--destination [!] indirizzo[/maschera] [!] [tipo]

Come già accennato, con il protocollo ICMP l'origine e la destinazione possono includere l'indicazione del tipo di messaggio ICMP.

Esempi
# ipchains -A input -p icmp -s ! 192.168.0.0/16 8 <-'
`->-d 192.168.0.0/16 -j DENY

Blocca e ignora i pacchetti ICMP che contengono un messaggio di tipo 8, cioè echo-request, proveniente da un indirizzo estraneo alla rete 192.168.*.* e destinato alla rete stessa.

180.2.5 Pacchetti frammentati
I pacchetti frammentati costituiscono un problema per la gestione del firewall. In generale ci si limita a intervenire sul primo frammento, perché questo dovrebbe contenere le informazioni necessarie a identificarlo correttamente.

Se il firewall rappresenta un passaggio obbligato per il traffico che lo attraversa, è molto importante che sia abilitata la ricomposizione dei pacchetti frammentati. Questo risolve tanti problemi e soprattutto quello del controllo dei frammenti.

Per identificare un frammento di pacchetto successivo al primo, si utilizza l'opzione -f nel modo seguente:

[!] -f | [!] --fragment

Il punto esclamativo permette di ottenere l'effetto contrario, cioè di fare riferimento a tutti i pacchetti che non sono frammenti. Utilizzando questa opzione non è possibile indicare delle porte TCP o UDP, né specificare il tipo di messaggio per il protocollo ICMP.

Esempi
# ipchains -A input -p icmp -s ! 192.168.0.0/16 <-'
`->-d 192.168.0.0/16 -f -j DENY

Blocca e ignora i frammenti dei pacchetti ICMP provenienti da un indirizzo estraneo alla rete 192.168.*.* e destinati alla rete stessa.

180.3 Esempi
Di seguito vengono mostrati altri esempi che dovrebbero aiutare a comprendere ancora meglio il funzionamento di un firewall realizzato con GNU/Linux.

/sbin/ipchains -A forward -s 224.0.0.0/3 -d 0/0 -l -j DENYQuesta 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 primi tre bit a uno. Infatti, 22410 si traduce nel numero binario 111000002, che esclude tutta la classe D e la classe E degli indirizzi IPv4. Si osservi l'aggiunta dell'opzione -l per ottenere l'annotazione nel registro del sistema dei tentativi di attraversamento. Segue la visualizzazione della regola attraverso ipchains -L forward -n; si osservi la comparsa della lettera l nella colonna delle opzioni.

target prot opt source destination ports
DENY all ----l- 224.0.0.0/3 0.0.0.0/0 n/a
--------------------------------------------------------------------------------

/sbin/ipchains -A forward -s 224.0.0.0/3 -l -j DENYQuesto esempio è esattamente identico a quello precedente, perché la destinazione predefinita è proprio quella riferita a qualunque indirizzo.

/sbin/ipchains -A forward -p tcp -s 192.168.1.0/24 -d 0/0 23 -j ACCEPTConsente ai pacchetti TCP provenienti dalla rete 192.168.1.0/255.255.255.0 di attraversare il firewall per raggiungere qualunque indirizzo, ma solo alla porta 23. In pratica concede di raggiungere un servizio TELNET. Segue la visualizzazione della regola attraverso ipchains -L forward -n.

target prot opt source destination ports
ACCEPT tcp ------ 192.168.1.0/24 0.0.0.0/0 any -> telnet
--------------------------------------------------------------------------------

/sbin/ipchains -A forward -p tcp -s 0/0 6000:6009 -d 0/0 -l -j DENY
/sbin/ipchains -A forward -p tcp -s 0/0 -d 0/0 6000:6009 -l -j DENYBlocca 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 serventi grafici contemporaneamente.

/sbin/ipchains -A input -p tcp -s 0/0 6000:6009 -d 0/0 -l -j DENY
/sbin/ipchains -A output -p tcp -s 0/0 -d 0/0 6000:6009 -l -j DENYBlocca 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.

180.4 Contabilizzazione del traffico
Con i kernel Linux 2.2.*, la contabilizzazione del traffico è implicita nel sistema di filtro del firewall: ogni regola che venga inserita in un punto di controllo accumula i propri contatori. In questo senso possono essere opportune anche regole che non hanno l'indicazione di alcun obiettivo, in quanto utili solo per selezionare una parte del traffico ai fini contabili.

Con l'opzione -v si può osservare il valore raggiunto dai vari contatori. Per esempio, disponendo di un'unica regola che cattura tutto il traffico in ingresso,

# ipchains -F input

# ipchains -A input

il comando

# ipchains -L input -v

potrebbe generare un rapporto simile a quello seguente:

pkts bytes target prot opt tosa tosx ifname mark outsize
376 34968 - all ------ 0xFF 0x00 any Si possono notare in particolare le colonne pkts e bytes che si riferiscono rispettivamente al numero di pacchetti IP e alla loro dimensione complessiva in byte. A fianco dei numeri che esprimono queste quantità potrebbero essere aggiunte delle lettere che rappresentano dei multipli: K, M e G. È importante osservare che questi esprimono multipli del sistema di numerazione decimale: 1 000, 1 000 000 e 1 000 000 000.(1)

L'azzeramento dei conteggi si ottiene con l'opzione di comando -Z (--zero), che interviene in tutte le regole dei punti di controllo indicati. Questa può essere utilizzata anche assieme all'opzione -L, in modo da non perdere informazioni; tuttavia, in questo caso, non è possibile indicare il nome di un punto di controllo particolare e si deve intervenire su tutte le regole esistenti.

Esempi
# ipchains -L input -v

Mostra tutte le informazioni disponibili sulle regole di ingresso. Tra le altre cose mostra anche i contatori del traffico.

# ipchains -Z input

Azzera i conteggi riferiti alle regole di ingresso.

# ipchains -L -Z -v

Mostra tutte le informazioni disponibili di tutti i punti di controllo (ed eventualmente anche di altri raggruppamenti di regole), compresi i conteggi che vengono azzerati immediatamente dopo.

180.5 Raggruppamenti di regole al di fuori dei punti di controllo standard
Oltre ai punti di controllo normali, è possibile definire delle raccolte di regole aggiuntive, a cui si può fare riferimento quasi come se fossero delle subroutine di un linguaggio di programmazione. Queste raccolte vengono identificate da un nome, al quale si può fare riferimento attraverso altre regole in qualità di obiettivo. In pratica, una regola posta in un punto di controllo può indicare un obiettivo corrispondente al nome di un altro raggruppamento di regole, che viene così a essere incorporato idealmente in quel punto.

Per comprendere il meccanismo, si supponga di avere creato la raccolta di regole (chain) denominata Prova, con una regola all'interno del punto di controllo di ingresso che vi faccia riferimento. Per cominciare, le regole contenute all'interno di Prova potrebbero essere:

target prot opt source destination ports
- all ------ 192.168.1.0/24 0.0.0.0/0 n/a
- all ------ 0.0.0.0/0 192.168.1.0/24 n/a
- all ------ 0.0.0.0/0 127.0.0.1 n/aCome si può osservare in questo caso, si tratta di regole che servono solo alla contabilizzazione del traffico, dal momento che non sono stati indicati degli obiettivi.

Le regole di ingresso potrebbero essere quelle seguenti:

target prot opt source destination ports
...
Prova tcp ------ 0.0.0.0/0 0.0.0.0/0 * -> *
...Si può osservare una regola il cui scopo è quello di individuare tutto il traffico TCP. Dal momento che l'obiettivo di questa è il raggruppamento Prova, i pacchetti che rientrano nella selezione di questa regola vengono scomposti ulteriormente attraverso le regole del raggruppamento Prova. I pacchetti che non vengono «catturati» da alcuna regola del raggruppamento Prova tornano a essere presi in considerazione dalle regole successive nel punto di controllo di ingresso.

La creazione di un raggruppamento di regole si ottiene con l'opzione di comando -N (--new-chain) e la sua eliminazione con -X (--delete-chain). Per esempio, il comando

# ipchains -N Prova

serve a creare il raggruppamento Prova a cui si accennava in precedenza. L'inserimento di regole avviene nel modo normale; per continuare a seguire gli esempi fatti, i comandi dovrebbero essere i seguenti:

# ipchains -A Prova -s 192.168.1.0/24

# ipchains -A Prova -d 192.168.1.0/24

# ipchains -A Prova -s 127.0.0.1

Così, l'inserimento della regola in ingresso che fa riferimento a questo raggruppamento, come mostrato dagli esempi in precedenza, si indica semplicemente con il comando seguente:

# ipchains -A input -p tcp -j Prova

L'eliminazione di un raggruppamento di regole è ammissibile solo quando questo è vuoto e quando non esistono più riferimenti da parte di altre regole nei punti di controllo normali.

# ipchains -D input -p tcp -j Prova

# ipchains -F Prova

# ipchains -X Prova

I comandi mostrati sopra servono rispettivamente a eliminare la regola di ingresso che faceva riferimento al raggruppamento Prova, a svuotare il raggruppamento e infine a eliminarlo.

180.6 Mascheramento IP
Attraverso il mascheramento IP si fa in modo di mostrare all'esterno che l'origine delle connessioni è sempre il nodo che esegue questo compito, anche quando in realtà si tratta di un nodo interno alla rete privata. Naturalmente, il nodo che esegue il mascheramento è poi in grado di distinguere quali siano stati i nodi mascherati che hanno originato la connessione, girando a loro i pacchetti di loro competenza.

Figura 180.2. Mascheramento IP.

.---------------.
| filtro di | Rete privata mascherata
- - - ------------------| mascheramento |-------*-----------*-------- - - -
Rete pubblica | IP | | |
(Internet) `---------------' .--------. .--------.
| host | | host |
`--------' `--------'

In linea di principio, i nodi collocati nella rete privata mascherata, sono in grado di accedere all'esterno, per mezzo del 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, assieme a quelle di ricomposizione dei pacchetti frammentati (nello stesso modo già visto nella sezioni dedicate al filtro di pacchetto IP), dove in particolare sia stata poi aggiunta anche quella di mascheramento (sezione 29.2.9).

180.6.1 ipchains per l'amministrazione del mascheramento
Attualmente (con i kernel 2.2.*), la gestione del mascheramento IP del kernel è un'estensione di quella del filtro di pacchetto IP, che deve essere attivata espressamente attraverso ipchains, utilizzando il punto di controllo di inoltro, forward, assieme a una politica di accettazione (ACCEPT) con l'aggiunta dell'indicazione che si tratta di mascheramento per mezzo dell'obiettivo MASQ. La cosa si può rappresentare schematicamente attraverso il modello seguente che comunque potrebbe essere esteso o precisato meglio.

ipchains -A|-I forward -s indirizzi_da_mascherare -d 0/0 -j MASQ

Ricapitolando quindi, il mascheramento si ottiene definendo una regola nel punto di controllo di inoltro, in cui sia stato attivato il mascheramento dell'origine nei confronti della destinazione.

180.6.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 180.3. L'interfaccia di rete del nodo di mascheramento connessa alla rete privata (eth0) deve avere un indirizzo IP che appartenga a tale spazio; inoltre deve essere stato previsto un instradamento corretto. L'altra interfaccia, quella rivolta verso la rete pubblica (ppp0), avrà un indirizzo IP pubblico, mentre l'instradamento dovrà essere quello predefinito.

Figura 180.3. Esempio di mascheramento di una rete privata.

.---------------. 192.168.1.0
ppp0 | | eth0 Rete privata mascherata
- - - ------------------| mascheramento |-------*-----------*-------- - - -
Rete pubblica | IP | | |
(Internet) `---------------' .--------. .--------.
| host | | host |
`--------' `--------'

In questa situazione, la regola che consente alla rete privata di raggiungere l'esterno può essere definita con uno dei due comandi seguenti: il primo è un esempio approssimativo, mentre il secondo fa un riferimento esplicito agli indirizzi esterni in modo che non coincidano con quelli interni.

/sbin/ipchains -A forward -s 192.168.1.0/24 -d 0/0 -j MASQ/sbin/ipchains -A forward -s 192.168.1.0/24 -d ! 192.168.1.0/24 -j MASQVisualizzando la regola attraverso ipchains -L forward -n, si ottiene una tra le due informazioni seguenti (a seconda del comando prescelto).

Chain forward (policy ACCEPT):
target prot opt source destination ports
MASQ all ------ 192.168.0.0/16 0.0.0.0/0 n/aChain forward (policy ACCEPT):
target prot opt source destination ports
MASQ all ------ 192.168.0.0/16 !192.168.0.0/16 n/aSi è 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/ipchains -P forward DENY
/sbin/ipchains -A forward -s 192.168.1.0/24 -d 0/0 -j MASQ180.7 Proxy trasparente
Il proxy trasparente, o transparent proxy, è una funzionalità attraverso la quale si fa in modo di ridirigere il traffico (TCP) verso un servizio proxy del nodo locale, quando altrimenti sarebbe diretto verso altri nodi, 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 (sezione 29.2.9).

Naturalmente, per attivare un sistema di proxy trasparente occorre il proxy. In effetti, il vantaggio di usare questo sistema al posto del mascheramento IP sta proprio nell'inserzione di un proxy, possibilmente di una cache proxy, per ridurre il traffico nella connessione con la rete pubblica. In questo modo, il software utilizzato nei nodi della rete privata non ha bisogno di essere configurato per inviare tutte le sue richieste al proxy, ma quando i pacchetti tentano di raggiungere l'esterno, allora vengono presi in considerazione da questo.

180.7.1 ipchains per il proxy trasparente
La ridirezione attraverso cui si ottiene il proxy trasparente si definisce esclusivamente per mezzo del punto di controllo di ingresso, input, specificando una porta di ridirezione con l'obiettivo REDIRECT. Considerato che il proxy trasparente viene usato normalmente solo per il protocollo TCP, la sintassi di ipchains per questo scopo si traduce nello schema seguente:

ipchains -A|-I input -p tcp -s origine -d destinazione porte -j REDIRECT 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 specificata dopo l'obiettivo REDIRECT nel nodo locale.

180.7.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 proxy trasparente. 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.

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

.---------------.
| Proxy | Rete privata mascherata
- - - ------------------| trasparente |-------*-----------*-------- - - -
Rete esterna | | | |
`---------------' .--------. .--------.
| host | | host |
`--------' `--------'

Lo scopo del proxy trasparente può essere semplicemente quello di «obbligare» a utilizzare una cache proxy, senza importunare gli utenti pretendendo da loro che configurino gli 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 8 080 (tipica di una cache proxy).

/sbin/ipchains -A input -p tcp \
-s 192.168.1.0/24 -d ! 192.168.1.0/24 80 -j REDIRECT 8080Come si può intendere, il comando è stato suddiviso su due righe per motivi tipografici. Visualizzando la regola attraverso ipchains -L input, si ottiene l'informazione seguente:

Chain input (policy ACCEPT):
target prot opt source destination ports
REDIRECT tcp ------ 192.168.0.0/24 !192.168.0.0/24 any -> 80 => 8080Naturalmente, il proxy trasparente può essere combinato anche con il mascheramento IP, per cui, dato l'esempio già visto, si potrebbe anche aggiungere l'istruzione seguente:

/sbin/ipchains -A forward -s 192.168.0.0/24 -d ! 192.168.0.0/24 -j MASQ180.8 Riferimenti
Paul Russell, Linux IPCHAINS-HOWTO

<http://www.linux.org/docs/ldp/howto/HOWTO-INDEX/howtos.html>

Terry Dawson, Linux NET-3-HOWTO, Linux Networking

<http://www.linux.org/docs/ldp/howto/HOWTO-INDEX/howtos.html>

Mark Grennan, Firewalling and Proxy Server HOWTO

<http://www.linux.org/docs/ldp/howto/HOWTO-INDEX/howtos.html>

Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org

Copyright (c) 2000-2003 by Ing. Eduardo Palena - Napolifirewall.com