ipfw(4) 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

AUTORE