Sicurezza e GNU/Linux (9): il firewall (seconda parte)
Il firewall, nei sistemi GNU/Linux, è un componente del kernel chiamato Netfilter.
Netfilter è un firewall molto complesso, non tanto nel senso che è difficile da configurare (ci sono interfacce grafiche anche piuttosto semplici), quanto invece nelle sue molteplici capacità. Grazie al suo sistema modulare, infatti, è possibile fargli fare quasi di tutto. Qui vedremo solo il suo funzionamento di base.
In primo luogo, il Netfilter permette di creare delle regole (che possiamo vedere proprio come dei filtri) composte da due parti: la condizione (match) e l’azione. Se la condizione è verificata, allora viene compiuta l’azione. Ad esempio: se il pacchetto proviene dall’IP 200.201.202.203 allora gettalo (DROP). Questa regola si può inserire in Netfilter tramite l’utility iptables (che è anche il nome di uno dei componenti di Netfilter stesso):
sudo iptables -A INPUT -s 200.201.202.203 -j DROP
“INPUT” è una catena di regole. Le catene sono un altro elemento importante di Netfilter/iptables. Le regole infatti si raggruppano in catene; il tipico funzionamento è questo: quando una condizione è verificata, viene eseguita l’azione e si esce dalla catena, se invece non è verificata, l’elaborazione continua con la regola successiva.
Il parametro -A (add) dice di aggiungere la regola alla catena predefinita INPUT, vale a dire quella per cui passano tutti i pacchetti in arrivo verso di noi. Le altre catene predefinite sono OUTPUT, per cui passano tutti i pacchetti in uscita da noi e FORWARD, dove passano i pacchetti in transito verso altre macchine, ad esempio quelle di una rete locale.
Il parametro -s sta per “source” ovvero sorgente, quindi il mittente del pacchetto.

Schema semplificato di netfilter/iptables (da http://tinyurl.com/64kbtbg )
Se volessimo bloccare le nostre connessioni verso l’IP di LinuxQualityHelp (62.149.140.153) potremmo scrivere:
sudo iptables -A OUTPUT -d 62.149.140.153 -j DROP
dove -d sta per destinazione (destination). Vediamo la situazione dopo questi due comandi:
guido@guido-laptop:~$ sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 200.201.202.203 anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination DROP all -- anywhere webx143.aruba.it
Provo infatti a pingare http://www.linuxqualityhelp.it e ottengo
guido@guido-laptop:~$ sudo ping www.linuxqualityhelp.it PING www.linuxqualityhelp.it (62.149.140.153) 56(84) bytes of data. ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted
Ovviamente neppure root è autorizzato a scavalcare il firewall, sebbene root possa sempre modificare queste regole. Di solito però il firewall è su una macchina a parte, magari un router, per cui solo chi conosce le credenziali di quella macchina può accedervi.
A proposito di router: di norma i router sono piccoli computer contenenti GNU/Linux oppure sistemi embedded basati su Linux come uCLinux. In altri casi invece sono sistemi proprietari, o a volte sistemi BSD. Nel mio caso ho un router uCLinux ed infatti:
guido@guido-laptop:~$ ssh admin@192.168.1.1 admin@192.168.1.1's password: BusyBox v0.XX (xxxxxxx) Built-in shell (ash) Enter 'help' for a list of built-in commands. # cat /proc/version Linux version 2.XX.XX_yyyyyyyy (hhhhhhh@jjjjjjjjj) (gcc version ww.qq.yyy YYYYMMDD) #1
(ho ovviamente censurato certe informazioni per mia sicurezza).
Il mio router avendo Linux ha iptables:
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination XXXXXXXXXXXXXXXXXXXXXXXXXX Chain FORWARD (policy ACCEPT) target prot opt source destination XXXXXXXXXXXXXXXXXXXXXXXXXXXX Chain OUTPUT (policy ACCEPT) target prot opt source destination XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Ovviamente anche qui ho censurato tutto.
Le catene sono a loro volta raggruppate in tabelle, da cui il nome iptables, e se le possono creare di nuove.
Il meccanismo di base è quindi semplice. Ma proprio per questo la configurazione può diventare molto lunga e noiosa e richiedere anche una certa conoscenza dei protocolli di rete. Inoltre, una volta riavviato, si perde tutto, per cui di norma i comandi di iptables vengono raggruppati in script, anche molto lunghi se la situazione lo richiede, e lanciati al boot.
Per fortuna, ci vengono in aiuto dei comandi semplificati e delle interfacce grafiche che saranno l’oggetto della prossima puntata.
Nel frattempo, rimuoviamo le inutili regole appena inserite:
guido@guido-laptop:~$ sudo iptables -F [sudo] password for guido: guido@guido-laptop:~$ sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Prendiamo nota che, di default, su Ubuntu e praticamente tutte le distribuzioni GNU/Linux, il firewall è configurato in modo da lasciare passare tutto, sia in entrata che in uscita.
Questo è solo il funzionamento di base di netfilter, che però comprende molte altre opzioni. Ma tanto basta a farci un’idea di come opera.


















Le configurazioni contenute in sysctl.conf riguardano sempre netfilter giusto?
Non esistono altri componenti che possono essere usati al posto di netfilter su Gnu/Linux?
Guido, nelle tue mani GNU/Linux diventa trasparente e semplice come un bicchiere d’acqua.
grazie Guido!
Ciao Guido e grazie anche per questo post.
Ho provato il comando “ssh admin” per verificare l’OS del router, un DLink 2640B, ma la risposta non arriva:
pg@desktop:~$ ssh admin@192.168.1.1
admin@192.168.1.1′s password:
> > CLI exited after timing out
scusa la domanda banale ma… la password l’hai inserita e hai premuto invio?
Beh, certo.
Sono entrato da Firefox per accertarmi della PW e va tutto OK.
Pretty! This has been an incredibly wonderful post.
Many thanks for providing this information.