[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [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 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
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, 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 che serve a stabilire a cosa si riferisce la regola definita attraverso gli argomenti successivi.
-I
Definisce una regola riferita al traffico in ingresso.
-O
Definisce una regola riferita al traffico in uscita.
-F
Definisce una regola riferita al traffico in transito attraverso il firewall (forward).
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.
-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, insert) dell'elenco.
Quando si tratta di una regola di firewall, è 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.
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. |
-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 indirizzo qualunque.
-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.
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.
-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 sì 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, di solito intercettati dal demone klogd che poi li invia al registro del sistema).
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:
#!/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 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.
#... /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.
/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 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.
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 -F -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 serventi 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.
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 181.1. 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.
|
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 -F -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
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 29.2.9).
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).
/sbin/ipfwadm -I -a accept -p tcp -S 192.168.1.0/24 -D any/0 80 -r 8080
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.
type prot source destination ports acc/r tcp 192.168.0.0/24 anywhere any -> http => 8080
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 29.2.9).
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.
-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; i 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, insert) 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.
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 -A -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 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.
/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 -A -l -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 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).
/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
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>
daniele @ swlibero.org
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome kernel_linux_2_0_firewall_e_mascheramento_ip.html
[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico]