Firewalling con LInux |
La gestione delle funzioni di packet filtering, natting e forwarding
dal kernel 2.4 è affidata al netfilter subsystem,
gestibile tramite il comando iptables.
La gestione delle funzioni di firewalling su Linux ha subito nel
corso degli anni cambiamenti progressivi.
Nel kernel 2.x questa funzione è affidata ad un comando con
sistassi simile: ipchains.Nei kernel precedenti il comando
utilizzato era ipfadm.
Iptables basa la sua funzionalità su diverse tables
a cui sono applicate delle chains (catene) con le
regole di filtering definite dall'utente.
Ogni regola di filtraggio di pacchetti prevede un target,
che definisce cosa viene fatta del pacchetto che soddisfa i criteri
specificati.
Le tables possono essere:
|
filter |
E' la tabella di default,
che riguarda il filtraggio di pacchetti. Prevede le chains predefinite:
INPUT (per i pacchetti diretti all'host), OUTPUT (per
pacchetti generati dall'host) e FORWARD (per pacchetti che
attaversano l'host, avendo IP sorgente e destinatario diversi). |
nat |
E' necessaria per natting
e masquerading, prevede le tabelle PREROUTING (alterazione
degli IP di pacchetti prima che vengono processati da ipfilter), POSTROUTING
(alterazione di pacchetti che stanno lasciando l'host), OUTPUT
(per modificare prima di routarli pacchetti generati dall'host) |
mangle |
Viene usata per modifiche
particolari dei pacchetti (TOS, mirroring ecc). Ha due chains predefinite:
PREROUTING (alterazione degli IP di pacchetti prima che vengano
processati da netfilter), OUTPUT (per modificare prima di routarli
pacchetti generati dall'host). |
|
La
sintassi di base di iptables è:
iptables [comando] [opzioni]
Ci può essere solo un comando per riga che definisce
quale azione eseguire (l'elenco che segue non è completo): |
-A
regole catena |
Aggiunge
una o più regole alla fine della catena indicata |
-D
regole catena |
Cancella
una o più regole dalla catena indicata |
-F
[catena] |
Cancella
tutte le regole o solo quelle della catena indicata |
-L
[catena] |
Elenca
tutte le regole o solo quelle della catena indicata |
-P
catena target |
Definisce
il target di default per la catena indicata |
-N
catena |
Crea una
nuova catena, definita dall'utente, con il nome specificato |
Esistono
diversi target a cui indirizzare un pacchetto che matcha una
regola.
Il target può essere:
1- il nome di una nuova chain;
2- un comportamento base come ACCEPT, DROP, QUEUE
(i pacchetti vengono inviati in userspace, per l'elaborazione con
programmi esterni), RETURN;
3- target speciali, correlati a moduli del kernel che vanno appositamente
compilati: |
LOG |
Registra tramite syslog
il matching del pacchetto |
REJECT |
Elimina il pacchetto
e, eventualmente, restituisce un messaggio ICMP (icmp-*-unreachable)
configurabile. |
TOS |
Imposta il campo Type
Of Service nell'intestazione IP. Valido solo per la tabella mangle. |
SNAT |
Modifica l'IP sorgente
(Source natting). Vale solo per la catena POSTROUTING della
tabella nat |
DNAT |
Modifica l'IP destinatario
(Destination natting). Vale solo per la catena PREROUTING della
tabella nat. |
MASQUERADE |
Maschera il pacchetto
in modo che sembri provenire dal'host locale. Valido solo per la tabella
nat, viene usato per il natting dinamico di intere lreti locali su
Internet. |
REDIRECT |
Redireziona il pacchetto
ad una porta locale. Necessario per fare transparent proxying. |
Per identificare i pacchetti nelle singole regole sono disponibili
diverse opzioni che definiscono il criterio di corrispondenza.
Per quasi tutte è prevista la possibilità del segno
! per identificare tutti i pacchetti tranne quelli specificati.
-p
[!] protocollo |
I
pacchetti che corrispono al protocollo definito: tcp,
udp, icmp, all (default) |
-s
[!] indirizzo[/mask] [!] [porta] |
I
pacchetti che hanno l'IP sorgente specificato. La mask può
essere sia in format estesa (es: /255.255.255.0) che compatta
(es: /24). E' possibile anche specificare la porta sorgente. |
-d
[!] indirizzo[/mask] [!] [porta] |
I
pacchetti che hanno l'IP e/o la porta di destinazione specificati. |
-i
[!] interfaccia[+] |
I
pacchetti ricevuti in entrata sull'interfaccia definita. Il
+ è una wildcard (es: eth+ per tutte le ethernet) |
-o
[!] interfaccia[+] |
Tutti
i pacchetti in uscita sull'interfaccia specificata. |
-j
TARGET |
Salta
al TARGET indicato o ad una catena definita dell'utente. |
|
Esistono
inoltre criteri più sofisticati per il matching dei pacchetti
che possono basarsi sul mac-address, l'icmp type, lo stato della connessione
TCP (syn,ack,rst) il TOS ecc. |