Come funzionano le iptables del firewall
Introduzione
Impostare un buon firewall è un passaggio essenziale per mettere in sicurezza qualsiasi moderno sistema operativo. La maggior parte delle distribuzioni Linux è equipaggiata con diversi strumenti con i quali è possibile configurare i nostri firewall. In questa guida approfondiremo gli aspetti che riguardano le iptables
del firewall.
Le iptables (letteralmente tabelle ip) sono uno standard dei firewall incluso di default nelle maggiori distribuzioni Linux (iptables che verranno presto sostituite con la nuova variante, chiamata nftables
). In effetti è un front end degli hook di netfilter del kernel, in grado di manipolare lo stack di networking di Linux. Iptables funziona comparando ogni pacchetto che attraversa l’interfaccia di rete con tutta una serie di regole, stabilendo successivamente quale azione applicare. In questa guida discuteremo sul funzionamento delle iptables.
Come funzionano le Iptables
Prima di iniziare a soffermarci sugli attuali comandi richiesti per controllare le iptables e per costruire una policy (una politica decisionale) per il firewall, esaminiamo un po’ di termini e discutiamo su come iptables funziona.
Le iptables del firewall funzionano comparando il traffico della rete con un insieme di rules (regole). Le regole definiscono le caratteristiche che un pacchetto deve possedere per essere conforme alle regole, oltre all’azione che dovrebbe essere eseguita nei confronti di tali pacchetti.
Esistono molte opzioni disponibili per stabilire quali pacchetti soddisfano una specifica regola. Si può, ad esempio, confrontare il tipo di protocollo del pacchetto, l’indirizzo sorgente o di destinazione o la porta, l’interfaccia utilizzata, la relazione con pacchetti precedenti, ecc.
Quando uno determinato schema combacia, l’azione che prende luogo è definita target. Il target può essere una specifica policy per il pacchetto, come un ‘accetta’ o un ‘rifiuta’. Esso può anche veicolare il pacchetto in una differente chain al fine di processarlo o semplicemente registrarne il log. Esistono molte opzioni.
Queste regole sono organizzate in gruppi chiamati chains. Una chain è un insieme di regole con le quali il pacchetto viene verificato in modo sequenziale. Quando il pacchetto combacia con una delle regole, la chain esegue il comando associato a tale regola saltando la successiva verifica per le restanti regole della chain.
Se necessario, un utente può crearsi le proprie chains. Esistono tre chain definite di default. Esse sono:
A user can create chains as needed. There are three chains defined by default. They are:
- INPUT: Questa chain manipola tutti i pacchetti che sono indirizzati al vostro server
- OUTPUT: Questa chain contiene le regole per il traffico creato dal vostro server
- FORWARD: Questa chain è utilizzata per gestire il traffico destinato ad altri server, chain che non sono state creati sul vostro server. Questa chain è essenzialmente un modo per configurare il vostro server ad indirizzare le richieste verso altre macchine
Ogni chain può contenere da 0 a più regole, ed ognuna ha una propria policy di default. Quest’ultima determina cosa accade quando un pacchetto non combacia con nessuna delle regole presenti nella chain. È possibile sia scegliere di rifiutare il pacchetto o accettarlo se non corrispondente alle regole.
Attraverso un modulo che può essere caricato per mezzo delle regole, iptables può inoltre tracciare le connessioni. Questo significa che è possibile creare regole che definiscono cosa succede ad un pacchetto basato sulle sue precedenti relazioni con altri pacchetti. Potremmo chiamare questa capacità “state tracking”, “connection tracking” oppure “configurare lo ‘state machine'”.
Questa guida riguarderà principalmente la configurazione della INPUT chain, dato che essa contiene il set di regole in grado di aiutarci a bloccare il traffico indesiderato indirizzato al nostro server.
IPv4 versus IPv6
Il firewall netfilter che è incluso nel kernel Linux mantiene il traffico IPv4 e IPv6 completamente separato. Allo stesso modo, gli strumenti utilizzati per manipolare le tabelle che contengono l’insieme delle regole del firewall sono ben distinti. Se si ha IPv6 abilitato sul proprio server, si dovranno configurare entrambe le tabelle per indirizzare il traffico al server verso il quale è destinato.
L’abituale comando iptables
è utilizzato per manipolare la tabella contenente le regole che governano il traffico IPv4. Per il traffico IPv6 è invece necessario utilizzare il comando ip6tables
. Questo dettaglio è importante da tenere a mente in quanto ogni regola impostata con iptables
non avrà effetto nei confronti di pacchetti che utilizzano la versione 6 del protocollo, e viceversa.
La sintassi in questa coppia di comandi è la stessa e quindi creando un insieme di regole per ognuna di queste tabelle, il tutto non risulterà molto impegnativo. Basterà ricordare di modificare entrambe le tabelle ogniqualvolta si applichi una modifica. Il comando iptables
applicherà le regole nei confronti del traffico IPv4 mentre il comando ip6tables
nei confronti del traffico Ipv6.
Bisogna essere sempre certi di utilizzare gli indirizzi IPv6 del proprio server appropriati così da generare le regole ip6tables
.
Aspetti da tenere in considerazione
Ora sappiamo come le iptables direzionano i pacchetti che giungono attraverso la sua interfaccia (direzionare i pacchetti verso la chain appropriata, verificarli con ogni regola fino a che almeno una è soddisfatta, fornire la policy alla chain nel caso nessuna regola sia soddisfatta), quindi possiamo iniziare a dare un’occhiata a qualche insidia nascosta nella creazione delle suddette regole.
Per prima cosa, dobbiamo assicurarci di avere regole che mantengano le connessioni attuali attive nel caso si implementasse una policy di drop (rifiuto). Questo è particolarmente importante se si è connessi al proprio server tramite SSH. Se accidentalmente si implementa una regola o una policy in grado di rifiutare la connessione corrente, si potrà sempre accedere alla VPS di DigitalOcean usando la console via web, la quale garantisce un accesso ‘out-of-band’ [al di fuori di essa, NdR].
Un altro aspetto da tenere in considerazione è che l’ordine delle regole in ogni singola chain conta. Un pacchetto non deve incrociare una regola generale che lo intercetta se esso è pensato per corrispondere ad una regola più specifica.
A causa di ciò, le regole in cima alla lista della chain dovrebbero avere un livello di specificità più elevato rispetto alle ultime. Si dovrebbe comparare i casi specifici prima per poi garantire successivamente regole più generali per schemi più ampi. Se un pacchetto non soddisfa nessuna delle regola dell’intera chain esso si scontrerà con la regola più generale, la policy di default.
Per questa ragione, una policy di default di una chain determinerà in modo estremamente rigido il tipo di regole che saranno incluse nella chain stessa. Una chain con una policy di ACCEPT conterrà regole che faranno un drop esplicito dei pacchetti. Una chain con una policy di DROP conterrà eccezioni per i pacchetti che dovrebbero essere accettati in maniera specifica.
Conclusioni
A questo punto, il modo più semplice per imparare come funzionano le iptables è quello di abituarsi ad implementarle nel proprio firewall.