Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Un firewall per Linux: iptables

Link copiato negli appunti

In un nostro precedente articolo (Rendiamo sicuro il nostro Desktop Linux) avevamo cercato di fornire alcuni concetti di base e vi avevamo dato alcuni suggerimenti su come rendere più sicura la vostra postazione Linux. Non È assolutamente un compito facile, e vi abbiamo anche consigliato di configurare un firewall, utilizzando come strumenti ipfwadm, ipchains o iptables. In questo articolo tratteremo di iptables, che richiede come kernel il 2.4 presente ormai in tutte le distribuzioni, in quanto più avanzato e dalle prestazioni molto migliorate. Si tratta di un firewall di nuova concezione, che porta moltissime novità rispetto a ipchains.

È bene ribadire prima di continuare un concetto già trattato sul nostro articolo precedente: la sicurezza non È mai assoluta e le precauzioni non sono mai troppe. Anche l'installazione di un firewall non È mai la soluzione definitiva ai nostri problemi di sicurezza, sia perchè il codice non può mai essere perfetto e sicuro al 100%, sia perchè, per la nostra natura umana, l'errore di implementazione È sempre in agguato.

Che cosa È un firewall?

Un firewall È uno strumento (che su Linux viene caricato a livello kernel, rendendolo molto più affidabile e veloce), che ci permette di filtrare e amministrare il traffico di rete passante attraverso il nostro PC. Bisogna quindi prima capire e conoscere le nostre necessità in modo da scegliere le regole più adatte alle nostre esigenze. Potremo quindi decidere cosa filtrare dei tre protocolli TCP, UDP e ICMP, per cui È anche necessario avere almeno una minima conoscenza del loro significato. Potrete comunque sapere il protocollo e la porta usati dai servizi consultando il file /etc/services. Senza dilungarci ancora troppo in particolari tecnici e poco pratici passiamo subito all'analisi del funzionamento di iptables.

COME FUNZIONA

Per il suo funzionamento iptables necessita che sia stato abilitato il netfilter nel kernel. In genere le distribuzioni forniscono un kernel che ha già compilato al suo interno questo supporto. Per cui ricordatevi di abilitarlo qualora decidiate di ricompilare il kernel (in particolare fate attenzione a "IP tables support (required for filtering/masq/NAT)" e voci seguenti presenti in "IP: Netfilter Configuration". Per maggiori aiuti e consigli potete consultare il nostro precedente articolo.

Il traffico È stato diviso in 3 "liste": INPUT, OUTPUT e FORWARD. Con INPUT indicheremo tutto il traffico entrante, con OUTPUT quello uscente e con FORWARD quello da smistare e inoltrare. Per indicare invece che la regola si riferisce a tutto il traffico proveniente da un determinato host possiamo usare l'opzione -s (--source). Ad esempio l'espressione:

iptables -s www.microsoft.com

Si riferirà a tutti i pacchetti provenienti da www.microsoft.com (quindi da tutti gli IP in cui viene risolto). È possibile anche specificare l'indirizzo IP accompagnato dalla mask. Ad esempio la riga di prima sarà equivalente ad:

iptables -s 207.46.197.113 iptables -s 207.46.230.219 iptables -s 207.46.230.229 iptables -s 207.46.197.101

Se invece volessimo indicare tutta la sottorete potremo scrivere l'IP accompagnato da /24 oppure da /255.255.255.0 sul cui significato vi rimando al nostro precedente articolo Configurare una rete casalinga.

Ad esempio 207.46.197.0/24 sarà equivalente a specificare tutti gli IP dal 207.46.197.0 al 207.46.197.255 (quindi anche 207.46.197.1, 207.46.197.2, ecc.). Se invece volessimo specificare degli IP di un indirizzo di destinazione (verso il quale connetterci quindi) possiamo usare l'opzione -d (--destination). Per esempio:

iptables -d www.microsoft.com

Al contrario delle precedenti righe indicherà tutto il traffico che va verso www.microsoft.com e non quello che proviene da tale host. Anche per -d È possibile specificare l'IP seguito dalla mask.

Le opzioni -s e -d da sole ovviamente non ha senso se non indichiamo che azione effettuare su quel traffico. Per scegliere per esempio di accettare un pacchetto potremo usare l'opzione -j ACCEPT, mentre se volessimo scartarlo useremo l'opzione -j DROP (vi sono anche altre parole chiave, sulle quali non ci soffermeremo). Oltre a questo dovremo anche indicare la lista in cui inserire questa nuova regola, usando i sopracitati INPUT, OUTPUT e FORWARD preceduti dall'opzione -A. Per aggiungere quindi una nuova regola verso i pacchetti uscenti scriveremo:

iptables -A OUTPUT -d www.microsoft.com -j DROP

Ma non abbiamo specificato però per quale protocollo vale quella regola. Sarebbe bene specificarlo usando l'opzione -p PROTOCOLLO, sostituendo PROTOCOLLO con tcp, udp e icmp a seconda della nostra scelta. Ad esempio:

iptables -A OUTPUT -d www.microsoft.com -p tcp -j DROP

Farà in modo di rendere impossibile mandare pacchetti verso www.microsoft.com utilizzando il protocollo TCP, mentre sarà sempre possibile mandare pacchetti di tipo ICMP (rendendo possibili per esempio i ping). Oltre ad aggiungere in coda (-A) È possibile, visualizzare le regole (-L), cancellare (con -D LISTA numero dove numero sta per la posizione occupata da quella regola), sostituire una regola (con -R LISTA numero), inserire una nuova regola in una posizione da noi scelta (con -I LISTA numero), pulire completamente le regole per una lista (con -F LISTA). Se Se ad esempio volessimo sostituire la 3° regola preesistente da INPUT useremo:

iptables -R INPUT 3 -s hostname -p protocollo -j azione

Oltre al protocollo È possibile anche specificare la porta a cui far riferimento in modo da isolare un determinato servizio. Se volessimo indicare il traffico verso una porta potremo usare l'opzione --dport (--destionation-port) porta, mentre per quello da una determinata porta --sport (--source-port) porta. Al posto di porta È possibile mettere sia il numero che il servizio (ad esempio È la stessa cosa mettere ftp e 21). Per cui se volessimo che nessuno dall'host www.microsoft.com accedesse al nostro server FTP via Internet potremo usare la seguente regola:

iptables -A INPUT -s www.microsoft.com -p tcp --dport ftp -j DROP

Oltre a queste opzioni È possibile scegliere anche l'interfaccia a cui far riferimento. Ad esempio: poniamo il caso di avere una piccola rete locale (magari come quella presentata nel nostro precedente articolo sulla Configurare una rete casalinga), nella quale un PC con Linux È inserito anche su Internet tramite collegamento con un modem e sul quale gira come servizio telnet. Se noi non volessimo consentire il traffico verso la porta 23 del nostro PC Linux da parte della "pericolosa" Internet, e permettere di utilizzare quel servizio solo dalla nostra rete locale, potremmo utilizzare l'opzione -i interfaccia. Ad esempio per proibire il collegamento con telnet a chiunque sia su Internet useremo:

iptables -A INPUT -p tcp --dport telnet -i ppp0 -j DROP

A questo punto potremmo essere tentati dal chiudere TUTTE le porte del nostro sistema operativo, per renderlo più sicuro, ma avremo come effetto indesiderato anche quello di rendere impossibile ogni comunicazione. Questo perché per trasferimenti di dati da un server anche il nostro PC apre momentaneamente un porta per renderlo possibile. Se noi non potessimo usufruire di queste porte, perché firewallate, non sarebbe possibile trasferire nessun dato. Per fortuna possiamo utilizzare un'opzione di iptables che ci permette di filtrare solo i pacchetti di tipo SYN. I pacchetti di tipo SYN vengono inviati da un host a un server per aprire una connessione. A seconda di come risponderà il server potrà avvenire o meno il collegamento.

Questo meccanismo, che È alla base del protocollo TCP, viene chiamato three-way handshake consta di 3 fasi (noi abbiamo analizzato solo la prima), sulle quali non ci soffermiamo, ma che potrebbero essere oggetto di una trattazione futura. Per fare in modo di scartare i pacchetti con la flag SYN attivata potremo usare l'opzione --syn. Ad esempio:

iptables -A INPUT -i ppp0 -p tcp --syn -j DROP

Farà in modo di bloccare tutto il traffico TCP proveniente da Internet e con il quale si richiede di aprire una connessione con la nostra postazione Linux.

Con molte di queste opzioni È possibile usare l'operatore ! (NOT) per indicare tutto ciò che non fa riferimento al parametro che stiamo passando. Poniamo ad esempio di volere tener disponibile a chiunque da Internet solo il nostro server Web presente sulla nostra rete locale, mentre vogliamo impedire che qualcuno acceda a tutti gli altri servizi presenti. Per far questo basterà usare iptables in questo modo:

iptables -A INPUT -i ppp0 -p tcp --syn --dport ! 80 -j DROP

Per quel che riguarda il protocollo ICMP È possibile anche specificare il tipo sul quale vogliamo agire tramite l'opzione --icmp-type tipo. Ad esempio:

iptables -A INPUT -p icmp --icmp-type 0 -j DROP

Per bloccare tutti gli ICMP di tipo echo-reply, e quindi i ping.

COSA FILTRARE

Chiarito il funzionamento e le opzioni più comuni di iptables, È bene precisare alcune cose. Prima di tutto spieghiamo come vengono processate le regole con iptables. Man mano che un pacchetto arriva si controlla, seguendo l'ordine con cui sono state date le regole, se ce ne È qualcuna in cui quel determinato pacchetto rientra. Se sì, viene eseguita l'operazione indicata dall'opzione -j, altrimenti viene accettato. Da qui si può anche capire che processare un pacchetto può avere un notevole carico sulla CPU, se le regole sono molte e il traffico elevato. Per cui, prima di scegliere le regole da far seguire al vostro firewall, È bene pensarci un pò su. Ad esempio se vogliamo che un pacchetto verso la porta 21 venga accettato soltanto se proveniente dall'host www.html.it potremo scrivere le seguenti 2 regole:

iptables -A INPUT -s www.html.it -p tcp --dport 21 -j ACCEPT iptables -A INPUT -p tcp --dport 21 -j DROP

Che È equivalente a:

iptables -A INPUT -s ! www.html.it -p tcp --dport 21 -j DROP

Sarebbe però possibile tramite tecniche di spoofing generare una connessione anche se il nostro IP È stato bloccato dal firewall apparendo con un IP diverso da quello nostro reale (È un'eventualità difficile, ma comunque sempre possibile). Per esempio poniamo il caso di aver filtrato tutto il traffico proveniente da Internet, ma non quello proveniente dalla nostra rete locale. Un malintenzionato (ma esperto) potrebbe (non con poche difficoltà) generare una connessione facendo intendere di appartenere alla rete locale.

Per questo sarebbe bene includere nella lista dei pacchetti da filtrare anche quelli provenienti da 127.0.0.0/8, quelli con lo stesso nostro IP su Internet, e quelli provenienti dalla nostra rete (per esempio 192.168.0.0/24), ricordandosi di utilizzare l'opzione -i ppp0, in modo da non tagliare fuori i legittimi possessori di quegli indirizzi. Per quanto riguarda il protocollo ICMP È conveniente:

Accettare pacchetti ICMP di tipo 3 (Destination Unreachable), 4 (Source Quench) e 11 (Time Exceeded);
Bloccare tutti i pacchetti ICMP in entrata;
Consentire la trasmissione di pacchetti ICMP di tipo 3 (Destination Unreachable) e 4 (Source Quench);
Bloccare tutti i pacchetti ICMP in uscita.

Una volta scelte le regole a voi più consone, potrete inserirle in uno script di avvio in /etc/init.d (magari in /etc/init.d/network o /etc/init.d/networking a seconda della vostra distribuzione) o in /etc/rc.local, in modo da essere caricate al boot.

In questo articolo abbiamo cercato di schiarirvi le idee riguardo il firewalling. Di sicuro non È qualcosa di semplice impostare un firewall. Vi aiuterà senz'altro l'esperienza e la conoscenza del protocollo TCP/IP. Solo una buona padronanza dei servizi e di questo protocollo può farvi capire cosa È bene accettare e cosa invece no. È inutile dire che un firewall configurato male, non solo rischia di non portare alcun vantaggio, ma potrebbe anche rendere inutilizzabile il nostro networking.

Ti consigliamo anche