IPFW(4) | IPFW(4) |
ipfw - firewall e autenticazione per IP
#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)
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:
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:
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 ).
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
IP_ACCT_INSERT
IP_FW_INSERT_IN
IP_FW_INSERT_OUT
IP_FW_INSERT_FWD
IP_ACCT_DELETE
IP_FW_DELETE_IN
IP_FW_DELETE_OUT
IP_FW_DELETE_FWD
IP_ACCT_ZERO
IP_FW_ZERO_IN
IP_FW_ZERO_OUT
IP_FW_ZERO_FWD
IP_ACCT_FLUSH
IP_FW_FLUSH_IN
IP_FW_FLUSH_OUT
IP_FW_FLUSH_FWD
IP_FW_POLICY_IN
IP_FW_POLICY_OUT
IP_FW_POLICY_FWD
IP_FW_MASQ_TIMEOUTS
IP_FW_CHECK_IN
IP_FW_CHECK_OUT
IP_FW_CHECK_FWD
La struttura ip_fw contiene i seguenti campi che devono essere riempiti al fine di aggiungere o cancellare una regola:
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.
La struttura R ip_fwpkt , usata nel controllo dei pacchetti, contiene i seguenti campi:
struct tcphdr fwp_protoh.fwp_tcph
struct udphdr fwp_protoh.fwp_udph
struct icmphdr fwp_protoh.fwp_icmph
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).
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.
/proc/net/ip_acct
/proc/net/ip_input
/proc/net/ip_output
/proc/net/ip_forward
/proc/net/ip_masquerade
17 giugno 1996 |