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:
Si riferirà a tutti i pacchetti provenienti da www.microsoft.com
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 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
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
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 sport
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 telnet
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:
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:
Per quel che riguarda il protocollo ICMP È possibile anche specificare il tipo sul quale vogliamo agire tramite l'opzione --icmp-type tipo. Ad esempio:
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:
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
Bloccare
Consentire
Bloccare
Una volta scelte le regole a voi più consone, potrete inserirle in uno script di avvio in /etc/init.d /etc/init.d/network /etc/init.d/networking /etc/rc.local
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.