Torna al blog

L'architettura di Iptables e Netfilter

L'architettura di Iptables e Netfilter

Un firewall è un dispositivo di sicurezza (hardware/software) che protegge la rete filtrando il traffico e bloccando l'accesso indesiderato/non autorizzato ai dati privati. Avere un firewall adeguato è importante per proteggere i server e l'infrastruttura. Non solo può bloccare il traffico indesiderato, ma può anche impedire al software dannoso di infettare il sistema.

Nell'ecosistema Linux, iptables è un firewall popolare che si interfaccia con il netfilter framework sul kernel Linux. La maggior parte dei sistemi Linux moderni viene fornita con questi strumenti preinstallati. Per sfruttare al meglio questi sistemi, è fondamentale comprenderne le architetture. Altrimenti, sviluppare politiche di firewall affidabili può essere scoraggiante. Potrebbe portare alla creazione di sintassi complicate, parti correlate nel framework, ecc.

Questa guida approfondirà l'architettura di iptables per aiutare gli utenti che hanno bisogno di creare le proprie politiche di firewall. Esploreremo anche come iptables si interfaccia con netfilter e come i vari componenti si integrano tra loro.

Iptables e Netfilter

In Linux, il iptables firewall è il più comune. Funziona interfacciandosi con gli hook di filtraggio dei pacchetti nello stack di rete del kernel Linux. Sono questi hook del kernel che vengono collettivamente definiti come il netfilter framework.

Ogni pacchetto in entrata/uscita nel sistema attiverà questi hook man mano che avanza nello stack. Pertanto, i programmi registrati con questi hook sono in grado di interagire con il traffico in punti chiave. Infine, i moduli del kernel associati a iptables si connettono a questi hook per applicare le regole di firewall specificate.

Hook di Netfilter

Affinché i programmi si connettano, ci sono cinque diversi netfilter hook. Man mano che i pacchetti avanzano nello stack, gli hook attivano i moduli del kernel registrati con essi. La condizione di attivazione dipende da fattori quali:  la direzione del pacchetto (in entrata/in uscita), la destinazione del pacchetto, se il pacchetto è stato scartato/rifiutato in un punto precedente, ecc.

Questi sono gli hook che rappresentano vari punti ben definiti nello stack di rete:

  • NF_IP_PRE_ROUTING: Questo hook viene attivato da qualsiasi traffico in entrata. L'attivazione avviene prima che venga presa qualsiasi decisione di instradamento riguardante la destinazione del pacchetto.

  • NF_IP_LOCAL_IN: Questo hook viene attivato dopo l'instradamento di un pacchetto in entrata. Il pacchetto deve anche essere destinato al sistema locale.

  • NF_IP_FORWARD: Anche questo hook viene attivato dopo l'instradamento di un pacchetto in entrata. Tuttavia, si attiva se il pacchetto deve essere instradato verso un altro host.

  • NF_IP_LOCAL_OUT: Qualsiasi traffico locale in uscita, non appena colpisce lo stack di rete, attiva questo hook.

  • NF_IP_POST_ROUTING: Questo hook viene attivato da qualsiasi traffico in uscita/inoltrato dopo che è avvenuto l'instradamento, prima che il pacchetto raggiunga il cavo.

I moduli del kernel che desiderano registrarsi su questi hook devono fornire un numero di priorità. Questo valore aiuta a determinare l'ordine in cui verranno chiamati una volta attivato l'hook. Tale meccanismo consente a più moduli (moduli diversi o più copie dello stesso modulo) di connettersi a ciascuno degli hook in un ordine deterministico. Ciascun modulo restituirà una decisione al framework netfilter dopo aver elaborato i pacchetti.

Tabelle e catene in Iptables

Per organizzare le sue regole, il firewall iptables utilizza le tabelle. Le tabelle categorizzano le regole in base al tipo di decisioni che prendono. Ad esempio, se una regola riguarda il NAT (network address translation), allora la regola viene inserita nella tabella nat . Allo esso modo, se una regola decide se consentire/negare un pacchetto alla sua destinazione, viene aggiunta alla tabella filter .

All'interno di ciascuna tabella di iptables, le regole sono ulteriormente organizzate all'interno di separate “catene”. Mentre la tabella rappresenta il tipo di regole che contiene, le catene descrivono gli hook di netfilter che attivano le regole. In breve, le catene determinano quando la regola verrà valutata.

Ecco le catene predefinite di iptables. Interessante notare che anche i nomi delle catene rispecchiano il nome degli associati netfilter hook:

Catena (iptables) Utilizzo
PREROUTING NF_IP_PRE_ROUTING
INPUT NF_IP_LOCAL_IN
FORWARD NF_IP_FORWARD
OUTPUT NF_IP_LOCAL_OUT
POSTROUTING NF_IP_POST_ROUTING

Utilizzando le catene, gli amministratori possono determinare in quale fase della consegna dei pacchetti verrà valutata la regola. Poiché ogni tabella contiene più catene, può anche estendere la sua influenza in più punti dell'elaborazione. Certe decisioni hanno senso solo in determinati punti dello stack di rete. Pertanto, non tutte le tabelle avranno una catena registrata con ciascun hook del kernel.

Il netfilter framework offre solo 5 hook del kernel. Pertanto, le catene di più tabelle sono registrate in corrispondenza di ciascun hook. Ad esempio, se tre catene hanno le catene PREROUTING , allora sono registrate con l’hook NF_IP_PRE_ROUTING . Ciascuna di esse deve fornire una priorità che decide in quale ordine la catena PREROUTING di ciascuna tabella viene chiamata. La catena PREROUTING con la priorità più alta viene valutata per prima, quella con la priorità successiva per seconda, e così via.

Le tabelle di iptables

Facciamo un passo indietro e diamo un’occhiata alle tabelle offerte da iptables . Come menzionato in precedenza, ogni tabella rappresenta diversi set di regole, organizzati per area di competenza, per la valutazione dei pacchetti.

  • Tabella filter

In iptables , la tabella filter è una delle più popolari. Viene utilizzata per determinare se a un pacchetto sarà consentito di proseguire verso la sua destinazione o meno. Nella terminologia dei firewall, questo processo è noto come “filtraggio” dei pacchetti.

Sono le funzioni della tabella filter a cui le persone si riferiscono quando parlano di firewall (nella maggior parte dei casi).

  • Tabella nat

Questa tabella implementa le regole che regolano il NAT. Quando i pacchetti entrano nello stack di rete, le regole descritte in questa tabella decidono come modificare l’indirizzo di origine/destinazione del pacchetto, influenzando l’instradamento del pacchetto e l’eventuale traffico di risposta.

Spesso, la tabella nat viene utilizzata per instradare i pacchetti verso reti a cui non c’è accesso diretto.

  • Tabella mangle

Questa tabella contiene le regole che modificano gli header IP dei pacchetti in vari modi. Ad esempio, può modificare il valore TTL (Time to Live) di un pacchetto allungando/accorciando il numero di hop di rete validi che il pacchetto può sostenere. Inoltre, la tabella mangle può modificare altri header IP in modo simile.

Questa tabella è anche autorizzata a inserire un “marchio” (mark) interno del kernel sul pacchetto che altre tabelle e strumenti di rete possono rilevare per un’ulteriore elaborazione. Questo marchio non tocca il pacchetto effettivo ma, piuttosto, aggiunge il marchio alla rappresentazione del pacchetto da parte del kernel.

  • Tabella raw

Il firewall iptables è stateful, il che implica che i pacchetti vengono valutati nel contesto della loro relazione con i pacchetti precedenti. La funzionalità di tracciamento delle connessioni sviluppata sopra il framework netfilter consente a iptables di visualizzare i pacchetti come parte di una connessione o sessione in corso piuttosto che come un flusso di pacchetti discreti e non correlati. In genere, la logica di tracciamento delle connessioni viene applicata subito dopo che il pacchetto raggiunge l’interfaccia di rete.

La tabella raw ha una funzione definita in modo molto ristretto. L’unico scopo di questa tabella è fornire un meccanismo per contrassegnare i pacchetti al fine di escluderli dal tracciamento delle connessioni.

  • Tabella security

La tabella security inserisce marchi di contesto di sicurezza SELinux interni sui pacchetti. Questo, a sua volta, influisce su come SELinux (o qualsiasi altra applicazione che interpreta i contesti di sicurezza SELinux) gestirà i pacchetti.

I marchi SELinux possono essere applicati per singolo pacchetto o per singola connessione.

Catene implementate in ciascuna tabella

Finora abbiamo parlato di tabelle e catene separatamente. È il momento di esaminare quali catene sono disponibili in ciascuna tabella. Questo argomento estende la discussione sull’ordine di valutazione delle catene registrate sullo stesso hook. Ad esempio, cosa succede se tre tabelle hanno catene PREROUTING ? Qual è il loro ordine di valutazione?

Successivamente, dai un’occhiata alla tabella seguente. Indica le catene disponibili all’interno di ciascuna iptables tabella.

  PREROUTING INPUT FORWARD OUTPUT POSTROUTING

(decisione di routing)

raw

(tracciamento delle connessioni abilitato)

mangle

nat (DNAT)

(decisione di routing)

filter

security

nat (SNAT)

Se letta da sinistra a destra, descrive quali tabelle contengono quali catene. Ad esempio, la raw tabella ha sia le catene PREROUTING che OUTPUT . Se letta dall’alto in basso, descrive in quale ordine viene chiamata ciascuna catena quando il relativo netfilter hook viene attivato.

Nota che la tabella nat è stata suddivisa tra operazioni DNAT (che modificano la destinazione di un pacchetto) e operazioni SNAT (che modificano l’origine di un pacchetto) per specificare il loro ordine in modo più chiaro. La tabella include anche punti di rappresentazione in cui vengono prese le decisioni di routing e in cui è abilitato il tracciamento delle connessioni.

Gli hook (colonne) che un pacchetto attiverà si basano sulla natura del pacchetto (in entrata/in uscita), sulle decisioni di routing prese e sul fatto che un pacchetto soddisfi o meno i criteri di filtraggio.

Alcuni eventi possono saltare la catena di una tabella durante l’elaborazione. Ad esempio, solo il primo pacchetto di una connessione verrà valutato rispetto alle regole NAT come descritto dalla tabella nat . A qualsiasi pacchetto successivo nella stessa connessione verranno applicate le stesse decisioni nat senza alcuna valutazione aggiuntiva. Alle risposte alle connessioni NAT verranno applicate automaticamente le regole NAT inverse per un corretto routing.

Ordine di attraversamento delle catene

Supponendo che il server conosca le regole di routing dei pacchetti e che le regole del firewall consentano la trasmissione, i seguenti flussi rappresentano il modo in cui verranno attraversati i diversi percorsi:

  • Pacchetti in entrata destinati al sistema locale: PREROUTING >> INPUT

  • Pacchetti in entrata destinati a un altro host: PREROUTING >> FORWARD >> POSTROUTING

  • Pacchetti generati localmente: OUTPUT >> POSTROUTING

In conclusione, combinando tutte le informazioni discusse finora, possiamo vedere che qualsiasi pacchetto in entrata destinato al sistema locale sarà valutato rispetto alle catene PREROUTING delle tabelle raw, mangle, e nat . Successivamente, passerà attraverso le catene INPUT delle tabelle mangle, filter, security, e nat prima di raggiungere infine il socket locale.

Regole di iptables

Le regole del firewall iptables sono collocate all’interno di una catena specifica di una tabella specifica. Quando viene chiamata una catena, il pacchetto in questione verrà valutato rispetto a ciascuna regola della catena. Ogni regola ha due componenti: un componente di corrispondenza e un componente di azione.

  • Corrispondenza

La parte di corrispondenza di una regola specifica le condizioni che un pacchetto deve soddisfare prima che venga eseguita l’azione specificata (o “target”).

Il sistema di corrispondenza offre un’incredibile flessibilità. Le sue funzionalità possono anche essere estese con l’aiuto delle estensioni di iptables. Le regole possono essere descritte per far corrispondere i pacchetti in base al tipo di protocollo, indirizzo di origine/destinazione, porta di origine/destinazione, rete di origine/destinazione, interfaccia di input/output, intestazioni, stato della connessione e altri criteri. Una regola può anche presentare una combinazione di queste condizioni, dando vita a set di regole complessi per differenziare i diversi tipi di traffico.

  • Target

Un target è l’azione intrapresa quando un pacchetto soddisfa i criteri di corrispondenza di una regola. In genere, i target sono divisi in due gruppi:

    • Target di terminazione: termina il processo di valutazione all’interno della catena e restituisce il controllo all’hook netfilter . In base al valore restituito, l’hook consentirà al pacchetto di continuare il suo percorso o lo scarterà.

    • Target di non terminazione: il target esegue un’azione e la valutazione nella catena continua. Sebbene ogni catena debba passare attraverso una decisione finale di terminazione, prima di essa può essere eseguito un numero qualsiasi di target di non terminazione.

La disponibilità di ciascun target all'interno delle regole dipende dal contesto. Ad esempio, il tipo di catena e di tabella può influire sulla disponibilità dei target. Altri possibili fattori includono le estensioni attivate nella regola e le clausole di corrispondenza.

Catene definite dall'utente

Esiste anche una classe speciale di target non terminali: il target jump. I target jump sono azioni eseguite quando la valutazione passa da una catena all'altra per un'ulteriore elaborazione. Finora abbiamo parlato di catene integrate che sono strettamente collegate ai netfilter hook che le chiamano. Tuttavia, iptables consente anche agli amministratori di creare le proprie catene personalizzate.

Le regole nelle catene definite dall'utente sono simili a quelle delle catene integrate. La differenza fondamentale è che le catene definite dall'utente sono raggiungibili solo tramite un “salto” (jump) da una regola. Questo perché le catene definite dall'utente non sono collegate ad alcun netfilter hook.

Si può pensare alle catene definite dall'utente come a estensioni della catena che le ha originariamente chiamate. Ad esempio, in una catena definita dall'utente, la valutazione tornerà alla catena chiamante se raggiunge la fine dell'elenco delle regole o se una regola corrispondente esegue un RETURN target. È interessante notare che una catena definita dall'utente può anche far “saltare” la valutazione a un'altra catena definita dall'utente.

Questa funzionalità getta le basi per una migliore organizzazione e la struttura necessaria per una ramificazione robusta.

Tracciamento delle connessioni

Quando abbiamo discusso della raw tabella e dei criteri di corrispondenza dello stato della connessione, abbiamo discusso del sistema di tracciamento delle connessioni implementato sopra il netfilter framework. Questa funzionalità consente a iptables  di visualizzare i pacchetti nel contesto di una connessione in corso. Il sistema di tracciamento delle connessioni fornisce inoltre a iptables la funzionalità necessaria per eseguire operazioni “stateful”.

Subito dopo che un pacchetto entra nello stack di rete, viene applicato il tracciamento delle connessioni. Le catene della tabella raw e alcuni controlli di integrità di base costituiscono tutta la logica necessaria per associare i pacchetti a una connessione.

Il sistema controlla ogni pacchetto rispetto a un insieme di connessioni esistenti. Se necessario, il sistema aggiornerà lo stato delle connessioni esistenti o ne creerà di nuove. I pacchetti contrassegnati con il target NOTRACK in qualsiasi catena della tabella raw salteranno le successive routine di tracciamento delle connessioni.

  • Stati disponibili

Alle connessioni tracciate dal sistema di tracciamento delle connessioni verrà assegnato uno dei seguenti stati:

    • NEW : All'arrivo di un pacchetto che non è associato a una connessione esistente ma non è non valido come primo pacchetto, viene aggiunta una nuova connessione al sistema con questa etichetta. Ciò avviene sia per i protocolli orientati alla connessione (TCP, ad esempio) sia per i protocolli senza connessione (UDP, ad esempio).

    • ESTABLISHED: Lo stato di una connessione viene aggiornato da NEW  a ESTABLISHED quando riceve una risposta valida dalla direzione opposta. Per le connessioni TCP, indica un SYN/ACK. Per il traffico UDP e ICMP, indica una risposta in cui la sorgente e la destinazione del pacchetto originale sono invertite.

    • RELATED: I pacchetti che non fanno parte di una connessione ma sono correlati a una connessione stabilita vengono etichettati come RELATED . Può indicare una connessione ausiliaria (ad esempio, nella connessione di trasmissione dati FTP) o risposte ICMP a tentativi di connessione da parte di altri protocolli.

    • INVALID: I pacchetti che non fanno parte di una connessione stabilita, sono ritenuti non idonei per l'apertura di una nuova connessione, non possono essere identificati, non sono instradabili ecc. vengono etichettati come INVALID.

    • UNTRACKED: Un pacchetto può essere etichettato come UNTRACKED se è stato indirizzato in una catena della tabella raw per bypassare il tracciamento.

    • SNAT: Indica uno stato virtuale impostato quando l'indirizzo sorgente viene modificato da un'operazione NAT. Viene gestito dal sistema di tracciamento delle connessioni in modo che gli indirizzi sorgente vengano tradotti nei pacchetti di risposta.

    • DNAT: Simile a SNAT, indica uno stato virtuale in cui l'indirizzo di destinazione viene modificato da un'operazione NAT. Il sistema di tracciamento delle connessioni lo gestisce in modo da sapere come ritradurre l'indirizzo di destinazione quando instrada i pacchetti di risposta.

Questi stati tracciati dal sistema di tracciamento delle connessioni consentono agli amministratori di creare regole specifiche destinate a punti specifici del ciclo di vita di una connessione. Fornisce le funzionalità necessarie per regole più approfondite e sicure.

Considerazioni finali

In Linux, il netfilter framework e il iptables firewall fungono da base per la maggior parte dei firewall. Gli hook di netfilter sono sufficientemente vicini allo stack di rete da consentire un controllo potente sui pacchetti elaborati dal sistema. Sfruttando queste capacità, il iptables firewall offre un modo flessibile per comunicare i requisiti di policy al kernel.

Questa guida approfondisce la struttura interna del netfilter framework e del iptables firewall. Inoltre, discute il sistema di tracciamento delle connessioni. Comprendendo come questi elementi si incastrano tra loro, potrai utilizzarli al meglio per creare ambienti server più robusti e sicuri.

Infine, sebbene questa guida affronti il funzionamento interno, dai un'occhiata a questa guida su come configurare iptables per applicarli all'atto pratico. Inoltre, puoi vedere come il firewall UFW semplifichi ulteriormente iptables. Inoltre, sarà utile imparare a elencare ed eliminare le regole del firewall iptables.

Buon computing!

author

Preslav Dobrev

Autore · CloudSigma

Preslav Dobrev è un designer creativo presso CloudSigma, con un focus su un'identità aziendale coerente attraverso l'uso di canali di marketing tradizionali e innovativi. È abile nel fondere la visione artistica con il marketing strategico per creare narrazioni di brand di grande impatto.

Commenti

Ancora nessun commento. Scrivi il primo.