next   previous   contents

La libreria LibNet

 Libnet e' una libreria in linguaggio C che permette allo sviluppatore di costruire pachetti di rete, scavalcando lo stack Tcp/Ip del Kernel.. Essa fornisce un'interfacca semplice e portabile per le operazioni di packet shaping, handling ed injection, evitando al programmatore gran parte del lavoro necessario per la creazione del pacchetto stesso. Tra i principali vantaggi offerti dalla libreria si possono annoverare :

 Sfruttando questa libreria, la costruzione e l'invio di un pacchetto di rete arbitrario diventa un'operazione relativamente semplice, che puo' essere riassunta nei tre passi successivi :

 Per prima cosa e' necessario creare un descrittore da utilizzare nelle operazioni successive, ovvero un puntatore di tipo libnet_t, che punta ad una struttura dati, dove viene mantenuto lo stato dell'intera sessione di creazione dei pacchetti. L'operazione viene effettuata per mezzo di una chiamata alla funzione libnet_init, che ha inoltre il compito di inizializzare la libreria, specificando l'interfaccia da utilizzare e l'injection type ovvero un intero che indica alla libreria l'interfaccia da utilizzare per la costruzione e l'invio dei pacchetti.

 Infatti, secondo l'injection type specificato la LibNet puo' inizializzare le injection primitives per l'interfaccia link-layer o raw-socket. Il primo injection type, LIBNET_LINK, permette allo sviluppatore di costruire i pacchetti partendo dal datalink layer, consendendo quindi una maggiore granularita' nel controllo rispetto all'interfaccia raw socket, che lavora invece sul terzo livello del modello ISO/OSI. Per le raw socket sono inoltre previste due interfacce distinte: LIBNET_RAW4 per il protocollo IPv4 e LIBNET_RAW6 per il piu' recente IPv6.
 Esistono infini tre ulteriori injection types: LIBNET_LINK_ADV, LIBNET_RAW4_ADV, e LIBNET_RAW6_ADV. Essi permettono di inizializzare la libreria in modalita' avanzata, consentendo l'utilizzo di alcune funzioni aggiuntive.
 Avvenuta l'inizializzazione e creato il descrittore e' possibile passare alla costruzione dei pacchetti. Tale operazione avviene in maniera “modulare”, sfruttando le Packet Builder Functions per i vari protocolli messe a disposizione dalla libreria. Ogni fuzione del tipo libnet_build_xxx puo' essere utilizzata per costruire una parte di pacchetto (solitamente un header). Generalmente e' necessario chiamare piu' funzioni differenti per la costruzione dell'intero pacchetto, poiche' esso e' costituito da piu' parti incapsulate
 Ogni funzione riceve una serie di argomenti, che corrispondono ai valori da assegnare ai vari campi dell'header. Sebbene un simile prototipo di funzione sia estremamente intuitivo, ha lo svantaggio di avere una lunga serie di parametri e l'elevata dimensione dei frames di attivazione sullo stack.
 E' inoltre fondamentale sottolineare come l'ordine con cui vengono chiamate le funzioni sia essenziale, per collegare correttamente tra loro le diverse parti del pacchetto. Tali funzioni devono infatti essere chiamate nell'ordine che corrisponde a come i vari header siano incapsulati nel pacchetto, partendo da quello di piu' alto livello e scendendo verso il basso nel modello ISO/OSI. Questo processo di costruzione e' molto intuitivo, poiche' imita cio' che realmente accade nel kernel del sistema operativo.
 Ad esempio, per costruire un pacchetto TCP utilizzando l'interfaccia link-layer andranno chiamate le build functions nel seguente ordine :

1. libnet_build_tcp
2. libnet_build_ipv4
3. libnet_build_ethernet


 Se anziche' il link-layer si fossero utilizzate come injection type le raw socket, sarebbero state sufficienti solo le prime due chiamate per la costruzione del pacchetto.

 L'ultimo passo da eseguire e' l'invio in rete del pacchetto costruito con la funzione libnet_write, che provvedera' ad inviarlo tramite l'interfaccia raw socket o link-layer, a seconda di quanto specificato nella struttura libnet_t puntata dal descrittore precedentemente creato e passatole all'invocazione. Si sottolinea inoltre come l'utilizzo dell'interfaccia link-layer garantisca una migliore portabilita', ma essendo caratterizzata da una complessita' maggiore richieda piu' lavoro da parte del programmatore.
 Terminato l'invio dei pacchetti e' buona norma liberare la memoria usata dalle strutture associate al descrittore utilizzato, con la funzione libnet_destroy.

next   previous   contents