Analisi del traffico di rete
Viste le pesanti limitazioni del modello precedente e' necessaria una soluzione meno costosa dal punto di vista computazionale e che possa lavorare piu' a stretto contatto con il firewall, riconoscendo i pacchetti al momento del loro arrivo invece che leggendo la storia recente dai log.
Nei sistemi di packet filter l'analisi del pacchetto avviene ai livelli IP (corrispondente al layer 3, Network), e Transport (layer 4) del modello ISO/OSI, valutando il contenuto dell'header IP e delle intestazioni dei protocolli del livello superiore ( TCP, UDP, ICMP ecc. ).
Di seguito vengono ricapitolati alcuni concetti essenziali per la comprensione dell'argomento, fondamentalmente orientati al protocollo TCP/IP (sebbene sarebbe più opportuno definirlo come una "suite" di protocolli).
Il modello ISO/OSI, rappresentato nella figura successiva, descrive le modalità di interazione tra le componenti di rete hardware e software. I livelli più bassi definiscono il supporto fisico della rete (cavo, scheda di rete, ecc), mentre risalendo verso l'altro ciascuno strato prepara i dati per quello immediatamente superiore.
Il livello fisico (layer 1) è il più basso del modello OSI. Esso trasmette lo stream di bit su un supporto fisico (ad esempio il cavo), ed e' rappresentato dai dispositivi hardware, come la scheda di rete.
Il livello data link (layer 2) si occupa di "impacchettare" i bit ricevuti dal livello fisico per trasformarli in un frame di dati, aggiungendo tra l'altro l'ID del mittente, del destinatario e il campo CRC.
Il livello network (layer 3 ) è responsabile dell'indirizzamento dei pacchetti e della traduzione degli indirizzi da nomi logici a indirizzi fisici. Determina inoltre il percorso del pacchetto (routing) in base alle condizioni della rete, alla priorità di servizio, ecc. E' il layer che si occupa della frammentazione e successivo riassemblaggio di pacchetti le cui dimensioni superano la MTU (Maximum Tansfer Unit, cioe' la grandezza massima del frame fisico) del segmento sul quale un router deve instradarli.
Il livello di trasporto (layer 4) fornisce il controllo di flusso, la gestione degli errori, conferme di avvenuta ricezione, ecc.
Il livello di sessione (layer 5) consente a due applicazioni su differenti computer di comunicare utilizzando una connessione (detta appunto sessione).
Il livello di presentazione (layer 6) determina il formato per lo scambio dei dati tra i vari computer: esso riceve le informazioni dal livello superiore, trasformandole in un formato intermedio facilmente riconoscibile. Esso è il responsabile della conversione del protocollo, della codifica dei dati, di una eventuale conversione del set di caratteri, ecc. Si occupa inoltre della compressione dati, per ridurre il numero di bit che verranno trasmessi.
Il livello applicazione (layer 7) gestisce l'accesso ai servizi da parte delle varie applicazioni, l'accesso generale alla rete, il controllo del flusso e un eventuale recupero in caso di errori.
A livello applicazione, il pacchetto è formato semplicemente dai dati da trasferire, ma appena scende al di sotto del layer 7, la sua struttura viene modificata, e ad esso viene aggiunto un header (contenente informazioni relative al layer stesso). Il body invece contiene i dati, più l'header del livello precedente; questo processo prende il nome di incapsulazione:
Per rilevare in tempo reale le sequenze di knock diventa quindi necessario intervenire sui pacchetti ad un livello inferiore del modello, per la precisione al datalink layer, prima che avvengano le cosiddette routing decisons , ed i pacchetti eventualmente scartati.
Normalmente i sistemi operativi moderni permettono ai processi in userspace (ammesso che abbiano i privilegi necessari) l'accesso al datalink layer, per potere accedere ai frame non appena questi siano stati letti dai device driver della scheda o dell'interfaccia di rete. Il limite in questo caso e' rappresentato dal fatto che la API per l'accesso non e' uguale tra tutti i sistemi operativi: ad esempio i sistemi BSD usano il BPF (Bsd Packet Filter), mentre Linux una speciale famiglia di socket (PF_PACKET).
Una valida soluzione al problema, e' rappresentata dalla libreria LibPcap, che ha il grande pregio di esportare una API unica per l'accesso al datalink layer in maniera portabile tra vari sistemi Unix-like.