Netfilter e Iptables

Loris Tissino

24 luglio 2009

Tra noi e il mondo

Schema di rete

Schema di rete

Un calcolatore con il sistema operativo Linux può operare in diversi modi e con diverse funzioni all'interno di una rete:

Routing

Un calcolatore con due interfacce di rete può agire da router facendo transitare i pacchetti dall'una all'altra.

Allo scopo, è necessario abilitare il cosiddetto ip forwarding, in maniera statica agendo sulla configurazione del kernel (file /etc/sysctl.conf) con l'impostazione

net.ipv4.ip_forward=1

oppure in maniera dinamica impartendo il comando:

sudo sysctl -w net.ipv4.ip_forward=1

Gli altri calcolatori dovranno indicarlo come (default) gateway.

NAT / Masquerading

Un calcolatore può:

Nel caso di calcolatori con indirizzo IP assegnato dinamicamente (tipicamente dal fornitore di connettività), il source NAT viene chiamato masquerading.

Quando ce n'è bisogno, nei pacchetti viene alterato anche il numero della porta (PAT, Port Address Translation).

Source NAT / PAT

connessioni TCP viste                        connessioni TCP viste
all'esterno                                  localmente
                           .---------------.
199.3.2.1:23               |               | 199.1.2.3:23            .---------.
<- - - - - - - - - - - - ->|               |<- - - - - - - - - - - ->| cliente |
            196.1.2.3:1050 |               |        192.168.1.1:1050 `---------'
                           |    NAT/PAT    |
200.7.8.9:23               |               | 200.7.8.9:23            .---------.
<- - - - - - - - - - - - ->|               |<- - - - - - - - - - - ->| cliente |
           196.1.2.3:1093  |               |        192.168.1.2:1050 `---------'
                           `---------------'

Immagine tratta dagli Appunti di informatica libera di Daniele Giacomini.

Destination NAT

connessione TCP vista                        connessione TCP vista
all'esterno                                  localmente
                           .---------------.
199.3.2.1:1045             |               | 199.1.2.3:1045
<- - - - - - - - - - - - ->|    NAT/PAT    |<- - - - - -.
              196.1.2.3:80 |               |            :
                           `---------------'            :
                                                        : 
                                                        V 192.168.1.1:80
                                                   .----------.
                                                   | servente |
                                                   |   HTTP   |
                                                   | interno  |
                                                   `----------'

Immagine tratta dagli Appunti di informatica libera di Daniele Giacomini.

Filtering

Il filtraggio consiste nel decidere se far passare o no determinati pacchetti / segmenti.

Le decisioni possono essere prese:

In base a cosa filtrare?

Per decidere della sorte di un pacchetto / segmento ci si può basare:

Netfilter e Iptables

Netfilter è la componente del kernel che si occupa del transito dei pacchetti IP.

Iptables è il comando con cui si amministrano le tabelle che usa Netfilter.

Le tabelle

Iptables gestisce tre tabelle in cui vengono definite le catene:

La tabella filter

La tabella filter ha lo scopo di determinare quali pacchetti / segmenti devono essere fatti transitare. Contiene le catene:

La tabella nat

La tabella nat ha lo scopo di determinare che tipo di operazioni sugli indirizzi IP e sulle porte TCP/UDP devono essere fatte sui pacchetti in transito. Contiene le catene:

La tabella mangle

La tabella mangle ha lo scopo di determinare quali operazioni di manipolazione devono essere fatte sui pacchetti in transito (ad esempio, modifica del TTL, time to live). Contiene le catene:

Le catene

Di ogni pacchetto IP, viene decisa la sorte tramite il controllo di regole organizzate in catene.

Le regole hanno la forma

descrizione -> azione

Alla prima corrispondenza della descrizione, si applica l'azione (le regole successive vengono ignorate, tranne nel caso in cui l'azione sia una registrazione dell'evento nel file di log).

In assenza di corrispondenze si applica la policy di default.

Comandi Iptables

Vediamo alcuni semplici comandi di iptables:

Alcuni esempi di comandi

Qui di seguito sono riportati alcuni comandi con cui è possibile iniziare ad esercitarsi. Una lettura di iptables(8) è quanto mai raccomandabile.

$ sudo iptables -nL INPUT  # mostra le regole correnti per la tabella filter

$ sudo iptables -F INPUT   # cancella la catena INPUT della tabella filter

$ sudo iptables -A INPUT -p tcp --dport 80 -j REJECT
                           # aggiunge la regola per rifutare tutti i pacchetti TCP
                           # destinati alla porta 80

$ sudo iptables -A INPUT -p tcp --syn -j REJECT
                           # aggiunge la regola per rifiutare tutti i pacchetti TCP
                           # con il bit syn impostato (che serve a iniziare una 
                           # connessione) 

$ sudo iptables -t nat -A OUTPUT -p tcp --dport 7080 -j REDIRECT --to-port 80
                           # aggiunge la regola per cui tutti i pacchetti TCP
                           # destinati alla porta 7080 vengono reindirizzati alla
                           # porta 80

$ sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 192.168.1.127:80
                           # aggiunger la regola per cui tutti i pacchetti TCP
                           # destinati alla porta 80 vengono reindirizzati al calcolatore
                           # con indirizzo IP 192.168.1.127

Save e Restore

La situazione corrente delle regola impostate può essere "fotografata" con il programma iptables-save, che produce un file di testo leggibile dal programma iptables-restore.

$ sudo iptables-save > config
$ sudo iptables-restore < config

Il problema dell'FTP passivo

In alcune connessioni FTP, il client comunica al server FTP il numero di una porta sulla quale si pone in attesa di connessione per ricevere i dati (FTP passivo).

Questa porta è bloccata per i pacchetti che iniziano connessioni dall'esterno.

Per fortuna esistono moduli del kernel che ci aiutano:

sudo modprobe ip_nat_ftp
sudo modprobe ip_conntrack_ftp

I proxy server

I proxy server (serventi intermediari) funzionano in userspace, a livello applicativo: