Si devono creare delle regole di NAT che segnalino al kernel quali connessioni
cambiare e come cambiarle. Per fare ciò, si userà il programma iptables
,
il quale oltre ad essere
veramente versatile, permette anche di alterare la tabella NAT
specificando l'opzione `-t nat'.
La tabella delle regole NAT contiene tre liste chiamate comunemente `catene' (chains): ogni regola è esaminata per ordine finché una non è soddisfatta. Due catene sono chiamate PREROUTING (per il Destination NAT sui pacchetti in arrivo) e POSTROUTING (per il Source NAT sui pacchetti in uscita).
Il seguente diagramma, se ho un talento artistico, dovrebbe illustrare tutto ciò molto bene.
_____ _____
/ \ / \
PREROUTING --->[Decisioni] --------------->POSTROUTING----->
\D-NAT/ [di routing ] \S-NAT/
[instradamento] ^
| |
| |
| |
| |
| |
| |
--------> Processi locali ----
Per ogni punto, quando un pacchetto passa viene osservata quale connessione vi è associata. Se è una nuova connessione, per sapere cosa fare, si osserverà la catena corrispondente nella tabella NAT. La risposta che si otterrà sarà poi applicata anche a tutti i pacchetti successivi appartenenti a questa connessione.
iptables
vanta una serie di opzioni standard elencate sotto.
Tutte le opzioni con doppio trattino possono essere abbreviate, sempre che
iptables
possa distinguerle dalle altre opzioni disponibili.
Se il proprio kernel supporta iptables usando un modulo, si dovrà
prima di tutto caricare il modulo ip_tables.o utilizzando `insmod ip_tables'.
L'opzione più importante è l'opzione di selezione della tabella `-t'. Per tutte le operazioni di NAT si dovrà sempre utilizzare `-t nat'. La seconda opzione più importante è `-A' usata per appendere una nuova regola alla fine della catena (es. -A `POSTROUTING') o `-I' per inserirne una all'inizio (es. `-I PREROUTING').
Si può specificare la sorgente (`-s' o `--source') e la destinazione (`-d' o `--destination') dei pacchetti su cui si vuole effettuare il NAT. Queste opzioni possono essere seguite da un indirizzo IP singolo (es. 192.168.1.1), da un nome (es. www.gnumonks.org) oppure da un indirizzo di rete (es. 192.168.1.0/24 oppure 192.168.1.0/255.255.255.0).
Si può inoltre specificare l'interfaccia di ingresso (`-i' o `--in-interface')
o l'interfaccia di uscita (`-o' o `--out-interface'), ma quale usare
dipende dalla catena in cui si vuole aggiungere la regola,
nella catena PREROUTING si può specificare solo l'interfaccia di ingresso,
nella catena POSTROUTING solo quella di uscita.
Se si usa quella sbagliata iptables
comunque restituirà un errore.
Come detto precedentemente si può specificare un indirizzo sorgente o di destinazione. Se si omette l'opzione di indirizzo sorgente, allora si intenderà qualsiasi indirizzo sorgente. Se si omette l'opzione di indirizzo destinazione, allora si intenderà qualsiasi indirizzo destinazione.
Si può anche indicare uno specifico protocollo (`-p' o `--protocol'), come ad esempio TCP o UDP, in questo modo solo i pacchetti con quel protocollo saranno sottoposti alla regola. La ragione principale per cui è utile specificare il protocollo è che tcp e udp consentono di utilizzare delle opzioni extra, precisamente le opzioni `--source-port' e `--destination-port' (abbreviate `--sport' e `--dport').
Queste opzioni permettono di specificare che solo i pacchetti con quella certa porta sorgente e destinazione dovranno essere sottoposti alla regola. Questo è utile per le richieste di redirezione del web (TCP porta 80 o 8080) e per lasciar stare gli altri pacchetti.
Queste opzioni devono essere inserite dopo l'opzione `-p' (che ha come effetto quello di caricare la libreria estensione del protocollo). Per le porte si possono utilizzare i numeri corrispondenti, o i nomi presenti nel file /etc/services.
Tutte le differenti caratteristiche utilizzabili per selezionare un pacchetto
sono dettagliate in modo esauriente nelle pagine del manuale (man iptables
).