Provided by:
manpages-it_0.3.4-5_all 
NOME
ipfw - firewall e accounting 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 accounting del kernel Linux offrono il
meccanismo per il conteggio dei pacchetti IP, per costruire dei
firewall basati sul filtraggio dei pacchetti, per costruire dei
firewall basati sul "proxy" trasparerente (ridirigendo i pacchetti ad
un socket locale), e per effettuare la mascheratura dei pacchetti
diretti all’esterno. La gestione di queste funzionalità è basata su
quattro liste 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 usati, numeri di porta e
altre caratteristiche dei pacchetti. Un pacchetto corrisponderà ad una
regola ("match") qyando le caratteristiche del pacchetto corrispondono
a quelle della regola. Le quattro categorie di regole sono:
Accounting
Le regole di accounting 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 entranti.
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 ("policy") da tenere e provoca un
aggiornamento dei contatori di pacchetti e di byte per la
regola. Quando non vengono trovate corrispondenze tra le regole
ed il pacchetto, viene usata la policy di default per il
firewall di ingresso.
Firewall di uscita
Queste regole definiscono i permessi per la trasmissione di
pacchetti IP. Tutti i pacchetti che stanno 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 tra le regole ed il pacchetto, viene usata la
policy di default per il firewall di uscita.
Firewall passante
Queste regole definiscono i permessi per la ritrasmissione 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 passante. 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 tra le regole ed il
pacchetto, viene usata la policy di default per il firewall
passante.
Tutte le regole di firewall (non quelle di conteggio) contengono una
policy che specifica quale azione deve essere intrapresa quando un
pacchetto corrisponde a tale regola. Ci sono 3 differenti
comportamenti possibili: accept (lascia passare il pacchetto), reject
(non accetta il pacchetto e manda un messaggio "ICMP host unreachable"
al mittente del pacchetto), e deny (ignora il pacchetto senza mandare
notifiche al mittente). Per tutti e tre i tipi di firewall esiste
anche un comportamento di default, 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 calcolatore e/o un altro
numero di porta. Questa funzionalità può essere usata solo con
pacchetti TCP o UDP.
Le regole passanti ("forwarding") definiscono anche se i pacchetti
devono essere mascherati ("maquerading") quando vengono ritrasmessi.
In questo caso, l’indirizzo del mittente del pacchetto IP viene
rimpiazzato con l’indirizzo del calcolatore 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 ritrasmettere
il pacchetto. Siccome questo tipo di gestione viene effettuato dal
kernel, i pacchetti di risposta (mandati al numero di porta temporanea
del calcolatore 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ò solo essere usata con i pacchetti TCP o UDP.
Questo paragrafo descrive il modo in cui un pacchetto attraversa il
firewall e le regole di accounting. Un pacchetto ricevuto da una delle
interfacce di rete locali passerà attraverso i seguenti gruppi di
regole:
accounting (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 sara opzionalmente
ridiretto ad un socket locale. Quando il pacchetto deve essere
ritrasmesso ad un calcolatore remoto, passerà anche attraverso questo
insieme di regole:
firewall di uscita (dispositivo di uscita)
accounting (dispositivo di uscita)
Si noti che i pacchetti mascherati passano attraverso le regole del
firewall di uscita e di accounting dopo l’assegnazione dei nuovi header
(mentre il firewall di ingresso e quello di ritrasmissione vengono
attraversati con gli header originali). Inoltre, le risposte ai
pacchetti mascherati avranno header differenti quando passanto
attraverso le regole dei firewall di ingresso e uscita.
La gestione del firewall e dell’accounting può essere cambiata
attraverso chiamate a setsockopt(2). Le regole attualemente attive nel
sistema possono essere osservate guardando i seguenti quattro file
nella directory /proc/net: ip_acct, ip_input, ip_output, e ip_forward.
Lo stato attuale delle 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
ip_forward).
COMANDI
I comandi per cambiare le liste di regole o i comportamenti di default
devono essere passati come opzione alla chiamata di sistema
setsockopt(2), che opera su un socket IP "raw". La maggior parte dei
comandi richiede il passaggio di dati aggiuntivi. Un puntatore a
questi data e la loro lunghezza vengono passati a 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 una delle liste di accounting o di
firewall. In base al comando, la regola viene aggiunta alla
lista di accounting, al firewall di ingresso, di uscita, o a
quello passante, nell’ordine. La nuova regola viene aggiunta in
coda alla lista. Il dato passato con questi comandi è una
struttura 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
regola è inserita all’inizio della lista.
IP_ACCT_DELETE
IP_FW_DELETE_IN
IP_FW_DELETE_OUT
IP_FW_DELETE_FWD
Rimuovono una regola dalle liste di accounting o di firewall.
In base al comando, la regola viene rimossa dalla lista per
l’accounting, dal firewall di ingresso, di uscita, o da quello
passante, nell’ordine. Il dato passato con questi comandi è una
struttura ip_fw, che definisce i contenuti della regola da
rimuovere. Viene rimossa dalla lista la prima regola che
corrisponda 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 accounting, del firewall di ingresso, di uscita,
o di quello passante, nell’ordine. Si noti che occorre passare
alla funzione setsockopt un numero intero come dato relativo a
questi comandi, anche se non viene utilizzato. Vedere anche la
descrizione dei file /proc/net per sapere un modo per 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 accounting, del
firewall di ingresso, di uscita, o di quello passante,
nell’ordine. Si noti che occorre passare un numero intero come
dato di questi comandi, anche se non viene utilizzato.
IP_FW_POLICY_IN
IP_FW_POLICY_OUT
IP_FW_POLICY_FWD
Cambiano la risposta di default per il firewall di ingresso,
quello di uscita e quello passante. 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 alcuna notifica al mittente). Il comportamento
specificato viene usato quando nessuna delle regole disponibili
nella lista appropriata si applica al pacchetto in questione.
Per il firewall passante, il comportamento può anche essere
specificato come IP_FW_F_ACCEPT | IP_FW_F_MASQ ®(accetta un
pacchetto da ritrasmettere, ma effettuando il mascheramento nel
caso di pacchetti TCP o UDP).
IP_FW_MASQ_TIMEOUTS
Assegna i valori di timeout usati per la mascheratura. Il dato
passato insieme a questo comando è una strutturea che contiene
tre campi di tipo int, rapprsentanti 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 accetato, ignorato o
rifiutato dal firewall di ingresso (IP_FW_CHECK_IN), da quello
di uscita (IP_FW_CHECK_OUT), o da quello passante
(IP_FW_CHECK_FWD). Il dato passato con questi comandi è una
struttura ip_fwpkt, che definisce gli header del pacchetto da
controllare e l’indirizzo dell’interfaccia usata.
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 del mittente ("source") e del destinatario.
struct in_addr fw_smsk, fw_dmsk
Maschere (di tipo "netmask") per gli indirizzi del mittente e
del destinatario. Si noti che una maschera posta a 0.0.0.0
risulta in una corrispondenza con 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: viene usato per
indicare una qualsiasi interfaccia.
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: viene usata per indicare una
qualsiasi interfaccia.
unsigned short fw_flg
"Flag" per questa regola. I bit per le differenti opzioni
possono venire associati tramite un’operazione di OR. I flag
includono le seguenti informazioni.
Il protocollo (obbligatorio). I valori possibili sono
IP_FW_F_TCP (TCP), IP_FW_F_UDP (UDP), IP_FW_F_ICMP (ICMP), e
IP_FW_F_ALL (tutti i protocolli, usato per definire una regola
universale di firewall o di conteggio).
Il comportamento da tenere quando un pacchetto corrisponde alle
condizioni poste da 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 al mittente. Si noti che la specifica di comportamento
non viene usata dalle regole di accounting.
Redirezione e mascheramento sono specificati anch’essi tramite
due flag: IP_FW_F_REDIR redirige un pacchetto ad un socket
locale dopo averlo accettato (il socket è specificato da un
numero diporta, 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 dopo averlo accettato. Questo bit è valido solo nelle
regole del firewall passante 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 ad entrambe le direzioni), IP_FW_F_TCPACK (seleziona
solo i pacchetti TCP con il bit ACK attivo nell’header TCP,
opzione ignorata con altri protocolli), IP_FW_F_TCPSYN
(seleziona solo i pacchetti TCP con il bit SYN attivo 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 entranti o uscenti; queste opzioni hanno solo
effetto nelle regole di accounting), IP_FW_F_SRNG, e
IP_FW_F_DRNG (vedere sotto per una descriszione di questi flag).
L’opzione IP_FW_F_PRN può essere usata per stampare tramite
printk() alcune informazioni riguardo ai pacchetti selezioanati.
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 poi
questa porta di redirezione è 0, allora la porta di destinazione
originale 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 un
intervallo di porte, ma solo uno. In questo caso, le prime due
porte della lista 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 del destinatario
sono ignorate. Siccome il secondo frammento e i seguenti di un
pacchetto TCP o UDP non contengono numeri di porte, questi
pacchetti ai fini dell’accounting 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’accounting 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 fw_tosxor.
Qeusti campi sono ignorati nelle regole di accounting e in
quelle del firewall che rifiutano o ignorano i pacchetti.
La struttura 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 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 i una unione chiamata
fwp_protoh. Vedere <linux/tcp.h>, <linux/udp.h>, e
<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 assegnato correttametne. Vedere
setsockopt(2) per una lista dei possibili codici di errore. Quando
viene usato uno dei due comandi che controllano un pacchetto, viene
ritornato zero quando il pacchetto verrebbe accetato senza redirezione
o mascheratura. Altrimenti, viene ritornato -1 e errno viene assegnato
a ECONNABORTED (il pacchetto sarebbe accettato con redirezione),
ECONNRESET (il pacchetto sarebbe accettato con mascheratura), ETIMEDOUT
(il pacchetto sarebbe ignorato), o ECONNREFUSED (il pacchetto sarebbe
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 trgole di
accounting 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 passante). 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 di default corrispondente
(uno tra IP_FW_F_ACCEPT, IP_FW_F_ICMPRPL, e zero; il comportamento del
firewall passante può anche valere IP_FW_F_ACCEPT | IP_FW_F_MASQ).
Ogni riga di testo seguente elenca nel seguente ordine i contenuti di
una regola: indirizzo e netmask del mittente, indirizzo e netmask del
destinatario, 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 di rete vengono stampati come
otto cifre esadecimali, le maschere TOS vengono stampate com due cifre
esadecimali precedute dalla lettera A o X, 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 corrente.
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 "UDP"), indirizzo e numero di porta del
mittente, indirizzo e numero di porta del destinatario, 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
VEDERE ANCHE
setsockopt(2), socket(2), ipfwadm(8)
17 giugno 1996 IPFW(4)