Network address translation (NAT) è il processo di modifica delle informazioni sugli indirizzi IP nelle intestazioni dei pacchetti IP mentre sono in transito attraverso un dispositivo di instradamento del traffico.
Ci sono due diversi tipi di NAT:
- NAT
- Static NAT: Il tipo più semplice di NAT fornisce una traduzione one-to-one degli indirizzi IP. È spesso chiamato anche one-to-one NAT. In questo tipo di NAT solo gli indirizzi IP, il checksum dell’header IP e qualsiasi checksum di livello superiore che include l’indirizzo IP devono essere cambiati. Il resto del pacchetto può essere lasciato inalterato (almeno per le funzionalità TCP/UDP di base, alcuni protocolli di livello superiore possono richiedere un’ulteriore traduzione). I NAT di base possono essere usati quando c’è la necessità di interconnettere due reti IP con indirizzi incompatibili. Con lo static NAT, le traduzioni esistono nella tabella di traduzione NAT non appena si configura il comando (o i comandi) static NAT, e rimangono nella tabella di traduzione finché non si cancella il comando (o i comandi) static NAT.
- Dynamic NAT: Dynamic NAT ha alcune similitudini e differenze rispetto allo static NAT. Come lo static NAT, il router NAT crea una mappatura uno-a-uno tra un indirizzo interno locale e uno interno globale e cambia gli indirizzi IP nei pacchetti quando escono ed entrano nella rete interna. Tuttavia, la mappatura di un indirizzo locale interno a un indirizzo globale interno avviene dinamicamente. Il NAT dinamico imposta un pool di possibili indirizzi globali interni e definisce criteri di corrispondenza per determinare quali indirizzi IP locali interni dovrebbero essere tradotti con il NAT. La voce dinamica rimane nella tabella finché il traffico scorre occasionalmente. Con il NAT dinamico, le traduzioni non esistono nella tabella NAT finché il router non riceve il traffico che richiede la traduzione. Le traduzioni dinamiche hanno un periodo di timeout dopo il quale vengono eliminate dalla tabella di traduzione.
- PAT
- Static PAT: le traduzioni Static PAT permettono ad una specifica porta UDP o TCP su un indirizzo globale di essere tradotta ad una specifica porta su un indirizzo locale. Static PAT è lo stesso di static NAT, eccetto che ti permette di specificare il protocollo (TCP o UDP) e la porta per gli indirizzi reali e mappati. Static PAT ti permette di identificare lo stesso indirizzo mappato attraverso molte dichiarazioni statiche diverse, a condizione che la porta sia diversa per ogni dichiarazione. Non puoi usare lo stesso indirizzo mappato per più dichiarazioni NAT statiche. Con PAT statico, le traduzioni esistono nella tabella di traduzione NAT non appena configuri il comando o i comandi PAT statici, e rimangono nella tabella di traduzione finché non cancelli il comando o i comandi PAT statici.
- NAT Overload o PAT: è comune nascondere un intero spazio di indirizzi IP, di solito costituito da indirizzi IP privati, dietro un singolo indirizzo IP (o in alcuni casi un piccolo gruppo di indirizzi IP) in un altro spazio di indirizzi (di solito pubblico). Questo tipo di NAT è chiamato PAT in sovraccarico. La voce dinamica rimane nella tabella finché il traffico scorre occasionalmente. Con PAT in sovraccarico, le traduzioni non esistono nella tabella NAT finché il router non riceve traffico che richiede la traduzione. Le traduzioni hanno un periodo di timeout dopo il quale vengono eliminate dalla tabella di traduzione.
Esempio #1: Static Source NAT
Come tradurre l’indirizzo IP 172.16.0.5 all’indirizzo ip 10.16.0.5.
Definire l’ip nat inside:
Ciscozine(config)#interface fa0/0Ciscozine(config-if)#ip nat inside
Definire l’ip nat outside:
Ciscozine(config)#interface fa0/1Ciscozine(config-if)#ip nat outside
Definire la voce static NAT:
ip nat inside source static 172.16.0.5 10.16.0.5
Con static NAT, la traduzione esiste nella tabella di traduzione NAT non appena si configura il comando static NAT, e rimane nella tabella di traduzione finché si cancella il comando static NAT:
Ciscozine#sh ip nat translationsPro Inside global Inside local Outside local Outside global--- 10.16.0.5 172.16.0.5 --- ---Ciscozine#
Se il client invia un pacchetto ICMP o una richiesta HTTP al server web, la tabella nat sarà:
Ciscozine#sh ip nat translationsPro Inside global Inside local Outside local Outside globalicmp 10.16.0.5:1 172.16.0.5:1 10.0.0.100:1 10.0.0.100:1tcp 10.16.0.5:56080 172.16.0.5:56080 10.0.0.100:80 10.0.0.100:80--- 10.16.0.5 172.16.0.5 --- ---Ciscozine#
Ricordo: Poiché l’indirizzo mappato è lo stesso per ogni connessione consecutiva con static NAT, ed esiste una regola di traduzione persistente, static NAT permette agli host sulla rete di destinazione di avviare il traffico verso un host tradotto (se esiste una lista di accesso che lo permette).
Esempio #2: Dynamic Source NAT
Come tradurre la rete 172.16.0.0/28 nella rete 10.16.0.0/29.
Definire l’ip nat inside:
Ciscozine(config)#interface fa0/0Ciscozine(config-if)#ip nat inside
Definire l’ip nat outside:
Ciscozine(config)#interface fa0/1Ciscozine(config-if)#ip nat outside
Definire il pool nat usato nella traduzione NAT:
Ciscozine(config)#ip nat pool dynamic-ip 10.0.16.1 10.0.16.6 prefix-length 29
Definire quale rete sarà tradotta:
Ciscozine(config)#ip access-list standard client-listCiscozine(config-std-nacl)#permit 172.16.0.0 0.0.0.15
Definire la sorgente NAT dinamica:
Ciscozine(config)#ip nat inside source list client-list pool dynamic-ip
Con il NAT dinamico, le traduzioni non esistono nella tabella NAT finché il router non riceve il traffico che richiede la traduzione.
Ciscozine#sh ip nat translationsCiscozine#
ma quando alcuni pacchetti corrispondono all’ACL..
Ciscozine#sh ip nat translations Pro Inside global Inside local Outside local Outside globalicmp 10.0.16.1:2 172.16.0.1:2 10.0.0.100:2 10.0.0.100:2tcp 10.0.16.2:35694 172.16.0.2:35694 10.0.0.100:80 10.0.0.100:80tcp 10.0.16.1:56185 172.16.0.1:56185 10.0.0.100:80 10.0.0.100:80--- 10.0.16.1 172.16.0.1 --- ------ 10.0.16.2 172.16.0.2 --- ---Ciscozine#
Nota: Se un nuovo pacchetto arriva da un altro host interno, e ha bisogno di una voce NAT, ma tutti gli indirizzi IP del pool sono in uso, il router semplicemente scarta il pacchetto.
Questo può essere controllato abilitando il “debug ip nat”.
Feb 12 19:26:09.895: NAT: translation failed (E), dropping packet s=172.16.0.5 d=10.0.0.100
L’utente deve riprovare finché una voce NAT non va in time out, a quel punto la funzione NAT funziona per il prossimo host che invia un pacchetto. Essenzialmente, il pool globale interno di indirizzi deve essere grande quanto il numero massimo di host concorrenti che hanno bisogno di usare Internet allo stesso tempo – a meno che non usiamo PAT.
Ricorda: La differenza principale tra il NAT dinamico e un intervallo di indirizzi per il NAT statico è che il NAT statico permette a un host remoto di avviare una connessione a un host tradotto (se esiste una lista di accesso che lo permette), mentre il NAT dinamico no. Hai anche bisogno di un numero uguale di indirizzi mappati come indirizzi reali con static NAT.
Esempio #3: Static PAT
Come esporre due servizi diversi su Internet:
- Il server Web (172.16.0.5) è in ascolto sulla porta tcp 80; questo server risponde all’indirizzo pubblico 88.88.88.88:80 da Internet (esterno).
- Il server SSH (172.16.0.6) è in ascolto sulla porta tcp 22; questo server risponde all’indirizzo pubblico 88.88.88.88:666 da Internet (esterno) .
Definire l’ip nat interno:
Ciscozine(config)#interface fa0/0Ciscozine(config-if)#ip nat inside
Definire l’ip nat esterno:
Ciscozine(config)#interface fa0/1Ciscozine(config-if)#ip nat outside
Definire il PAT statico:
Il server web risponde sulla porta tcp 80 sull’interfaccia ‘esterna’.
ip nat inside source static tcp 172.17.0.5 80 88.88.88.88 80
Il server SSH risponde sulla porta tcp 666 sull’interfaccia ‘esterna’; in questo caso, la porta reale (22 tcp) è tradotta nella porta tcp 666 quando una richiesta viene da Internet.
ip nat inside source static tcp 172.17.0.6 22 88.88.88.88 666
Come il NAT statico, la traduzione PAT statica esiste nella tabella di traduzione NAT non appena si configura il comando PAT statico, e rimane nella tabella di traduzione finché non si cancella il comando PAT statico.
Ciscozine#sh ip nat translations Pro Inside global Inside local Outside local Outside globaltcp 88.88.88.88:80 172.16.0.5:80 --- ---tcp 88.88.88.88:666 172.16.0.6:22 --- ---Ciscozine#
Se un client Internet invia una richiesta HTTP o una connessione SSH (sulla porta tcp 666), la tabella nat sarà:
Ciscozine#sh ip nat translations Pro Inside global Inside local Outside local Outside globaltcp 88.88.88.88:80 172.16.0.5:80 56.56.56.56:54686 56.56.56.56:54686tcp 88.88.88.88:80 172.16.0.5:80 --- ---tcp 88.88.88.88:666 172.16.0.6:22 56.56.56.56:33704 56.56.56.56:33704tcp 88.88.88.88:666 172.16.0.6:22 --- ---Ciscozine#
Esempio #4: PAT – NAT Overload
Come condividere una connessione Internet.
Definire l’ip nat interno:
Ciscozine(config)#interface fa0/0Ciscozine(config-if)#ip nat inside
Definire l’ip nat esterno:
Ciscozine(config)#interface fa0/1Ciscozine(config-if)#ip nat outside
Definire quale rete sarà tradotta:
Ciscozine(config)#ip access-list standard client-listCiscozine(config-std-nacl)#permit 172.16.0.0 0.0.0.255
Definire il NAT Overload:
Ciscozine(config)#ip nat inside source list client-list interface fastethernet0/1 overload
Come il NAT dinamico, le traduzioni non esistono nella tabella NAT finché il router non riceve il traffico che richiede la traduzione:
Ciscozine#sh ip nat translationsCiscozine#
ma quando alcuni pacchetti corrispondono alla ACL..
Ciscozine#show ip nat translationsPro Inside global Inside local Outside local Outside globaltcp 88.88.88.88:7921 172.16.0.2:7921 95.100.96.233:443 95.100.96.233:443tcp 88.88.88.88:8651 172.16.0.5:8651 173.194.44.18:80 173.194.44.18:80tcp 88.88.88.88:8652 172.16.0.111:8652 173.194.44.18:443 173.194.44.18:443tcp 88.88.88.88:8653 172.16.0.223:8653 173.194.70.84:443 173.194.70.84:443udp 88.88.88.88:64116 172.16.0.222:64116 8.8.8.8:53 8.8.8.8:53udp 88.88.88.88:64756 172.16.0.223:64756 8.8.4.4:53 8.8.4.4:53Ciscozine#
Ci sono altri tipi di NAT/PAT?
La risposta è SI! Un tipo di NAT/PAT molto usato è l’ip nat outside source; questo comando permette di tradurre l’indirizzo sorgente di un pacchetto che entra nell’interfaccia ‘outside’ e lascia l’interfaccia ‘inside’.
In termini semplici, se vedi il primo esempio #1
Il comando:
ip nat outside source static 10.0.0.100 192.168.0.100
traduce il 10.0.0.100 al 192.168.0.100 , così il client deve chiamare l’indirizzo 192.168.0.100 per contattare il server web e non il 10.0.0.100.
Un altro tipo particolare di nat è l’ip nat inside destination usato quando più dispositivi interni sono server identici con contenuto speculare, che dall’esterno sembrano essere un unico server di bilanciamento del carico.
Si definisce un pool di indirizzi contenenti gli indirizzi degli host reali che terminano con “type rotary” rendendo i server disponibili in modo round-robin. La lista di accesso permette ora l’indirizzo IP dell’host virtuale, cioè quello che il mondo esterno pensa sia l’indirizzo dell’host. Così l’host virtuale è 123.123.123.132, con gli host reali che sono 172.16.0.2 attraverso 10.
Configurazione parziale
interface FastEthernet0/0ip address 172.16.0.0 255.255.255.0ip nat inside!interface FastEthernet0/1ip address 88.88.88.88 255.255.255.252ip nat outside!ip nat pool real-ip-server 172.16.0.2 172.16.0.10 prefix-length 24 type rotaryip nat inside destination list 1 pool real-ip-server!ip route 0.0.0.0 0.0.0.0 FastEthernet0/1!access-list 1 permit 123.123.123.123
Questa traduzione non è bidirezionale in natura. Dovrete usare un NAT statico uno a uno per realizzarlo. Un tipo di funzionalità “ip nat inside source static” può essere ottenuto con la configurazione di cui sopra utilizzando un singolo indirizzo nel pool NAT, ma questo funzionerebbe solo per il traffico da esterno a interno.
Dove applicare il nat interno/esterno?
Tipicamente “ip nat inside” è configurato sulle interfacce nel tuo ambiente locale che non possono essere instradate verso Internet (tipicamente intervallo privato di indirizzi IP) e “ip nat outside” sull’interfaccia che è collegata a Internet.
Quando il router esegue il NAT?
Da dentro a fuori:
- Se IPSec allora controlla la lista di accesso in entrata
- decrittazione – per CET (Cisco Encryption Technology) o IPSec
- controlla la lista di accesso in entrata
- controlla i limiti di velocità in entrata
- contabilità in entrata
- redirezionare alla cache web
- policy routing
- routing
- NAT inside to outside (traduzione da locale a globale)
- crypto (controlla la mappa e segna per la crittografia)
- controlla la lista di accesso in uscita
- inspect (Context-based Access Control (CBAC))
- TCP intercept
- encryption
- Queueing
Outside to Inside:
- Se IPSec allora controlla la lista di accesso in entrata
- decrittazione – per CET o IPSec
- controlla la lista di accesso in entrata
- controlla i limiti di velocità in entrata
- contabilità in entrata
- reindirizza alla cache web
- NAT da esterno a interno (traduzione globale a locale traduzione)
- policy routing
- routing
- crypto (controlla la mappa e segna per la crittografia)
- check output access list
- inspect CBAC
- TCP intercept
- encryption
- Queueing
Alcuni comandi utili:
- Per vedere alcune statistiche sul NAT: show ip nat statistics
- Per vedere una lista completa delle voci NAT/PAT statiche/dinamiche: show ip nat translations
- Per cancellare la voce nat dinamica: clear ip na translation *
- Per fare il debug NAT: debug ip nat