Il firewall iptables

 

iptables

Salve a tutti! Ultimamente sul blog abbiamo parlato parecchio di sicurezza, in particolare come proteggere il nostro server attraverso firewall e software dedicati. Ad esempio abbiamo visto il software DenyHosts, e più recentemente anche Fail2Ban dove entrambi svolgono più e meno lo stesso compito, ossia impedire accessi indesiderati a servizi offerti dal nostro server bannando l'indirizzo ip dell'attaccante. DenyHosts, in particolare, è usato per il servizio di ssh, mentre Fail2Ban più in generale può essere usato anche su altri servizi. Abbiamo visto anche un modulo di Apache chiamato Mod Security, un potente firewall basato sulle espressioni regolari, in grado di proteggere le applicazioni che girano sul nostro web server. Se volete leggere altri post sulla sicurezza, allora vi invito ad andare nella nostra pagina “Risorse” nella sezione relativa alla sicurezza.
Il kernel linux prevede al suo interno un modulo chiamato iptables, un “semplice” firewall in grado di controllare il traffico sulla macchina, ed eventualmente applicare delle regole sui pacchetti in transito. Nel post di oggi vedremo in generale come funziona questo firewall, e vedremo delle piccole regole da applicare giusto per sperimentare un pochino ;).

 

IPTABLES
Iptables non è altro che un filtro di pacchetti presente all'interno del kernel, il suo compito è molto semplice: guardare l'intestazione del pacchetto, e in base a ciò che ha letto decidere cosa farne. Ma come fa a farlo?
Un pacchetto si può trovare in 3 differenti situazioni:

  • può uscire dal nostro computer, ad esempio in seguito all'invio di una mail oppure dopo il login su un qualche sito o una semplice richiesta di una pagina web.
  • Il pacchetto può entrare nel nostro computer, ad esempio un web server ci sta fornendo i dati di una pagina html, o stiamo ricevendo una mail.
  • Nel terzo caso un pacchetto può essere solo di passaggio. In un computer normale, come il nostro notebook, questa situazione potrebbe non verificarsi mai, mentre in un modem si verifica di continuo, poiché esso fa da tramite tra internet e la nostra macchina, di conseguenza redirige i pacchetti che provengono da internet verso il nostro pc.

In iptables queste tre situazioni generali sono delle liste all'interno di una tabella “filter”. Le liste vengono chiamate chains (catene). Dentro ogni catena sono presenti delle regole da applicare al pacchetto.

Facciamo un piccolo esempio per schiarirci le idee. Supponiamo che stiamo facendo il login ad un social network come facebook. Allora nel pacchetto sarà presente l'indirizzo ip di facebook. Quando noi clicchiamo su “login”, il pacchetto inizierà il suo percorso verso il server, e ovviamente dovrà passare per il nostro kernel. Qui entra in gioco iptables, esso capisce che è un pacchetto in uscita quindi userà le regole della catena OUTPUT e, in base a cosa ha letto nell'intestazione, applicherà una o più delle regole presenti in questa catena. Per esempio una delle regole potrebbe dire “elimina tutti i pacchetti che vanno verso facebook”, allora iptables prenderà il pacchetto e a sua volta lo eliminerà.
Idealmente non è nulla di complicato. Lo stesso ragionamento può essere fatto nelle altre due catene principali INPUT e FORWARD. Riassumendo iptables capisce da dove arriva il pacchetto, in base a questo sceglie una catena da usare, poi legge l'intestazione e in base a cosa ha letto applica una o più regole presenti nella catena.

Qui sotto potete vedere uno schema che ho recuperato dalla documentazione ufficiale di iptables, esso rappresenta ciò che abbiamo appena detto:


schema


Come possiamo vedere, in “ingresso” ci sono i pacchetti provenienti dall'esterno che andranno o nella catena “INPUT” o in “FORWARD”. In “processi locali” ci sono i pacchetti generati da noi, che andranno in “OUTPUT” per poi andare eventualmente in “uscita”.

Fino a questo punto abbiamo parlato di catene, e abbiamo detto che dentro ad ognuna di esse sono presenti delle regole. Cosa sono queste regole? Come abbiamo visto prima, iptables legge l'intestazione dei pacchetti, poi inizia a scorrere le regole della catena. Per ogni regola, verifica se è soddisfatta, e se lo è allora esegue l'obiettivo di questa regola, quindi:

 

condizione della regola → obiettivo


Se la condizione non è soddisfatta, allora passa alla regola successiva, fino a quando non sono terminate, o eventualmente una di queste non abbia fatto terminare prima.

Obiettivi
Gli obiettivi invece che cosa sono? Sono semplicemente la situazione da applicare al pacchetto che soddisfa la regola. Di default troviamo due obiettivi da poter utilizzare, ossia: “DROP” e “ACCEPT”, e da come possiamo intuire, il primo elimina il pacchetto mentre il secondo lo accetta. Se si esegue uno di questi due target, allora non si andrà a prendere in considerazione nessun'altra regola.

Altri obiettivi possono essere delle catene definite dall'utente, oppure delle estensioni di iptables.
Nel primo caso, se come target utilizziamo una nostra catena, allora iptables inizierà a controllare tutte le regole di questa nostra catena, una volta che ha finito di controllare, iptables riprenderà a proseguire dal chiamante.
Stesso discorso vale anche per le estensioni. Un esempio di estensione è LOG. Anche qui da come si può intuire, quando si incontra questo target, si inserisce un dato nel file di log, ma a differenza di DROP e ACCEPT, esso continuerà a controllare le altre regole.

Ora sperimentiamo un pochino, utilizzando il comando iptables. Come abbiamo appena visto, è possibile creare delle nostre catene personali, questo può essere fatto semplicemente utilizzando l'opzione -N, mentre se vogliamo cancellarla si può utilizzare l'opzione -X:

 

iptables -N TEST


Mentre per cancellarla:

iptables -X TEST


Ora che abbiamo creato una nostra catena, possiamo aggiungergli delle regole, o volendo possiamo aggiungerle ad una delle catene di default. Questa operazione è molto semplice, in sintesi dobbiamo indicare a quale catena “appendere” la nostra regola con l'opzione -A, e dirgli cosa deve fare.
Ad esempio facciamo in modo di bloccare tutte le connessioni in entrata sul nostro computer che arrivano dal nostro computer, sembra una cosa contorta ma ad esempio potrebbe essere un semplice ping utilizzando il nostro indirizzo ip. Quindi otteniamo l'indirizzo ip locale della nostra macchina e scriviamo:

 

iptables -A OUTPUT -d indirizzo_ip_locale -j DROP


Dove l'opzione -d indica l'indirizzo di destinazione del pacchetto, mentre l'opzione -j sta per “jump”, ossia in questo caso: “salta all'obiettivo DROP”.
Ora se proviamo a scrivere nel terminale:

 

ping indirizzo_ip_locale


esso non riuscirà a mandare nessun pacchetto, poiché il kernel scarterà ogni pacchetto in direzione della nostra stessa macchina.

Per rimuovere una regola possiamo utilizzare l'opzione -D al posto di -A, in questo modo:

 

iptables -D OUTPUT -d indirizzo_ip_locale -j DROP


Volendo possiamo anche vedere quali regole sono presenti all'interno di una catena, semplicemente digitando:

 

iptables -L nome_catena


Una volta che abbiamo deciso e aggiunto tutte le nostre regole, dobbiamo fare in modo di renderle permanenti, altrimenti andranno perse al riavvio successivo, per far ciò scriviamo:

 

iptables-save > /etc/iptables/iptables.rules


Conclusioni
In questo post abbiamo visto come rendere ulteriormente più sicuro il nostro server, o semplicemente il nostro computer, utilizzando direttamente una componente base del kernel linux: iptables.

 

FONTI:
- Immagini Joel Garia;
- Iptables official site;

Dottore in Informatica. Da sempre appassionato di Linux, reti informatiche, sicurezza e, in modo amatoriale, all'elettronica. Il mio intento è quello di trasmettere le mie conoscenze ad altri appassionati.

Lascia un commento