IPFW(4)

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)