Magazine Informatica

100 sfumature di NAT

Creato il 07 novembre 2012 da Nightfly

Si, avete ragione, il titolo è "leggermente" riciclato, ma se l'ho scelto avrò i miei buoni motivi. Uno su tutti è il fatto che qualunque dispositivo di rete in grado di operare con il NAT implementa una propria logica e lo usa come meglio crede. Vi sembro esagerato? Provate a leggere la continuazione di questo post ed alla fine non potrete che essere d'accordo con me.

 

nat.gif

Cos'è il NAT e perchè viene usato?

L'acronimo NAT sta per Network Address Translation e consente di tradurre un determinato indirizzo IP in un'altro. Tale tecnologia è stata introdotta poichè i classici indirizzi IP pubblici a 32 bit (leggasi IPv4) iniziavano a scarseggiare, ragion per cui si è deciso di fare in modo che i PC di una LAN (con spazio di indirizzamento privato, ovvero 10.0.0.0/8, 172.16.0.0/12 e 192.168.0.0/16) potessero "presentarsi" su Internet utilizzando uno o più indirizzi IP pubblici.

Il NAT è sufficiente?

Bhè, forse il NAT puro è stato sufficiente per i primi tempi, ma dopo un po' ha cominciato a presentare qualche punto debole, soprattutto quando viene usato per tradurre indirizzi IP privati in pubblici. Infatti, se nella LAN sono presenti N PC con N indirizzi IP privati, sono necessari altrettanti indirizzi IP pubblici (NAT pool) per consentire loro di navigare su Internet contemporaneamente. Che fregatura, vero? Bene, per sopperire a tale limitazione si è scelto di implementare una tecnologia simile al NAT (poichè anche questa effettua una traduzione da privato in pubblico), ma, per certi versi, più performante, ovvero il PAT. Il PAT viene detto anche IP Maquerading (poichè consente di nascodenre l'IP privato dietro l'IP pubblico), NAT Overloading o IP overloading e vi assicuro che ciascun produttore di network device potrebbe utilizzare a piacere uno qualunque di questi appellativi, dunque tenete bene a mente tali sinonimi.

Cos'è il PAT?

Il termine PAT sta per Port Address Translation. A differenza del NAT non effettua una traduzione uno a uno (static NAT) o uno a molti (dynamic NAT, ovvero un indirizzo IP privato può essere mappato su uno degli N indirizzi IP pubblici del pool, a seconda della loro disponibilità) ma è in grado di tradurre più indirizzi IP privati in un unico indirizzo IP pubblico. La logica che segue è molto semplice: per ogni richiesta proveniente da un PC della LAN memorizza non solo l'IP sorgente, ma anche la porta sorgente. Ad esempio:

192.168.3.1:1025

viene tradotto in:

98.53.21.3:1025

dove 98.53.21.3 è l'IP pubblico utilizzato dai PC della LAN per uscire su Internet, mentre 1025 è la porta usata per inizializzare la connessione verso l'esterno.

Queste informazioni vengono inserite e mantenute (per un lasso di tempo variabile ma comunque limitato), all'interno di un'apposita tabella, detta appunto NAT table.

Nell'ambito dei sistemi *nix che fungono da firewall/router è possibile implementare il PAT mediante un semplice comando, ovvero:

#PAT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Il MASQUERADE finale indica che stiamo utilizzando il PAT (aka IP Masquerading).

Inoltre, stiamo appendendo una regola (-A) alla chain POSTROUTING che fa riferimento alla tabella nat (-t nat).

Il PAT è supportato (ovviamente) anche dai router casalinghi di casa Cisco (in particolare la serie 800).

Per implementarlo è neccessario utilizzare le seguenti direttive:

Router# conf t
Router(config)# int dia0
Router(config-if)# ip nat outside
Router(config-if)# exit
Router(config)# int e0
Router(config-if)# ip nat outside
Router(config)# ip nat inside source list 1 interface Dialer0 overload

Stiamo semplicemente dicendo al router che l'interfaccia e0 è quella "affacciata" alla nostra LAN, mentre l'interfaccia Dia0 (virtuale), è quella a cui è associato il nostro IP pubblico. Con l'ultimo comando, infine, stiamo imponendo la traduzione degli IP della LAN nell'indirizzo pubblico (la keyword overload cosa vi ricorda? IP o NAT overloading, ovvero il PAT).

Quanti tipi di NAT esistono?

La risposta è un po' lapidaria: molteplici. Infatti, il NAT generalmente viene suddiviso in due macro tipologie: source NAT e destination NAT. Nel primo caso è l'IP privato ad essere tradotto in IP pubblico, nel secondo caso accade il contrario. Il destination NAT viene utilizzato quando volete mettere in ascolto su Internet un PC della vostra LAN (alcuni router casalinghi chiamano tale operazione port forwarding o port mapping, altri ancora la chiamano virtual server).

Vediamo quali sono i comandi per implementare il destination NAT mediante iptables:

iptables -t nat -A PREROUTING -p tcp --dport 4711 -i eth0 -j DNAT --to 10.0.0.4

Come si implementa il destination NAT sui router Cisco serie 800? Semplice, basta usare il seguente comando:

Router(config)#ip nat inside source static tcp <indirizzo locale PC> 22 interface Dialer0 22

In particolare, stiamo nattando l'indirizzo locale del PC su cui è in ascolto un demone SSH sulla porta 22 dell'IP pubblico assegnato alla Dialer0. In soldoni, ciò significa che tutti i tentativi di connessioni provenienti da Internet e diretti al nostro indirizzo IP pubblico sulla porta 22, verranno "inoltrati" al PC della LAN su cui è in ascolto il demone SSH.

Per ragioni di sicurezza, potremmo modificare la porta pubblica su cui metterci in ascolto, utilizzando ad esempio la 2244 (non standard):

Router(config)# ip nat inside source static tcp <indirizzo locale PC> 22 interface Dialer0 2244

Quindi, chiunque si volesse connettere sulla porta 2244 del nostro IP pubblico, verrà "girato" sulla porta 22 del PC locale.

In questo caso parliamo di NAPT (Network And Port Translation).

Infine, è bene notare che abbiamo a che fare con lo static NAT, in quanto all'indirizzo IP pubblico viene associato staticamente l'IP locale del PC che funge da server SSH.

Oltre al source ed al destination NAT esiste anche il cosiddetto double NAT. Esso viene utilizzato nell'ambito delle VPN site-to-site, in grado cioè di interconnettere in modo sicuro due LAN dislocate in punti geografici differenti. Inoltre, affinchè si renda necessario l'uso del double NAT è indispensabile che entrambe le LAN utilizzino lo stesso spazio di indirizzamento privato. Infatti, non è possibile ruotare i pacchetti tra due LAN che usano la medesima classe di indirizzi IP privati, quindi per evitare che si effettui una rimappatura di tali indirizzi si utilizza il double NAT.

Ma il NAT/PAT serve solo per la traduzione di IP privati in pubblici?

No. Il NAT può tornare utile anche quando si vuole consetire ad un PC della LAN di accedere ad un server che sta in DMZ. Infatti, per default, le security appliance rendono impossibile la comunicazione tra la zona Interna e la DMZ, quindi, l'unico modo per riuscire a fare ciò è creare una entry NAT con relativa regola di firewalling.

E' possibile visualizzare il contenuto delle tabelle NAT?

Certo che si. Per i sistemi *nix occorre installare un pacchetto apposito, ovvero netstat-nat:

nightfly@nightbox:~$ sudo apt-get install netstat-nat

e poi lanciare il comando sudo netstat-nat il cui output sarà simile al seguente:

Proto NATed Address   Destination Address   State

tcp   nightflyvaio.*.*:8373   mil01s16-in-f23.1e100.ne:https ESTABLISHED
tcp   nightflyvaio.*.*:8440   mil01s17-in-f9.1e100.net:https ESTABLISHED
tcp   nightflyvaio.*.*:6033   78.141.*.*:12350   ESTABLISHED
tcp   nightflyvaio.*.*:8370   muc03s02-in-f17.1e100.ne:https ESTABLISHED
tcp   nightflyvaio.*.*:6349   pop.tiscali.it:imaps   ESTABLISHED
tcp   nightflyvaio.*.*:8372   muc03s02-in-f24.1e100.ne:https ESTABLISHED

Per i router Cisco serie 800, invece, è sufficiente utilizzare il comando:

Router# sh ip nat translations

il cui output sarà simile a:

Pro Inside global   Inside local   Outside local   Outside global

tcp 79.55.117.*:6881   192.168.*.*:6881   ---   ---
tcp 79.55.117.*:6882   192.168.*.*:6882   ---   ---
udp 79.55.117.*:52121   192.168.*.*:52121   208.67.222.222:53   208.67.222.222:53
udp 79.55.117.*:30171   192.168.*.*:30171   208.67.220.220:53   208.67.220.220:53
udp 79.55.117.*:58847   192.168.*.*:58847   208.67.220.220:53   208.67.220.220:53
tcp 79.55.117.*:6882   192.168.*.*:6882   151.62.35.107:54700   151.62.35.107:54700

Nei prossimi post (tempo permettendo) parlerò delle tecniche di NAT traversal.

A presto.


Potrebbero interessarti anche :

Ritornare alla prima pagina di Logo Paperblog

Possono interessarti anche questi articoli :