IPFW
Section: (4)
Updated: 17 giugno 1996
Index
Return to Main Contents
NOME
ipfw - firewall e autenticazione per IP
SINTASSI
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <linux/icmp.h>
#include <linux/if.h>
#include <linux/ip_fw.h>
int setsockopt (int socket, IPPROTO_IP, int command, void *data, int length)
DESCRIZIONE
Il firewall IP e le capacità di autenticazione
del kernel Linux offrono un meccanismo per l'autenticazione dei
pacchetti IP, per costruire firewall basati sul filtraggio dei pacchetti,
per costruire firewall basati sul proxy trasparerente (ridirigendo
i pacchetti ad un socket locale), e per mascherare i pacchetti inoltrati.
La gestione di queste funzionalità è basata su quattro liste separate
mantenute nel kernel, ciascuna delle quali contiene zero o più regole.
Ogni regola specifica le informazioni sugli indirizzi del mittente
e del destinatario, i protocolli, i numeri di porta e altre
caratteristiche.
Un pacchetto corrisponderà ad una regola quando le caratteristiche della
regola corrispondono a quelle del pacchetto IP.
Le quattro categorie di regole sono:
- Accounting
-
Le regole di autenticazione sono usate per tutti i pacchetti IP che vengono trasmessi
o ricevuti tramite una delle interfacce di rete locali.
Ogni pacchetto viene confrontato con tutte le regole di questa lista, e ogni
corrispondenza causerà un incremento nei contatori di pacchetti
e di byte associati con quella regola.
- Firewall di ingresso
-
Queste regole gestiscono l'accettazione di pacchetti in entrata.
Tutti i pacchetti che entrano attraverso una delle interfacce di rete locali
sono confrontati con le regole del firewall di ingresso.
La prima regola che corrisponde ad un pacchetto determina il comportamento da tenere
e provoca un aggiornamento dei contatori di pacchetti e di byte per la regola.
Quando non vengono trovate corrispondenze, viene usata la politica predefinita per il
firewall di ingresso.
- Firewall di uscita
-
Queste regole definiscono i permessi per la trasmissione di pacchetti IP.
Tutti i pacchetti pronti per essere trasmessi attraverso una delle
interfacce di rete locali vengono confrontati con le regole del firewall di uscita.
La prima regola che corrisponde ad un pacchetto determina il comportamento da tenere
e provoca un aggioranamento dei contatori di pacchetti e di byte.
Quando non vengono trovate corrispondenze, viene usata la politica predefinita per il
firewall di uscita.
- Firewall di inoltro
-
Queste regole definiscono i permessi per l'inoltro di pacchetti IP.
Tutti i pacchetti spediti da un host remoto e destinati ad un altro host remoto
vengono confrontati con le regole del firewall di inoltro.
La prima regola che corrisponde ad un pacchetto determina il comportamento da tenere
e provoca un aggioranamento dei contatori di pacchetti e di byte.
Quando non vengono trovate corrispondenze, viene usata la politica predefinita per il
firewall di inoltro.
Tutte le regole di firewall (non quelle di autenticazione) contengono una politica
che specifica l'azione da intraprendere quando un pacchetto corrisponde a tale regola.
Ci sono 3 differenti politiche possibili:
accept
(lascia passare il pacchetto),
reject
(non accetta il pacchetto e manda un messaggio "ICMP host unreachable"
al mittente del pacchetto come notifica),
e
deny
(ignora il pacchetto senza mandare notifiche).
Per tutti e tre i tipi di firewall esiste anche un comportamento predefinito,
che si applica a tutti i pacchetti che non corrispondono ad alcuna regola.
Le regole di ingresso determinano anche se i pacchetti devono
essere rediretti ad un socket locale dopo essere stati accettati dal firewall di
ingresso. In questo caso, il pacchetto verrà ricevuto da un processo locale, anche se
era stato mandato ad un altro host e/o un altro numero di porta.
Questa funzionalità può essere usata solo con pacchetti TCP o UDP.
Le regole di inoltro definiscono anche se i pacchetti devono essere mascherati
oppure no quando vengono ritrasmessi.
In questo caso, l'indirizzo del mittente del pacchetto IP viene sostituito
dall'indirizzo dell'host locale, e la porta che appare come mittente nell'header TCP o
UDP viene rimpiazzata da un numero di porta temporaneo generato localmente prima di
inoltrare il pacchetto.
Siccome questo tipo di gestione viene effettuato dal kernel, i pacchetti di risposta
(mandati al numero di porta temporanea dell'host locale) sono riconosciuti
automaticamente.
L'indirizzo di destinazione e il numero di porta di questi pacchetti verranno quindi
rimpiazzati con l'indirizzo e il numero di porta originali, che sono stati salvati al
momento della mascheratura del primo pacchetto.
Questa funzionalità può essere usata solo con i pacchetti TCP o UDP.
Questo paragrafo descrive il modo in cui un pacchetto attraversa
il firewall e le regole di autenticazione.
Un pacchetto ricevuto da una delle interfacce di rete locali passerà
attraverso i seguenti gruppi di regole:
-
autenticazione
(dispositivo di ingresso)
firewall di ingresso
(dispositivo di ingresso)
Tra parentesi è indicato il dispositivo (interfaccia di rete) che viene usato quando
si cerca di trovare una regola che corrisponda al pacchetto IP.
Dopo questo passo, il pacchetto sarà opzionalmente rediretto ad un socket locale.
Quando il pacchetto deve essere inoltrato ad un host remoto, passerà anche
attraverso questo insieme di regole:
-
firewall di inoltro
(dispositivo di uscita)
Dopo questo passaggio un pacchetto potrà opzionalmente essere mascherato.
Risposte ai pacchetti mascherati non passeranno mai dal firewall di inoltro
(ma passeranno sia dal firewall di ingresso che da quello di uscita).
Tutti i pacchetti inviati da una delle interfacce di rete locali, sia
generati localmente che inoltrati, passeranno dal seguente insieme
di regole:
-
firewall di uscita
(dispositivo di uscita)
autenticazione
(dispositivo di uscita)
Si noti che i pacchetti mascherati passeranno dal firewall di uscita e dalle
regole di autenticazione con i nuovi header (dopo aver attraversato i firewall di
ingresso e di inoltro con gli header originali).
Inoltre, risposte a pacchetti mascherati avranno header diversi quando
attraverseranno le regole dei firewall di ingresso e di uscita.
La gestione del firewall e dell'autenticazione può essere cambiata attraverso
chiamate a
R setsockopt (2).
Le regole esistenti possono essere osservate guardando i seguenti quattro file nella
directory
/proc/net :
R ip_acct ,
R ip_input ,
R ip_output ,
e
R ip_forward .
La gestione attuale relativa alle sessioni mascherate
si trova nel file
ip_masquerade
nella stessa directory
(si noti che le regole che specificano quali sessioni vengono
mascherate si trovano in
R ip_forward ).
COMANDI
I comandi per cambiare le liste di regole o i comportamenti predefiniti
devono essere passati come opzioni alla chiamata di sistema
R setsockopt (2),
che opera su un socket IP raw.
La maggior parte dei comandi richiede il passaggio di dati aggiuntivi.
Un puntatore a questi dati e la loro lunghezza vengono passati a
R setsockopt
come valore della opzione e lunghezza della opzione stessa.
Si possono usare i seguenti comandi:
IP_ACCT_APPEND
IP_FW_APPEND_IN
IP_FW_APPEND_OUT
IP_FW_APPEND_FWD
-
Aggiungono una regola a uno degli elenchi di autenticazione o di firewall.
In base al comando, la regola viene aggiunta all'elenco di
autenticazione, al firewall di ingresso, di uscita, o a quello di inoltro,
nell'ordine.
La nuova regola viene aggiunta in coda all'elenco.
Il dato passato con questi comandi è una struttura
R ip_fw ,
che definisce i contenuti della nuova regola.
IP_ACCT_INSERT
IP_FW_INSERT_IN
IP_FW_INSERT_OUT
IP_FW_INSERT_FWD
-
Questi comandi sono uguali ai comandi di aggiunta, tranne che la nuova regola
è inserita all'inizio dell'elenco.
IP_ACCT_DELETE
IP_FW_DELETE_IN
IP_FW_DELETE_OUT
IP_FW_DELETE_FWD
-
Rimuovono una regola dall'elenco di autenticazione o di firewall.
In base al comando, la regola viene rimossa dall'elenco per l'autenticazione,
dal firewall di ingresso, di uscita, o da quello di inoltro,
nell'ordine.
Il dato passato con questi comandi è una struttura
R ip_fw ,
che definisce i contenuti della regola da rimuovere.
Viene rimossa dall'elenco la prima regola che corrisponde alla descrizione.
IP_ACCT_ZERO
IP_FW_ZERO_IN
IP_FW_ZERO_OUT
IP_FW_ZERO_FWD
-
Azzerano i contatori di pacchetti e di byte in tutte le regole
della lista di autenticazione, del firewall di ingresso, di uscita,
o di quello di inoltro, nell'ordine.
Si noti che occorre passare con questo comando un numero intero
(inutile) come dato.
Vedere anche la descrizione dei file
/proc/net
per sapere come stampare i contatori e azzerarli atomicamente.
IP_ACCT_FLUSH
IP_FW_FLUSH_IN
IP_FW_FLUSH_OUT
IP_FW_FLUSH_FWD
-
Rimuovono tutte le regole dalla lista di autenticazione, dal firewall di ingresso,
di uscita,
o di quello di inoltro, nell'ordine.
Si noti che occorre passare un numero intero (inutile) come dato con questo
comando.
IP_FW_POLICY_IN
IP_FW_POLICY_OUT
IP_FW_POLICY_FWD
-
Cambiano la risposta predefinita per il firewall di ingresso, quello di uscita e
quello di inoltro.
Il nuovo comportamento viene passato sotto forma di numero intero
con questi possibili valori:
IP_FW_F_ACCEPT
(accetta il pacchetto),
IP_FW_F_ICMPRPL
(rifiuta il pacchetto
mandando al mittente un messaggio di
destinazione irraggiungibile), oppure 0
(ignora il pacchetto senza mandare ulteriori notifiche).
Il comportamento viene usato quando nessuna delle regole disponibili nella lista
appropriata si applica al pacchetto in questione.
Per il firewall di inoltro, il comportamento può anche essere
IP_FW_F_ACCEPT | IP_FW_F_MASQ
(accetta un pacchetto da inoltrare, ma effettuando il mascheramento
per i pacchetti TCP o UDP).
IP_FW_MASQ_TIMEOUTS
-
Imposta i valori di timeout usati per la mascheratura.
Il dato passato con questo comando è una struttura che contiene tre campi di tipo
R int ,
rappresentanti i tempi massimi in "jiffies" (1/HZ di secondo) per le sessioni TCP,
le sessioni TCP che hanno già ricevuto un pacchetto FIN e i pacchetti UDP,
nell'ordine.
Un valore di timeout pari a 0 significa che il valore attuale del campo
corrispondente non deve essere modificato.
IP_FW_CHECK_IN
IP_FW_CHECK_OUT
IP_FW_CHECK_FWD
-
Controllano se un pacchetto verrebbe accettato, ignorato o rifiutato
dal firewall di ingresso
(IP_FW_CHECK_IN),
da quello di uscita
(IP_FW_CHECK_OUT),
o da
quello di inoltro
(IP_FW_CHECK_FWD).
Il dato passato con questi comandi è una struttura
R ip_fwpkt ,
che definisce gli header del pacchetto da controllare e l'indirizzo dell'interfaccia.
STRUTTURE
La struttura
ip_fw
contiene i seguenti campi che devono essere riempiti al fine di aggiungere
o cancellare una regola:
- struct in_addr fw_src, fw_dst
-
Indirizzi IP del mittente e del destinatario.
- struct in_addr fw_smsk, fw_dmsk
-
Maschere per gli indirizzi IP del mittente e del destinatario.
Si noti che una maschera 0.0.0.0 corrisponderà a qualsiasi indirizzo.
- struct in_addr fw_via
-
Indirizzo IP dell'interfaccia attraverso la quale il pacchetto è stato ricevuto dal
sistema o sta per essere spedito.
L'indirizzo 0.0.0.0 ha un significato speciale: corrisponderà a tutte
le interfacce.
- char fw_vianame[IFNAMSIZ]
-
Nome dell'interfaccia attraverso la quale il pacchetto è stato ricevuto dal sistema o
sta per essere spedito.
La stringa vuota ha un significato speciale: corrisponderà a tutti i dispositivi.
- unsigned short fw_flg
-
Flag per questa regola.
I bit per le differenti opzioni possono venire associati tramite un'operazione di OR.
Il protocollo (obbligatorio).
I valori possibili sono
IP_FW_F_TCP
(TCP),
IP_FW_F_UDP
(UDP),
IP_FW_F_ICMP
(ICMP),
o
IP_FW_F_ALL
(tutti i protocolli, definisce una regola universale di firewall o di autenticazione).
Il comportamento da tenere quando un pacchetto corrisponde a questa regola.
Il comportamento può essere
IP_FW_F_ACCEPT
(accetta il pacchetto),
IP_FW_F_ICMPRPL
(rifiuta il pacchetto mandando al mittente un messaggio ICMP di
destinazione irraggiungibile).
Se nessuno di questi flag è specificato, il pacchetto è scartato
senza mandare alcuna notifica.
Si noti che questa politica non viene usata dalle regole di autenticazione.
Redirezione e mascheramento sono specificati anch'essi tramite due flag:
IP_FW_F_REDIR
redirige un pacchetto accettato ad un socket locale (specificato da un numero di
porta, come descritto più avanti).
Questo bit è valido solo nelle regole per il firewall di ingresso e può essere usato
solo se il kernel è stato compilato con l'opzione
CONFIG_IP_TRANSPARENT_PROXY
attiva.
IP_FW_F_MASQ
maschera un pacchetto accettato.
Questo bit è valido solo nelle regole del firewall di inoltro e può essere usato solo
quando il kernel è stato compilato con l'opzione
CONFIG_IP_MASQUERADE
attiva.
Le altre opzioni sono:
IP_FW_F_BIDIR
(regola bidirezionale, che corrisponde sia in entrata che in uscita),
IP_FW_F_TCPACK
(seleziona solo i pacchetti TCP con il bit ACK impostato nell'header
TCP, opzione ignorata con altri protocolli),
IP_FW_F_TCPSYN
(seleziona solo i pacchetti TCP con il bit SYN impostato e il bit
ACK inattivo nell'header TCP, opzione ignorata con altri protocolli),
IP_FW_F_ACCTIN
e
IP_FW_F_ACCTOUT
(selezionano solo i pacchetti in entrata o in uscita; queste opzioni
hanno effetto solo nelle regole di autenticazione),
IP_FW_F_SRNG,
e
IP_FW_F_DRNG
(vedere sotto per una descrizione di questi flag).
L'opzione
IP_FW_F_PRN
può essere usata per elencare informazioni sui pacchetti selezionati tramite
R printk ().
Questa opzione ha effetto solo se il kernel è stato compilato
con l'opzione
CONFIG_IP_FIREWALL_VERBOSE
attiva.
- unsigned short fw_nsp, fw_ndp, fw_pts[IP_FW_MAX_PORTS]
-
Questi campi specificano il numero di porte del mittente, il numero di porte del
destinatario e il vettore in cui queste porte sono immagazzinate, in questo ordine.
Il vettore inizia con le porte del mittente, seguite senza interruzione dalle porte
del destinatario.
Se l'opzione
IP_FW_F_REDIR
viene usata, queste porte sono seguite dalla porta di redirezione.
Se questa porta di redirezione è 0, la porta di destinazione
del pacchetto viene usata come porta di redirezione.
Il numero totale di porte è limitato a
IP_FW_MAX_PORTS
(attualmente 10).
Entrambe le liste di porte, sia quella del mittente che quella del destinatario,
possono contenere non più un intervallo di porte.
In questo caso, le prime due porte dell'elenco sono usate
come il minimo e il massimo valore di tale intervallo.
Per i pacchetti ICMP, le porte del mittente sono interpretate come tipi ICMP
e le porte di destinazione sono ignorate.
Siccome il secondo frammento e i seguenti di un pacchetto TCP o UDP
non contengono numeri di porte, questi pacchetti IP ai fini dell'autenticazione
saranno trattati come se entrambe le porte fossero 65535.
Per la stessa ragione, il
secondo e gli ulteriori frammenti di un pacchetto ICMP ai fini
dell'autenticazione sono trattati come se il tipo di messaggio ICMP fosse 255.
Inoltre, il secondo ed ulteriori frammenti di pacchetti TCP, UDP, ICMP vengono
accettati da tutti e tre i firewall.
I flag
IP_FW_F_SRNG
e
IP_FW_F_DRNG
nel campo
fw_flg
riferiscono se sono state specificate
le porte del mittente e/o destinatario.
- unsigned char fw_tosand, fw_tosxor
-
Queste maschere a 8 bit definiscono come bisogna cambiare il campo TOS nell'header IP
quando un pacchetto viene accettato dalla regola di firewall.
Il campo TOS viene prima sottoposto ad un'operazione AND bit-a-bit con
fw_tosand
e il risultato di questo viene sopposto ad un'operazione XOR con
R fw_tosxor .
Qeusti campi sono ignorati nelle regole di autenticazione
e in quelle del firewall che rifiutano o ignorano i pacchetti.
La struttura
R ip_fwpkt ,
usata nel controllo dei pacchetti,
contiene i seguenti campi:
- struct iphdr fwp_iph
-
L'header IP. Vedere
<linux/ip.h>
per una descrizione dettagliata della
struttura
R iphdr .
struct tcphdr fwp_protoh.fwp_tcph
struct udphdr fwp_protoh.fwp_udph
struct icmphdr fwp_protoh.fwp_icmph
-
Gli header TCP, UDP, e ICMP, combinati in una unione chiamata
R fwp_protoh .
Vedere
R <linux/tcp.h> ,
R <linux/udp.h> ,
o
<linux/icmp.h>
per una descrizione dettagliata delle rispettive strutture.
- struct in_addr fwp_via
-
L'indirizzo dell'interfaccia attraverso la quale il pacchetto
viene ricevuto o trasmesso.
VALORE RESTITUITO
In caso di successo viene ritornato zero.
In caso di errore viene ritornato -1 e
errno
viene impostato di conseguenza.
Vedere
R setsockopt (2)
per un elenco dei possibili valori di errore.
Quando viene usato uno dei due comandi che controllano un pacchetto, viene restituito
zero quando il pacchetto verrebbe accettato senza redirezione o mascheratura.
Altrimenti, viene restituito -1 e
errno
viene impostato a
ECONNABORTED
(il pacchetto verrebbe accettato con redirezione),
ECONNRESET
(il pacchetto verrebbe accettato con mascheratura),
ETIMEDOUT
(il pacchetto verrebbe ignorato), o
ECONNREFUSED
(il pacchetto verrebbe rifiutato).
REGOLE DI STAMPA
Nella directory
/proc/net
ci sono quattro file per elencare le regole attualmente in vigore
per ciascuna categoria:
ip_acct
(per le regole di autenticazione IP),
ip_input
(per le regole del firewall di ingresso),
ip_output
(per le regole de firewall di uscita), e
ip_forward
(per le regole del firewall di inoltro).
La lettura di questi file restituisce una riga di intestazione e una riga per ciascuna
regola.
Per tutti e tre i tipi di firewall, la riga di intestazione include alla fine una
rappresentazione decimale del comportamento predefinito corrispondente
(uno tra
IP_FW_F_ACCEPT,
IP_FW_F_ICMPRPL,
e zero; il comportamento del firewall di inoltro può anche valere
IP_FW_F_ACCEPT |
IP_FW_F_MASQ).
Ogni riga seguente elenca nel seguente ordine i contenuti di una regola:
indirizzo e maschera del mittente, indirizzo e maschera del destinatario,
indirizzo dell'interfaccia, flag, porte del mittente e del destinatario, contatori
di pacchetti e byte, lista di porte, maschera AND per TOS e maschera XOR per TOS.
Gli indirizzi IP e le maschere vengono stampati come otto cifre esadecimali, le
maschere TOS vengono stampate con due cifre esadecimali precedute dalla lettera A o X,
rispettivamente, e gli altri valori sono rappresentati in formato decimale.
Ciascun campo è separato da uno spazio bianco, da un '/' (tra l'indirizzo e la
corrispondente maschera) o da "->" (tra le coppie di indirizzo/maschera
per il mittente ed il destinatario).
I file possono anche essere aperti in lettura/scrittura (ma solo root
può farlo).
In tal caso, i contatori dei pacchetti e dei byte per tutte le regole di quella
categoria saranno ripristinati a zero dopo aver restituito il loro valore attuale.
Il file
/proc/net/ip_masquerade
contiene la situazione corrente del masquerading nel kernel.
Dopo una riga di intestazione, ogni sessione mascherata è descritta da una
differente riga con i seguenti valori, separati da uno spazio o da un ':'
(nelle coppie indirizzo/porta):
nome del protocollo ("TCP" o "UDP"), indirizzo e numero di porta del mittente,
indirizzo e numero di porta del destinatario,
il nuovo numero di porta, il numero iniziale di sequenza cui viene
aggiunta la differenza, la differenza, il valore precedente della differenza, e
l'istante di timeout in jiffies (1/HZ di secondo).
Tutti gli indirizzi e i valori numerici sono in formato esadecimate, eccetto gli
ultimi tre, che sono rappresentati in decimale.
FILE
/proc/net/ip_acct
/proc/net/ip_input
/proc/net/ip_output
/proc/net/ip_forward
/proc/net/ip_masquerade
ERRORI
VEDERE ANCHE
setsockopt(2), socket(2), ipfwadm(8)
AUTORE
Index
- NOME
-
- SINTASSI
-
- DESCRIZIONE
-
- COMANDI
-
- STRUTTURE
-
- VALORE RESTITUITO
-
- REGOLE DI STAMPA
-
- FILE
-
- ERRORI
-
- VEDERE ANCHE
-
- AUTORE
-
This document was created by
man2html,
using the manual pages.
Time: 23:03:52 GMT, June 17, 2008