La system call setsockopt
La gestione del firewall e dell'accounting può essere cambiata attraverso chiamate alla system call setsockopt. Questo è il metodo più a basso livello per interagire con il firewall. Infatti per usare questa system call bisogna scrivere un programma in linguaggio C; ma cosa più importante bisogna avere una buona padronanza della programmazione orientata alle applicazione di rete. Ora si fornisce una panoramica sulla sintassi di questa funzione.
#include <sys/types.h>
int setsockopt (int socket, IPPROTO_IP, int command, void *data, int length)
Il primo argomento è un socket IP di tipo "raw".
Il secondo è una costante e indica che ci riferiamo al livello
IP. L'ultimo argomento è la lunghezza di ciò che è
puntato da data.
command e data Si possono usare i seguenti comandi: IP_ACCT_APPEND Aggiungono una regola a una delle liste di accounting o di firewall. In base al comando, la regola viene aggiunta alla lista di accounting, alla lista di ingresso, di uscita, o a quella di inoltro, 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 Questi comandi sono uguali ai comandi di aggiunta, tranne che la regola è inserita all'inizio della lista.
IP_ACCT_DELETE Rimuovono una regola dalle liste di accounting o di firewall. In base al comando, la regola viene rimossa dalla lista per l'accounting, alla lista di ingresso, di uscita, o a quella di inoltro, 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 Azzerano i contatori di pacchetti e di byte in tutte le regole della lista di accounting, alla lista di ingresso, di uscita, o a quella di inoltro, nell'ordine. Si noti che occorre passare alla funzione setsockopt un numero intero come dato relativo a questi comandi, anche se non viene utilizzato.
IP_ACCT_FLUSH Rimuovono tutte le regole dalla lista di accounting, alla lista di ingresso, di uscita, o a quella di inoltro, nell'ordine. Si noti che occorre passare un numero intero come dato di questi comandi, anche se non viene utilizzato.
IP_FW_POLICY_IN Cambiano la risposta di default per la lista di ingresso, di uscita, o quella 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), IP_FW_F_DENY (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 la lista di inoltro 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 struttura che contiene tre campi di tipo int, rappresentati 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 Controllano se un pacchetto verrebbe accettato, ignorato o rifiutato dalla lista di ingresso (IP_FW_CHECK_IN), da quella di uscita (IP_FW_CHECK_OUT), o da quella di inoltro (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.
In caso di successo viene restituito zero. In caso di errore viene restituito -1. Quando viene usato uno dei comandi che controllano un pacchetto, viene restituito 0 se il pacchetto viene accettato senza redirezione o mascheratura. Altrimenti, viene restituito -1 e a errno viene assegnato ECONNABORTED (se il pacchetto è stato accettato con redirezione) ECONNRESET (se il pacchetto è stato accettato con mascheratura) ETIMEDOUT (se il pacchetto è stato ignorato) ECONNREFUSED (se il pacchetto è stato rifiutato). |