|
|
IPFW
Section: (4) Updated: 17 giugno 1996 Index
Return to Main Contents
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)
Index
- NOME
-
- SINTASSI
-
- DESCRIZIONE
-
- COMANDI
-
- STRUTTURE
-
- VALORE RESTITUITO
-
- REGOLE DI STAMPA
-
- FILE
-
- VEDERE ANCHE
-
|