Un Approfondimento sull’Architettura di Iptables e Netfilter

Introduzione

I firewall sono uno strumento importante che può essere configurato per proteggere i tuoi server e l’infrastruttura. Nell’ecosistema Linux, iptables è uno strumento firewall ampiamente utilizzato che funziona con il framework di filtraggio dei pacchetti netfilter del kernel. La creazione di politiche di firewall affidabili può essere intimidatoria, a causa della sintassi complessa e del numero di parti interrelate coinvolte.

In questa guida, approfondiremo l’architettura di iptables con l’obiettivo di renderla più comprensibile per gli utenti che hanno bisogno di creare le proprie politiche di firewall. Discuteremo di come iptables interagisce con netfilter e di come i vari componenti si integrano per fornire un sistema di filtraggio completo.

Cosa sono IPTables e Netfilter?

Per molti anni, il software firewall più comunemente usato in Linux era chiamato iptables. In alcune distribuzioni, è stato sostituito da un nuovo strumento chiamato nftables, ma la sintassi di iptables è ancora comunemente utilizzata come base. Il firewall iptables funziona interagendo con i punti di aggancio per il filtraggio dei pacchetti nello stack di rete del kernel Linux. Questi punti di aggancio del kernel sono noti come il framework netfilter. Ogni pacchetto che passa attraverso il livello di rete (in ingresso o in uscita) attiverà questi punti di aggancio, consentendo ai programmi di interagire con il traffico nei punti chiave. I moduli del kernel associati a iptables si registrano con questi punti di aggancio per garantire che il traffico sia conforme alle condizioni stabilite dalle regole del firewall.

Ogni pacchetto che passa attraverso il livello di rete (in ingresso o in uscita) attiverà questi punti di aggancio, consentendo ai programmi di interagire con il traffico nei punti chiave. I moduli del kernel associati a iptables si registrano con questi punti di aggancio per garantire che il traffico sia conforme alle condizioni stabilite dalle regole del firewall.

Punti di aggancio di Netfilter

Ci sono cinque punti di aggancio netfilter con cui i programmi possono registrarsi. Man mano che i pacchetti avanzano nello stack, attiveranno i moduli del kernel che si sono registrati con questi punti di aggancio. I punti di aggancio che un pacchetto attiverà dipendono dal fatto che il pacchetto sia in ingresso o in uscita, dalla destinazione del pacchetto e dal fatto che il pacchetto sia stato scartato o respinto in un punto precedente.

I seguenti punti di aggancio rappresentano questi punti ben definiti nello stack di rete:

  • NF_IP_PRE_ROUTING: Questo hook verrà attivato da qualsiasi traffico in ingresso molto presto dopo essere entrato nello stack di rete. Questo hook viene elaborato prima che siano state prese decisioni di routing riguardanti dove inviare il pacchetto.
  • NF_IP_LOCAL_IN: Questo hook viene attivato dopo che un pacchetto in ingresso è stato instradato se il pacchetto è destinato al sistema locale.
  • NF_IP_FORWARD: Questo hook viene attivato dopo che un pacchetto in ingresso è stato instradato se il pacchetto deve essere inoltrato a un altro host.
  • NF_IP_LOCAL_OUT: Questo hook viene attivato da qualsiasi traffico in uscita creato localmente non appena raggiunge lo stack di rete.
  • NF_IP_POST_ROUTING: Questo hook viene attivato da qualsiasi traffico in uscita o inoltrato dopo che è avvenuto il routing e poco prima di essere inviato sulla rete.

I moduli del kernel che devono registrarsi a questi hook devono anche fornire un numero di priorità per aiutare a determinare l’ordine in cui verranno chiamati quando l’hook viene attivato. Questo fornisce i mezzi per collegare più moduli (o più istanze dello stesso modulo) a ciascuno degli hook con un ordine deterministico. Ogni modulo sarà chiamato a sua volta e restituirà una decisione al framework netfilter dopo il processo che indica cosa deve essere fatto con il pacchetto.

Tabelle e catene di IPTables

Il firewall iptables utilizza tabelle per organizzare le sue regole. Queste tabelle classificano le regole in base al tipo di decisioni che vengono prese. Ad esempio, se una regola tratta la traduzione degli indirizzi di rete, verrà inserita nella tabella nat. Se la regola viene utilizzata per decidere se permettere al pacchetto di continuare verso la sua destinazione, probabilmente verrà aggiunta alla tabella filter.

All’interno di ogni tabella iptables, le regole sono ulteriormente organizzate all’interno di “catene” separate. Mentre le tabelle sono definite dall’obiettivo generale delle regole che contengono, le catene integrate rappresentano i punti di aggancio di netfilter che le attivano. Le catene determinano quando le regole verranno valutate.

I nomi delle catene integrate riflettono i nomi dei punti di aggancio di netfilter a cui sono associati:

  • PREROUTING: Attivato dal punto di aggancio NF_IP_PRE_ROUTING.
  • INPUT: Attivato dal punto di aggancio NF_IP_LOCAL_IN.
  • FORWARD: Attivato dal punto di aggancio NF_IP_FORWARD.
  • OUTPUT: Attivato dal punto di aggancio NF_IP_LOCAL_OUT.
  • POSTROUTING: Attivato dal punto di aggancio NF_IP_POST_ROUTING.

Le catene consentono all’amministratore di controllare dove nel percorso di consegna di un pacchetto verrà valutata una regola. Poiché ogni tabella ha più catene, l’influenza di una tabella può essere esercitata in diversi punti durante l’elaborazione. Poiché alcuni tipi di decisioni hanno senso solo in determinati punti nella pila di rete, non ogni tabella avrà una catena registrata con ogni punto di aggancio del kernel.

Ci sono solo cinque hooks del kernel netfilter, quindi le catene da più tabelle vengono registrate su ciascuno dei hooks. Ad esempio, tre tabelle hanno catene PREROUTING. Quando queste catene si registrano all’hook associato NF_IP_PRE_ROUTING, specificano una priorità che determina in quale ordine viene chiamata la catena PREROUTING di ciascuna tabella. Ogni regola all’interno della catena PREROUTING con la priorità più alta viene valutata sequenzialmente prima di passare alla successiva catena PREROUTING. Daremo uno sguardo all’ordine specifico di ogni catena tra un momento.

Quali Tabelle Sono Disponibili?

Facciamo un passo indietro per un momento e diamo uno sguardo alle diverse tabelle che fornisce iptables. Queste rappresentano insiemi distinti di regole, organizzate per area di interesse, per valutare i pacchetti.

La Tabella di Filtraggio

La tabella di filtraggio è una delle tabelle più utilizzate in iptables. La tabella filter viene utilizzata per prendere decisioni su se far continuare un pacchetto verso la sua destinazione prevista o negare la sua richiesta. Nel gergo del firewall, questo è conosciuto come “filtraggio” dei pacchetti. Questa tabella fornisce la maggior parte delle funzionalità di cui le persone pensano quando si discute di firewall.

La Tabella NAT

La tabella nat viene utilizzata per implementare le regole di traduzione degli indirizzi di rete. Quando i pacchetti entrano nello stack di rete, le regole in questa tabella determineranno se e come modificare gli indirizzi di origine o destinazione del pacchetto al fine di influenzare il modo in cui il pacchetto e eventuali traffico di risposta vengono instradati. Questo viene spesso utilizzato per instradare i pacchetti verso reti quando l’accesso diretto non è possibile.

La Tabella Mangle

La tabella mangle viene utilizzata per alterare gli header IP del pacchetto in vari modi. Ad esempio, è possibile regolare il valore TTL (Time to Live) di un pacchetto, allungando o accorciando il numero di hop di rete validi che il pacchetto può sopportare. Altri header IP possono essere alterati in modi simili.

Questa tabella può anche apporre un “marchio” interno al kernel sul pacchetto per ulteriori elaborazioni in altre tabelle e da parte di altri strumenti di rete. Questo marchio non tocca il pacchetto effettivo, ma aggiunge il marchio alla rappresentazione del pacchetto nel kernel.

La Tabella Raw

Il firewall iptables è stateful, il che significa che i pacchetti vengono valutati in relazione ai pacchetti precedenti. Le funzionalità di tracciamento della connessione implementate sopra il framework netfilter permettono a iptables di visualizzare i pacchetti come parte di una connessione in corso o di una sessione invece che come un flusso di pacchetti discreti non correlati. La logica di tracciamento della connessione di solito viene applicata molto presto dopo che il pacchetto colpisce l’interfaccia di rete.

La tabella raw ha una funzione molto specifica. Il suo unico scopo è fornire un meccanismo per contrassegnare i pacchetti al fine di escluderli dal tracciamento delle connessioni.

La Tabella di Sicurezza

La tabella security viene utilizzata per impostare marcature di contesto di sicurezza SELinux interne sui pacchetti, che influenzeranno il modo in cui SELinux o altri sistemi che possono interpretare i contesti di sicurezza SELinux gestiscono i pacchetti. Queste marcature possono essere applicate su base per pacchetto o per connessione.

Relazioni tra Catene e Tabelle

Se tre tabelle hanno catene PREROUTING, in quale ordine vengono valutate?

La tabella seguente indica le catene disponibili all’interno di ciascuna tabella iptables quando lette da sinistra a destra. Ad esempio, possiamo vedere che la tabella raw ha sia le catene PREROUTING che OUTPUT. Quando lette dall’alto in basso, mostra anche l’ordine in cui ogni catena viene chiamata quando l’hook associato a netfilter viene attivato.

A few things should be noted. In the representation below, the nat table has been split between DNAT operations (those that alter the destination address of a packet) and SNAT operations (those that alter the source address) in order to display their ordering more clearly. We have also include rows that represent points where routing decisions are made and where connection tracking is enabled in order to give a more holistic view of the processes taking place:

Tables↓/Chains→ PREROUTING INPUT FORWARD OUTPUT POSTROUTING
(routing decision)
raw
(connection tracking enabled)
mangle
nat (DNAT)
(routing decision)
filter
security
nat (SNAT)

Quando un pacchetto attiva un hook netfilter, le catene associate verranno elaborate come elencato nella tabella sopra dall’alto in basso. Gli hooks (colonne) che un pacchetto attiverà dipendono dal fatto che sia un pacchetto in ingresso o in uscita, dalle decisioni di routing che vengono prese e dal fatto che il pacchetto superi i criteri di filtraggio.

Alcuni eventi causeranno l’omissione di una catena di una tabella durante l’elaborazione. Ad esempio, solo il primo pacchetto in una connessione verrà valutato rispetto alle regole NAT. Eventuali decisioni nat prese per il primo pacchetto verranno applicate a tutti i pacchetti successivi nella connessione senza ulteriore valutazione. Le risposte alle connessioni NAT verranno automaticamente sottoposte alle regole NAT inverse per instradare correttamente.

Ordine di Traversata della Catena

Assumendo che il server sappia come instradare un pacchetto e che le regole del firewall ne permettano la trasmissione, i seguenti flussi rappresentano i percorsi che verranno attraversati in diverse situazioni:

  • Pacchetti in arrivo destinati al sistema locale: PREROUTING -> INPUT
  • Pacchetti in arrivo destinati a un altro host: PREROUTING -> FORWARD -> POSTROUTING
  • Pacchetti generati localmente: OUTPUT -> POSTROUTING

Se combiniamo le informazioni sopra con l’ordinamento indicato nella tabella precedente, possiamo vedere che un pacchetto in arrivo destinato al sistema locale sarà valutato prima nelle catene PREROUTING delle tabelle raw, mangle, e nat. Attraverserà quindi le catene INPUT delle tabelle mangle, filter, security, e nat prima di essere infine consegnato al socket locale.

Regole IPTables

Le regole sono posizionate all’interno di una catena specifica di una tabella specifica. Quando viene chiamata ogni catena, il pacchetto in questione verrà verificato contro ogni regola all’interno della catena nell’ordine. Ogni regola ha una componente di corrispondenza e una componente di azione.

Corrispondenza

La parte corrispondente di una regola specifica i criteri che un pacchetto deve soddisfare affinché l’azione associata (o “target”) venga eseguita.

Il sistema di corrispondenza è molto flessibile e può essere notevolmente ampliato con ulteriori estensioni iptables. Le regole possono essere costruite per corrispondere per tipo di protocollo, indirizzo di destinazione o di origine, porta di destinazione o di origine, rete di destinazione o di origine, interfaccia di input o di output, intestazioni o stato della connessione, tra altri criteri. Questi possono essere combinati per creare set di regole complesse per distinguere tra diversi tipi di traffico.

Target

A “target” refers to the actions that are triggered when a packet meets the matching criteria of a rule. Targets are generally divided into two categories:

  • Target di terminazione: i target di terminazione eseguono un’azione che interrompe la valutazione all’interno della catena e restituisce il controllo all’hook di netfilter. A seconda del valore di ritorno fornito, l’hook potrebbe eliminare il pacchetto o consentire al pacchetto di continuare alla prossima fase di elaborazione.
  • Target non di terminazione: i target non di terminazione eseguono un’azione e continuano la valutazione all’interno della catena. Sebbene ogni catena debba alla fine restituire una decisione finale di terminazione, possono essere eseguiti un numero qualsiasi di target non di terminazione in precedenza.

La disponibilità di ciascun target all’interno delle regole dipenderà dal contesto. Ad esempio, il tipo di tabella e catena potrebbe determinare i target disponibili. Le estensioni attivate nella regola e le clausole di corrispondenza possono anche influire sulla disponibilità dei target.

Passare alle Catene Definite dall’Utente

C’è anche una classe speciale di destinazione non terminante: la destinazione di salto. Le destinazioni di salto sono azioni che comportano il passaggio dell’elaborazione a una catena diversa per ulteriori elaborazioni. Abbiamo coperto le catene incorporate che sono legate agli hook di netfilter che le richiamano. Tuttavia, iptables consente anche agli amministratori di creare proprie catene per scopi organizzativi.

Le regole possono essere inserite nelle catene definite dall’utente allo stesso modo in cui possono essere inserite nelle catene incorporate. La differenza è che le catene definite dall’utente possono essere raggiunte solo “saltandoci” da una regola (non sono registrate con un hook di netfilter di per sé).

Le catene definite dall’utente agiscono come estensioni della catena che le ha chiamate. Ad esempio, in una catena definita dall’utente, l’elaborazione tornerà alla catena chiamante se si raggiunge la fine dell’elenco delle regole o se una destinazione RETURN viene attivata da una regola corrispondente. L’elaborazione può anche saltare a ulteriori catene definite dall’utente.

Questo costrutto consente una maggiore organizzazione e fornisce il framework necessario per una ramificazione più robusta.

IPTables e Tracciamento delle Connessioni

Abbiamo introdotto il sistema di tracciamento della connessione implementato sopra il framework netfilter quando abbiamo discusso la tabella raw e i criteri di corrispondenza dello stato della connessione. Il tracciamento della connessione consente a iptables di prendere decisioni sui pacchetti visti nel contesto di una connessione in corso. Il sistema di tracciamento della connessione fornisce a iptables la funzionalità necessaria per eseguire operazioni “stateful”.

Il tracciamento della connessione viene applicato molto presto dopo l’ingresso dei pacchetti nello stack di rete. Le catene della tabella raw e alcuni controlli di coerenza sono l’unico processo eseguito sui pacchetti prima di associarli a una connessione.

Il sistema controlla ogni pacchetto rispetto a un insieme di connessioni esistenti. Aggiorna lo stato della connessione nel suo archivio se necessario e aggiunge nuove connessioni al sistema quando è necessario. I pacchetti contrassegnati con il target NOTRACK in una delle catene raw eviteranno le routine di tracciamento della connessione.

Stati disponibili

Le connessioni tracciate dal sistema di tracciamento della connessione saranno in uno dei seguenti stati:

  • NUOVO: Quando arriva un pacchetto non associato a una connessione esistente, ma non è invalido come primo pacchetto, verrà aggiunta una nuova connessione al sistema con questa etichetta. Ciò accade sia per protocolli consapevoli della connessione come TCP che per protocolli senza connessione come UDP.
  • STABILITO: Una connessione passa da NUOVO a STABILITO quando riceve una risposta valida nella direzione opposta. Per le connessioni TCP, ciò significa un SYN/ACK e per il traffico UDP e ICMP, ciò significa una risposta in cui sorgente e destinazione del pacchetto originale vengono scambiati.
  • RELATIVO: I pacchetti che non fanno parte di una connessione esistente, ma sono associati a una connessione già presente nel sistema, sono etichettati come RELATIVO. Ciò potrebbe significare una connessione ausiliaria, come nel caso delle connessioni di trasmissione dati FTP, oppure potrebbero essere risposte ICMP ai tentativi di connessione da parte di altri protocolli.
  • NON VALIDO: I pacchetti possono essere contrassegnati come NON VALIDO se non sono associati a una connessione esistente e non sono adatti all’apertura di una nuova connessione, se non possono essere identificati o se non sono instradabili, tra le altre ragioni.
  • NON TRACCIATO: I pacchetti possono essere contrassegnati come NON TRACCIATO se sono stati presi di mira in una catena di tavoli raw per bypassare il tracciamento.
  • SNAT: Questo è uno stato virtuale impostato quando l’indirizzo di origine è stato modificato dalle operazioni NAT. Questo viene utilizzato dal sistema di tracciamento delle connessioni in modo che sappia di cambiare gli indirizzi di origine di nuovo nei pacchetti di risposta.
  • DNAT: Questo è uno stato virtuale impostato quando l’indirizzo di destinazione è stato modificato dalle operazioni NAT. Questo viene utilizzato dal sistema di tracciamento delle connessioni in modo che sappia di cambiare l’indirizzo di destinazione quando instrada i pacchetti di risposta.

Stati tracciati nel sistema di tracciamento della connessione permettono agli amministratori di creare regole che mirano a punti specifici nella vita di una connessione. Questo fornisce la funzionalità necessaria per regole più dettagliate e sicure.

Conclusione

Il framework di filtraggio dei pacchetti netfilter e il firewall iptables sono la base per la maggior parte delle soluzioni firewall su server Linux. Gli hook del kernel netfilter sono abbastanza vicini allo stack di networking da fornire un controllo potente sui pacchetti mentre vengono elaborati dal sistema. Il firewall iptables sfrutta queste capacità per fornire un metodo flessibile ed estensibile di comunicare i requisiti di policy al kernel. Imparando come questi pezzi si inseriscono insieme, puoi utilizzarli meglio per controllare e proteggere i tuoi ambienti server.

Se vuoi saperne di più su come scegliere politiche iptables efficaci, dai un’occhiata a questa guida.

Queste guide possono aiutarti a iniziare a implementare le tue regole del firewall iptables:

Source:
https://www.digitalocean.com/community/tutorials/a-deep-dive-into-iptables-and-netfilter-architecture