Creiamo un potente firewall con IPTables

Aggiornamento: WhiteWizard mi segnala che è necessario compiere anche queste operazioni per avviare il firewall all’avvio del sistema. Io non ricordo di aver fatto operazioni del genere, ma può esservi d’aiuto nel caso non sia così.

I sistemi GNU/Linux sono storicamente più sicuri di altri sistemi operativi, primo fra tutti Microsoft Windows, tanto che in molti utenti non sentono di avere necessità di dotarsi di firewall e antivirus. Se però vogliamo aggiungere un ulteriore livello di sicurezza, possiamo creare un firewall utilizzando un agile script che creerà una barriera impenetrabile a qualunque intruso. Potrà sembrare strano, ma per crearlo ci basta un semplice file di testo. Apriamo dunque Gedit o Kate o un qualunque altro blocco note. Se arrivate fino in fondo, ci sarà un regalo per voi.

Innanzitutto inseriamo la riga:

#!/bin/bash

Serve a segnalare che quel file è un programmino, dopodiché inseriamo:

IPTABLES=”/sbin/iptables”
IFLO=”lo”
IFEXT=”ppp0″

In questo modo definiamo alcune variabili che lo script utilizzerà. Modificando queste righe, infatti, potremo modificare la configurazione del nostro firewall con una sola sostituzione e non molte di più. La riga più interessante (e che dobbiamo modificare subito) è la riga IFEXT=”ppp0″. Al posto di ppp0 dobbiamo inserire l’interfaccia che stiamo utilizzando. Lo troviamo dando nel terminale il comando

ifconfig

Le più comuni sono le seguenti:

  • ppp0: per connessioni ADSL e via pccard e cellulare;
  • eth0 o eth1: per connessioni Ethernet (via cavo o wireless);
  • wlan0: per connessioni wireless.

Quindi inseriamo:

case “$1” in
start)

echo -n “Sto attivando il firewall: “

Niente di particolare, lo vedremo poi. Adesso inseriamo:

modprobe ip_tables
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_LOG
modprobe ipt_MARK
modprobe ipt_MASQUERADE
modprobe ipt_REDIRECT
modprobe ipt_REJECT
modprobe ipt_TOS
modprobe ipt_limit
modprobe ipt_mac
modprobe ipt_mark
modprobe ipt_multiport
modprobe ipt_state
modprobe ipt_tos
modprobe iptable_mangle

Queste righe caricano alcuni moduli del kernel necessari (il primo, in particolare, è proprio ip_tables). Continuiamo:

$IPTABLES -F
$IPTABLES -F -t nat
$IPTABLES -F -t mangle
$IPTABLES -X
$IPTABLES -X -t nat
$IPTABLES -X -t mangle

Questi comandi resettano le impostazioni. Adesso comincia il divertimento:

$IPTABLES -P INPUT   DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT  ACCEPT

Queste sono le prime regole vere e proprie del nostro firewall. La prima riga blocca il traffico in entrata, la seconda blocca il traffico in transito, la terza permette il traffico in uscita. Se provassimo a utilizzare un firewall siffatto, non potremmo utilizzare internet. Sicurezza estrema, insomma, ma non credo che serva a qualcuno. Creiamo quindi delle eccezioni:

$IPTABLES -A INPUT  -i $IFLO -j ACCEPT
$IPTABLES -A OUTPUT -o $IFLO -j ACCEPT

Queste righe abilitano il traffico interno (credo che nessuno abbia paura di ciò che facciamo noi stessi, sempre che sappiamo cosa stiamo facendo).

$IPTABLES -A INPUT -p  tcp -i $IFEXT -m state -s 0/0 –state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p icmp -i $IFEXT -m state -s 0/0 –state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p  udp -i $IFEXT -m state -s 0/0 –state ESTABLISHED,RELATED -j ACCEPT

Questa riga è un po’ più complicata: serve a stabilire che i pacchetti di risposta a una nostra richiesta possono entrare nel nostro pc. In altre parole, permettiamo l’entrata solo ai pacchetti che abbiamo invitato. Ci serve, in particolare, per utilizzare internet.

Adesso dobbiamo decidere quali programmi lasciar passare. Farò un esempio generale, poi sarete voi a decidere. Per utilizzare un programma che si immette sulla rete dobbiamo aprirgli una porta, in modo che possa entrare e uscire. Ogni porta ha un numero che la identifica, ed è quella che ci servirà per impostare il firewall. Nel nostro esempio, utilizzerò la porta 1234:

$IPTABLES -A INPUT -p tcp –dport 1234 -j ACCEPT
$IPTABLES -A INPUT -p udp –dport 1234 -j ACCEPT

Queste righe permettono il traffico attraverso la porta 1234 (una porta a caso). Se uno dei programmi che utilizzate passa per la porta 1234, questa è la stringa che dovete inserire. Se un altro programma utilizza un’altra porta non dovete far altro che inserire altre righe, facendo attenzione a sostituire 1234 con il numero della porta che vi serve. Una lista abbastanza completa delle porte utilizzate la trovate qui. Qualche esempio che mi è stato richiesto:

  • per MSN: 1863 (tcp);
  • per eMule: 4662 (tcp), 4672 (udp);
  • per SAMBA: 137 (udp), 138 (udp), 139 (tcp), 445 (tcp);
  • per ChatZilla (forse più in generale per IRC): 113, 6667 (entrambi tcp);

Notiamo che dobbiamo sostituire tcp e udp a seconda di quello che ci serve. Inseriamo quindi:

echo “ok”
;;

Serve semplicemente a dire che il caricamento del firewall è andato a buon fine (attenzione ai due punto e virgola, perché servono a dire allo script di fermarsi in quel punto – in altre parole, quando vedete ‘start’, molte righe più in alto, inizia un comando che termina ai due punto e virgola, e senza di essi lo script va avanti e rischia di sbagliare qualcosa). Continuiamo:

stop)

echo -n “Sto disattivando il firewall: ”

$IPTABLES -X -t mangle

$IPTABLES -P INPUT   ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT  ACCEPT

$IPTABLES -F
$IPTABLES -F -t nat
$IPTABLES -F -t mangle
$IPTABLES -X
$IPTABLES -X -t nat
echo “ok”
;;

Serve a disabilitare il firewall e abilitare tutto il traffico da qualunque parte.

status)
echo -n “Al momento sono in uso le seguenti regole: ”
$IPTABLES -L
;;

Mostra quali regole del firewall sono abilitate.

restart|reload)
$0 stop
$0 start
;;

Fa ripartire il firewall: utile quando mutiamo le impostazioni del firewall e vogliamo che siano attive.

*)
echo “Per usare questo script, devi specificare un attributo: firewall {start|stop|restart|reload|status}” >&2
exit 1
;;

esac

exit 0

Serve a ricordarci che dobbiamo dare un attributo e chiude. Che vuol dire? Lo vedremo fra poco.

Salviamo il nostro file con il nome “firewall” nella cartella /etc/init.d/ , in modo che venga caricato all’avvio. Altrimenti possiamo lasciarlo da qualche altra parte e caricarlo manualmente dal terminale, nel seguente modo. Gli esempi seguenti assumeranno che il file sia in /etc/init.d/ .

Per attivare il firewall:

sudo /etc/init.d/firewall start

Per disattivare il firewall:

sudo /etc/init.d/firewall stop

Per disattivare e riattivare il firewall (utile se modifichiamo il firewall).

sudo /etc/init.d/firewall restart

Per vedere quali regole sono attive:

sudo /etc/init.d/firewall status

start, stop, restart (o reload, che è lo stesso) e status sono gli attributi di cui parlavo prima.

Potete provare il firewall e vedere se va tutto ok. Se qualcosa non dovesse funzionare, potete disattivarlo. Nel praticamente impossibile evento in cui il pc non dovesse avviarsi (chissà cosa ci avete messo in quello script!), non dovrete far altro che rimuovere il file: per farlo potete usare il comando

sudo rm /etc/init.d/firewall

oppure, se volete utilizzare l’interfaccia grafica, usando un cd live. Poi, magari, gentilmente, mi mandate il file del vostro firewall per vedere che cosa ci avete infilato dentro: adoro la mitologia.

Bene, se siete arrivati fin qui ho un regalo per voi: un file di testo pronto per l’uso. Non dovete fare altro che modificarlo secondo le vostre esigenze (e soprattutto secondo le istruzioni) e infilarlo nella cartella suddetta. Sembra niente, ma è un firewall molto potente. Ovviamente sono a disposizione per eventuali problemi (mi sento responsabile).

(A chi si stesse chiedendo: perché non hai inserito direttamente il file di esempio invece di spiegare tutto? Perché in questo modo sapete cosa state facendo quando modificate il vostro scriptino)

10 comments

  1. complimenti per l’articolo, solo un appunto: per far partire lo script all’avvio non basta metterlo nella cartella /etc/init.d/ Bisogna dargli i permessi di esecuzione con “sudo chmod a+x /etc/init.d/nomescript.sh” e poi aggiornare i runlevel con “sudo update-rc.d nomescript.sh defaults”. Ciao!

  2. complimenti per l’articolo, solo un appunto: per far partire lo script all’avvio non basta metterlo nella cartella /etc/init.d/ Bisogna dargli i permessi di esecuzione con “sudo chmod a+x /etc/init.d/nomescript.sh” e poi aggiornare i runlevel con “sudo update-rc.d nomescript.sh defaults”. Ciao!

  3. WhiteWizard: grazie per il tuo commento. Ti dirò che non ricordo di aver fatto una cosa del genere, eppure il firewall funziona lo stesso. In ogni caso ora aggiungo una nota al tuo commento. Grazie ancora. 🙂

  4. WhiteWizard: grazie per il tuo commento. Ti dirò che non ricordo di aver fatto una cosa del genere, eppure il firewall funziona lo stesso. In ogni caso ora aggiungo una nota al tuo commento. Grazie ancora. 🙂

Comments are closed.