[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico] [volume] [parte]
Le funzionalità di firewall e di mascheramento IP, essendo incorporate nel kernel, devono essere abilitate prima della compilazione (sezione 49.2.14).
È 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
[Invio]
La gestione del filtro di pacchetto IP dei kernel 2.0.* viene regolata attraverso il programma ipfwadm (IP firewall administration). Non potendo gestire un file di configurazione per queste funzionalità del kernel, 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, descritte nel contesto appropriato, 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 che serve a stabilire a cosa si riferisce la regola definita attraverso gli argomenti successivi.
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.
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 uno.
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. |
|
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.
|
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 categoria determinata, 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:
|
Dal momento che le funzionalità di filtro del kernel Linux non devono interferire con quelle di inoltro, 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.
|
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 potrebbe scegliere 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:
|
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.
Segue la descrizione di alcuni esempi.
|
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 primi tre bit a uno. Infatti, 224 si traduce nel numero binario 111000002, escludendo 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 -F -l:
|
|
Questo esempio è esattamente identico a quello precedente, perché la destinazione predefinita è proprio quella riferita a qualunque indirizzo.
|
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 -F -l:
|
|
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 serventi grafici contemporaneamente.
|
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.
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 sia stato attivato il mascheramento dell'origine nei confronti della destinazione.
La situazione comune per il mascheramento IP è quella dello schema che appare in figura 256.18. 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, deve avere un indirizzo IP pubblico e l'instradamento deve essere quello predefinito.
|
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).
|
|
|
Visualizzando la regola attraverso ipfwadm -F -l, si ottiene l'informazione seguente, dove si deve osservare che il tipo è indicato come acc/m, ovvero: accept/masquerade.
|
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.
|
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 (sezione 49.2.14).
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.
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).
|
Visualizzando la regola attraverso ipfwadm -I -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.
|
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 (sezione 49.2.14).
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.
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).
I comandi, cioè le opzioni che seguono immediatamente la categoria -A, hanno delle differenze importanti rispetto alla sintassi relativa alla gestione del firewall.
|
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.
|
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.
|
Visualizzando la regola attraverso il comando ipfwadm -A -l, si ottiene qualcosa simile a quello che segue.
|
In questo caso, si può osservare che c'è stato un po' di traffico (veramente minimo), dal momento che sono transitati 280 byte in quattro 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.
|
In questo caso, per visualizzare le regole è necessario il comando ipfwadm -A -l -e, altrimenti non si può notare che si fa riferimento a un'interfaccia precisa.
|
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.
|
Il risultato di queste regole potrebbe essere il seguente:
|
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.
|
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 correttamente, è 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 8 080 (cache proxy).
|
Il risultato di questa regola potrebbe essere il seguente:
|
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>
Ambrose Au, Linux IP Masquerade mini HOWTO
<http://www.linux.org/docs/ldp/howto/HOWTO-INDEX/howtos.html>
Appunti di informatica libera 2006.07.01 --- Copyright © 2000-2006 Daniele Giacomini -- <daniele (ad) swlibero·org>
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome kernel_linux_2_0_firewall_e_mascheramento_ip.htm
[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico]