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.
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.