NAT per IPv4 (prima parte)

Last updated on December 10, 2021

Blog ITA - Post 2

Complexity [ scale of 1 to 5 ]
2.5/5

I motivi che hanno portato – in ambito IPv4 – all’uso del NAT sono arcinoti. Di conseguenza, non staro’ qui a ribadire concetti di cui siete gia’ al corrente (lungi da me tediare i miei cari lettori).

Vorrei, invece, impostare l’articolo procedendo in questo modo:

  1. PRIMA PARTE: Richiami teorico/pratici su:
    • Terminologia NAT
    • Tipologie di NAT
    • Configurazione dei vari tipi di NAT su device Cisco
  2. SECONDA PARTE: Laboratorio – con uso contestuale di SNAT and DNAT – volto a discutere l’annosa questione dell’interazione tra NAT e routing (quello che noi ingegneri amiamo definire ” order of operation “)

Terminologia NAT

NAT definisce:

  • Inside Network: la porzione di rete soggetta a traduzione
  • Outside Network: cio’ che e’ al di fuori della “inside network”

Gli indirizzi IPv4 – applicando il punto di vista dell’host che necessita della traduzione NAT – assumono una connotazione diversa sulla base di due caratteristiche:

  • Ubicazione dell’indirizzo IPv4
    • inside network
    • outside network
  • Direzione del flusso dati
    • inside-to-outside
    • outside-to-inside

Di conseguenza, distinguiamo quattro tipologie di indirizzi IPv4:

  • Inside Local address: indirizzo IPv4 (assegnato al source host nella inside network) che sara’ soggetto a traduzione NAT
  • Inside Global address: indirizzo IPv4 del source host che compare nella outside network a seguito della traduzione NAT
  • Outside Local address: indirizzo IPv4 del destination host dal punto di vista della inside network
  • Outside Global address: indirizzo IPv4 del destination host dal punto di vista della outside network

Nota: nella stragrande maggioranza dei casi, gli indirizzi outside local e outside global coincidono. 

Il seguente diagramma illustra la terminologia sopra esposta:

Alcune osservazioni:

  • Siamo davanti ad un chiaro esempio di SNAT (Source NAT)
    • inside host = initiator
    • outside host = target
  • Il NAT router, ubicato al confine fra inside network ed outside network, e’ il device deputato ad effettuare la traduzione:
    • Inside Local (10.10.10.10) –> Inside Global (198.51.100.10) per i flussi inside-to-outside
    • Inside Global (198.51.100.10) –> Inside Local (10.10.10.10) per i flussi outside-to-inside
  • L’inside host, al fine di raggiungere l’outside host, utilizzera’ come Destination IP l’indirizzo Outside Local
  • L’outside host, al fine di raggiungere l’inside host, utilizzera’ come Destination IP l’indirizzo Inside Global

Tipologie di NAT

E’ possibile distinguere tre tipologie di NAT:

  • Static NAT: mappatura one-to-one tra un indirizzo Local ed uno Global
  • Dynamic NAT: mappatura many-to-many tra indirizzi Local (identificati per mezzo di una ACL) e Global (identificati per mezzo di un NAT Pool).
  • PAT (Port Address Translation): mappatura many-to-one tra indirizzi Local e Global. Nota anche come ” NAT overload “, questa tecnica utilizza la tupla IPv4-Port Number per effettuare la traduzione (andando cosi’ ad aggirare la limitazione del numero di indirizzi Inside Global presenti all’interno del NAT pool).

Configurazione del NAT

Topologia di riferimento:

Configurare Static NAT

L’obiettivo e’ quello di realizzare la seguente traduzione (one-to-one):

Inside Local (10.10.10.10) –> Inside Global (198.51.100.10) 

Riportiamo qui in basso la configurazione da applicare al NAT router:

interface GigabitEthernet0/0
ip nat inside
! 
interface GigabitEthernet0/1
ip nat outside
! 
ip nat inside source static 10.10.10.10 198.51.100.10

Effettuiamo un ping test dal PC1 verso il Server, verificando che la traduzione NAT sia avvenuta con successo:

NAT_Router#show ip nat translations
Pro Inside global Inside local Outside local Outside global
--- 198.51.100.10 10.10.10.10  ---           ---

NAT_Router#debug ip packet
IP packet debugging is on

NAT_Router#debug ip nat detailed 
IP NAT detailed debugging is on

NAT_Router#
*Nov 22 17:26:04.867: NAT*: 
i: icmp (10.10.10.10, 13578) -> (203.0.113.1, 13578) [14549]
*Nov 22 17:26:04.867: NAT*: 
s=10.10.10.10->198.51.100.10, d=203.0.113.1 [14549]
*Nov 22 17:26:04.868: NAT*: 
o: icmp (203.0.113.1, 13578) -> (198.51.100.10, 13578) [29607]
*Nov 22 17:26:04.868: NAT*: 
s=203.0.113.1, d=198.51.100.10->10.10.10.10 [29607]

NAT_Router#show ip nat translations
Pro  Inside global Inside local Outside local Outside global
icmp 198.51.100.10:13578 10.10.10.10:13578 203.0.113.1:13578 203.0.113.1:13578
--- 198.51.100.10 10.10.10.10 --- ---

NAT_Router#show ip nat statistics 
Total active translations: 1 (1 static, 0 dynamic; 0 extended)
Peak translations: 2, occurred 00:23:08 ago
Outside interfaces:
GigabitEthernet0/1
Inside interfaces: 
GigabitEthernet0/0
Hits: 14 Misses: 0
CEF Translated packets: 14, CEF Punted packets: 0
Expired translations: 2
Dynamic mappings:

Gli output del debug e degli show command dimostrano che il NAT sta funzionando correttamente.

Configurare Dynamic NAT

L’obiettivo e’ quello di realizzare la seguente traduzione (many-to-many):

A –> B 

dove:

  • A = insieme degli indirizzi Inside Local identificati per mezzo di una ACL
  • B = insieme degli indirizzi Inside Global identificati per mezzo di un NAT pool

Alcune osservazioni:

  • Il NAT pool viene utilizzato secondo una logica ” first-come , first-served
  • E’ auspicabile che la dimensione del NAT pool sia maggiore o uguale  del numero degli inside host che necessitano di traduzione NAT (se si vuole evitare che gli inside host attendano indefinitamente prima di poter effettuare traffico verso l’outside network)

Supponiamo di trovarci in una situazione di questo tipo:

  • Inside Local IPs: 10.10.10.1 – 10.10.10.14
  • NAT pool: 198.51.100.1 – 198.51.100.14

Riportiamo qui in basso la configurazione da applicare al NAT router:

interface GigabitEthernet0/0
ip nat inside
!
interface GigabitEthernet0/1
ip nat outside
!
ip nat pool NAT-POOL 198.51.100.1 198.51.100.14 netmask 255.255.255.240
!
ip nat inside source list 1 pool NAT-POOL
!
access-list 1 permit 10.10.10.0 0.0.0.15

Effettuiamo un ping test dal PC1 verso il Server, verificando che la traduzione NAT sia avvenuta con successo:

NAT_Router#
*Nov 22 18:46:15.342: NAT*:
i: icmp (10.10.10.10, 17930) -> (203.0.113.1, 17930) [53351]
*Nov 22 18:46:15.342: NAT*:
s=10.10.10.10->198.51.100.1, d=203.0.113.1 [53351]
*Nov 22 18:46:15.343: NAT*:
o: icmp (203.0.113.1, 17930) -> (198.51.100.1, 17930) [56918]
*Nov 22 18:46:15.343: NAT*:
s=203.0.113.1, d=198.51.100.1->10.10.10.10 [56918]

L’output del debug dimostra che il NAT sta funzionando correttamente.

 

Configurare PAT

L’obiettivo e’ quello di realizzare la seguente traduzione (many-to-one):

A –> B 

dove:

  • A = insieme degli indirizzi Inside Local identificati per mezzo di una ACL
  • B = insieme degli indirizzi Inside Global identificati per mezzo di un NAT pool

Tuttavia, in questo caso, A > B

Supponiamo di trovarci in una situazione di questo tipo:

  • Inside Local IPs: 10.10.10.1 – 10.10.10.254
  • NAT pool: 198.51.100.1 – 198.51.100.14

Riportiamo qui in basso la configurazione da applicare al NAT router:

interface GigabitEthernet0/0
ip nat inside
!
interface GigabitEthernet0/1
ip nat outside
!
ip nat pool NAT-POOL 198.51.100.1 198.51.100.14 netmask 255.255.255.240
!
ip nat inside source list 1 pool NAT-POOL overload
!
access-list 1 permit 10.10.10.0 0.0.0.255

Generiamo una richiesta HTTP dal PC1 verso il Server, verificando che la traduzione NAT sia avvenuta con successo:

NAT_Router#sh ip nat translations 
Pro Inside global Inside local Outside local Outside global
tcp 198.51.100.1:32772 10.10.10.10:32772 213.0.113.1:80 213.0.113.1:80

NAT_Router#sh ip nat statistics
Total active translations: 8 (0 static, 8 dynamic; 8 extended)
Peak translations: 9, occurred 00:02:19 ago
Outside interfaces:
GigabitEthernet0/1
Inside interfaces:
GigabitEthernet0/0
Hits: 64 Misses: 0
CEF Translated packets: 56, CEF Punted packets: 0
Expired translations: 0
Dynamic mappings:
-- Inside Source
[Id: 2] access-list 1 pool NAT-POOL refcount 8
pool NAT-POOL: netmask 255.255.255.240
start 198.51.100.1 end 198.51.100.14
type generic, total addresses 14, allocated 1 (7%), misses 0

Gli output degli show command dimostrano che il NAT sta funzionando correttamente.