Avanti Indietro Indice

7. NAT

7.1 Descrizione

Questo modulo permette di sfruttare le nuove funzionalità introdotte sotto il termine NAT (Network Address Translation). Precedentemente con ipchains si utilizzava l'obiettivo '-j MASQ', ora questo non è più possibile in quanto è stato sostituito con i seguenti obiettivi:

Per quanto riguarda invece il port-forwarding è necessario utilizzare:

7.2 Operazioni

Prima di poter utilizzare una qualsiasi delle operazioni seguenti è necessario specificare l'opzione '-t nat', questa causa il caricamento del modulo ed è necessario ogni qual volta si vogliano effettuare operazioni di SNAT, DNAT, MASQUERADING. es. iptables -A PREROUTING -t nat ...

La tabella nat contiene tre catene predefinite:

Queste catene sono disposte così:

 
 -----> PREROUTING --> Routing ------------------------------> POSTROUTING ---->
          DNAT            |                             ^         SNAT
                          |                             |
                          |                          Routing
                          |                             |  
                          |                           OUTPUT 
                          |                            DNAT
                          |                             |
                          +------ Processi locali ------+
                                     Firewall

Il filtraggio e il NAT sono distinti e in genere non è necessario preoccuparsi. DNAT è effettuato prima del routing e prima che i pacchetti siano filtrati. SNAT è effettuato dopo il routing e dopo che i pacchetti sono stati filtrati.

SNAT (Source NAT)

SNAT permette di modificare il campo sorgente del pacchetto. Questo avviene in POSTROUTING ossia subito dopo la fase di routing, poco prima che il pacchetto sia inviato nella rete.

Questa operazione è utilizzata principalmente per il mascheramento della connessione, e in particolare è specifica per indirizzi statici. In caso di indirizzi dinamici, connessioni dialup utilizzare MASQUERADE.

Sono richieste le seguenti informazioni: tabella ('-t nat'), catena ('-A POSTROUTING'), obiettivo ('-j SNAT'), indirizzo sorgente che andrà a sostituire quello presente nel pacchetto ('--to' o '--to-source').

L'utilizzo dell'opzione '--to/--to-source' è il seguente:

--to-source ipaddr[-ipaddr][:port-port]

E' possibile anche specificare più di un indirizzo sorgente. Quindi se si desidera che ai pacchetti siano assegnati come indirizzo sorgente uno tra due o più indirizzi (es. 1.2.3.0 e 1.2.3.1) si può utilizzare:

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 1.2.3.0 --to 1.2.3.1  

Si può inoltre specificare un'intervallo di indirizzi:

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 1.2.3.0-1.2.3.5  

E anche una o un'intervallo di porte (è necessario specificare il protocollo tcp/udp):

iptables -t nat -A POSTROUTING -p tcp --dport telnet -o eth1 -j SNAT --to 1.2.3.5:23  

# --------------------------------------------------------------------------------
# Con il seguente comando indichiamo al kernel che a tutti i pacchetti in uscita
# dall'interfaccia eth0 (-o eth0) deve sostituire l'indirizzo sorgente con quello 
# del firewall (es.  151.99.xxx.x). 
# --------------------------------------------------------------------------------
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 151.99.xxx.x 

MASQUERADE

MASQUERADE è una forma di SNAT creata appositamente per gestire i collegamenti dialup (PPP). E' raccomandato utilizzare l'obiettivo MASQUERADE solo se l'indirizzo IP viene assegnato dinamicamente ad esempio da un provider. Se si possiede invece un indirizzo statico è necessario utilizzare l'obiettivo SNAT.

Diversamente dal SNAT, se la linea dovesse interrompersi, i dati transitati e le connessioni saranno dimenticate, ciò è necessario per evitare problemi nel momento in cui ci si riconnetterà nuovamente al provider.

NOTA: in questo caso il provider ci fornirà un nuovo indirizzo IP.

Sono richieste le seguenti informazioni: tabella ('-t nat'), catena ('-A POSTROUTING'), interfaccia da cui usciranno i pacchetti ('-o ppp0'), obiettivo ('-j MASQUERADE'). Non è necessario specificare l'indirizzo sorgente, sarà utilizzato quello dell'interfaccia da cui usciranno i pacchetti.

E' inoltre possibile specificare una o un'intervallo di porte (è necessario specificare anche il protocollo tcp/udp):

--to-ports <port>[-<port>]      Port (range) to map to.

Segue un esempio di come mascherare tutti i pacchetti in uscita dall'interfaccia ppp0 con l'indirizzo assegnato ad esempio dal provider.

# Carica il modulo NAT
modprobe iptable_nat

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

DNAT (Destination NAT)

DNAT permette di modificare il campo destinazione del pacchetto. Questo avviene in fase di PREROUTING ossia subito prima della fase di routing, appena il pacchetto arriva dalla rete.

Sono richieste le seguenti informazioni: tabella ('-t nat'), catena (-A PREROUTING o -A OUTPUT), obiettivo ('-j DNAT'), interfaccia di provenienza ('-i eth0'), indirizzo che andrà a sostituire quello presente nel pacchetto ('--to').

L'utilizzo dell'opzione '--to/--to-destination' è il seguente:

--to-destination ipaddr[-ipaddr][:port-port]

Esempio:

# --------------------------------------------------------------------------------
# Cambia l'indirizzo di destinazione in 192.168.0.6
# --------------------------------------------------------------------------------
iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 192.168.0.6 

E' possibile, come nel caso di SNAT, specificare più di un indirizzo destinazione. Se si desidera che ai pacchetti siano assegnati come indirizzo destinazione uno tra due o più indirizzi (es. 1.2.3.0 e 1.2.3.1) si può utilizzare:

iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 1.2.3.0 --to 1.2.3.1  

Si può inoltre specificare un'intervallo di indirizzi e ottenere il cosiddetto load-balancing primitivo:

# --------------------------------------------------------------------------------
# Tutti i pacchetti tcp destinati alla porta www e in ingresso dall'interfaccia eth0
# devono essere inviati verso le macchine 192.168.0.2 e 192.168.0.3. 
# --------------------------------------------------------------------------------
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport www -j DNAT --to 192.168.0.2-192.168.0.3

          +---+
          |PC1|----+                          
          +-- +    |                      
                   |     Linux box
          +---+    |       +---+<=========
          |MAC|----+-------|PC0|----O----- INTERNET
          +---+    |       +---+\        
                   |      !! |   \__________ eth0        
          +---+    |      !! | +----+
          |PC2|----+      !>>+-|WWW1| 192.168.0.2 
          +---+           !! | +----+
                          !! | +----+
                          !>>+-|WWW2| 192.168.0.3
                               +----+

             LAN            SERVERS       Internet
        [rete locale]  

E anche una o un'intervallo di porte (è necessario specificare il protocollo tcp/udp):

iptables -t nat -A PREROUTING -p tcp --dport www -i eth0 -j DNAT --to 192.168.0.5:8080
  
          +---+
          |PC1|----+                          
          +-- +    |                      
                   |     Linux box
          +---+    |       +---+<=========
          |MAC|----+-------|PC0|----O----- INTERNET
          +---+    |       +---+\        
                   |      !! |   \__________ eth0        
          +---+    |      !! | +---+
          |PC2|----+      !>>+-|WWW| 192.168.0.5 porta 8080
          +---+              | +---+
                             | +----+
                             +-|MAIL|
                               +----+

             LAN            SERVERS       Internet
        [rete locale]  

Esiste anche una forma specializzata di DNAT detta Redirezione che permette di redirigire il traffico verso una determinata porta del firewall stesso utilizzando l'obiettivo REDIRECT.

E' più che altro una comodità, in quanto si può utilizzare allo stesso scopo anche il DNAT, ed è utile per implementare il proxy trasparente.

Sono richieste le seguenti informazioni: tabella ('-t nat'), catena ('-A PREROUTING'), obiettivo ('-j REDIRECT'), interfaccia di provenienza ('-i eth0'), porta che andrà a sostituire quella presente nel pacchetto ('--to-port'). Esempio:

# --------------------------------------------------------------------------------
# Invia i pacchetti diretti alla porta www verso il proxy squid che è in
# ascolto sulla porta 3128 del firewall.
# --------------------------------------------------------------------------------
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport www -j REDIRECT --to-port 3128

          +---+       pacchetto rediretto alla porta 3128
          |PC1|----+        +-+        
          +---+    |        | |        
                   |        V |  
          +---+    |       +---+<=========
          |MAC|----+-------|PC0|----O----- INTERNET
          +---+    |       +---+\ 
                   |             \
          +---+    |              eth0
          |PC2|----+       
          +---+

             LAN                          Internet
        [rete locale]  

7.3 Protocollo speciali (ftp, quake, irc)

In alcuni casi il NAT potrebbe non funzionare correttamente, questo a causa di alcuni protocolli "particolari" (es. ftp, irc). Questo problema è presente anche con ipchains e la soluzione consiste nel realizzare dei moduli specifici per ciascuno di essi.

Per ipchains esistono ip_masq_ftp, ip_masq_raudio, ip_masq_irc, ...

Per iptables al momento sono disponibili moduli specifici per FTP (ip_conntrack_ftp.o e ip_nat_ftp.o) e da poco per IRC, mentre altri sono in fase di realizzazione.


Avanti Indietro Indice