Network Address Translation (Chapter 16)

1. Concepts
Le NAT(Network Address Translation) a été crée afin de résoudre le problème de pénurie d'adresses IPv4.
Les solutions à ce problème sont en autres :

  • CIDR (Classless Inter Domain Routing)
  • NAT
  • IPv6

1.1 CIDR
Dans un premier temps le CIDR(RFC4632) a été mis en place par l'IANA afin de réduire la table de routage (par agrégation) et pour permettre de s'abstraire des problèmes de classes pour l'allocation des IP.

+--------------------------------+----------------+
|           PREFIX               |    HOST PART   |
+--------------------------------+----------------+
Contrairement à la vision en classes (A,B et C).

Cela a permit au passage, le VLSM, le subnetting : D'où un gain dans l'adressage IPv4 (pas de perte d'adresse dûe à une utilisation d'une classe entière à cause des classes).

1.2 NAT
Le NAT(RFC3022) a pour but de translater une adresse en une autre.
Dans le but de pouvoir numéroter les machines derrière un NAT, des classes d'adresses ont été réservée à des fin privée et non routée sur Internet.
Ces classes sont les suivantes et sont référencées dans la RFC1918:

Espace d'adresses Classe Nb subnet
10.0.0.0 à 10.255.255.255 A 1
172.16.0.0 à 172.31.255.255 B 16
192.168.0.0 à 192.168.255.255 C 256

Le routeur est donc capable de "translater" une adresse privée en une adresse publique(routée sur internet).

1.3 IPv6
Cf chapitre suivant.

2. Différents types de NAT
2.1 NAT statique
Le NAT statique permet de translater une adresse privée précise vers une adresse publique précise, d'où le nom "statique".
En somme, c'est de la translation "1 pour 1".


Le NAT chez Cisco implique une terminologie bien précise des espaces dans le NAT.
Dans un premier temps :

  • Inside: Partie sur laquelle nous avons le contrôle.
  • Outside: Partie sur laquelle nous n'avons aucun contrôleur.
Ensuite, il est distinguée les parties privée et publique de la manière suivante :
  • local: Privée
  • global: Publique
On peut donc en déduire le tableau suivant :
Terme Signification
Inside local Adresse IP privée sur lequel on a le contrôle. Typiquement IP que
nous attribuons aux hôtes de notre réseau.
Inside global Adresse IP publique "translatée" à un hôte de notre réseau possédant une
adresse privée.
Outside global Adresse IP publique sur une entité qui n'est pas sous notre contrôle.
Inside local Adresse IP privée sur une entité qui n'est pas sous notre contrôle.

2.2 NAT dynamique
Le NAT dynamique a pour but lui aussi de faire de la translation d'adresse 1 pour 1, mais de manière dynamique.
En effet, une adresse dite 'inside local' sera translater en une adresse 'inside global'. L'adresse destination 'inside global' est prise dans un pool d'adresses dynamiquement selon les adresses disponibles dans le pool.

Le NAT dynamique est utilisé souvent dans de l'aggrégation de grands réseaux utilisant le même type d'adresse privé 'inside local'.



Ici, le routeur lors du retour du DNS va translater l'adresse du serveur web (web.entB.org) en l'adresse 172.16.0.201.
Ce qui permet de faire des regroupements. Ceci est complexe à mettre en oeuvre.

2.3 NAT overload ou PAT
Le NAT overload ou PAT (Port Adress Translation) a pour but lui de faire de la translation d'une ou plusieurs adresses 'inside local' vers une adresse 'inside global' (publique). En bref, les adresses privées sont chachées derrière une seule adresse publique. Ceci est réalisé au moyen du couple adresse IP (inside local)/port.
Exemple :

3. Configuration des différents types de NAT
3.1 NAT statique

  1. Mettre ip nat inside sur l'interface vers 'inside local'
  2. Mettre ip nat outside sur l'interface qui est 'inside global'
  3. Faire le mappage statique :
    ip nat inside source static adresse_ip_privee adresse_ip_public
    exemple: ip nat inside source static 192.168.1.50 217.169.242.155
NAT# show running-config
!
! Lines omitted for brevity
!
interface Ethernet0/0
  ip address 10.1.1.3 255.255.255.0
  ip nat inside
!
interface Serial0/0
  ip address 200.1.1.251 255.255.255.0
  ip nat outside
!
ip nat inside source static 10.1.1.2 200.1.1.2
ip nat inside source static 10.1.1.1 200.1.1.1

3.2 NAT dynamique

  1. Mettre ip nat inside sur l'interface vers 'inside local'
  2. Mettre ip nat outside sur l'interface qui est 'inside global'
  3. Configurer une ACL permettant de 'matcher' les adresses sources (inside local) devant être translater.
  4. Créer un pool d'adresse IP public (inside global) permettant de faire la translation avec les adresses privées.
    ip nat pool name first-address last-address mask subnet-mask.
  5. Mettre en place le NAT dynamique:
    ip nat source list acl-number pool pool-name
Exemple:
NAT# show running-config
!
! Lines omitted for brevity
!
interface Ethernet0/0
  ip address 10.1.1.3 255.255.255.0
  ip nat inside
!
interface Serial0/0
  ip address 200.1.1.251 255.255.255.0
  ip nat outside
!
ip nat pool fred 200.1.1.1 200.1.1.2 netmask 255.255.255.252
ip nat inside source list 1 pool fred
!
access-list 1 permit 10.1.1.2
access-list 1 permit 10.1.1.1

3.3 NAT overload ou PAT
La configuration du NAT overload se fait essentiellement comme celle du NAT dynamique, à la différence près que nous allons suffixer la commande 'ip nat inside source' par 'overload'.

  1. Mettre ip nat inside sur l'interface vers 'inside local'
  2. Mettre ip nat outside sur l'interface qui est 'inside global'
  3. Configurer une ACL permettant de 'matcher' les adresses sources (inside local) devant être translater.
  4. Mettre le NAT overload en place par la commande :
    ip nat inside source list acl-number interface interface_name/number overload
Exemple:
NAT# show running-config
!
! Lines omitted for brevity
!
interface Ethernet0/0
  ip address 10.1.1.3 255.255.255.0
  ip nat inside
!
interface Serial0/0
  ip address 200.1.1.251 255.255.255.0
  ip nat outside
!
ip nat inside source list 1 interface Serial0/0 overload 
!
access-list 1 permit 10.1.1.2
access-list 1 permit 10.1.1.1

4. Dépannage concernant le NAT
Il n'y a pas énormément de choses à vérifier sur la configuration du NAT. Celles-ci sont regroupées dans l'énumération suivante :

  • Bien vérifier sur quelle interface, nous avons mis ip nat inside et ip nat outside si cela a du sens suivant notre architecture.
  • Pour le NAT statique, vérifier que dans la commande : 'ip nat inside source static add_src add_dest' l'adresse 'add_src' est bien une adresse 'inside local (privée)' et que l'adresse 'add_dest' est bien une adresse 'inside global (public)'
  • Pour le NAT dynamique, vérifier que l'ACL 'matche' bien, mais aussi qu'elle matche bien sur les paquets sur les adresses sources et non destination.
    R# show access-list
    
  • Pour le NAT dynamique, vérifier qu'il y a bien assez d'adresses IP dans le pool pour faire la translation des @IP inside local. Le problème se traduit par une augmentation du compteur 'misses' via show ip nat statistics.
  • Pour la NAT overload, il est très facile d'oublier le suffixe 'overload', ce qui se traduit par : le NAT fonctionne, mais pas le PAT, donc pas de retour des paquets vers l'émetteur derrière le routeur NAT.
  • Vérifier qu'il n'y a pas une ACL sur une interface qui 'discard' des paquets.