Licence CC BY-NC-ND

NAT ou l'art de la dissimulation

Lors de la partie sur l’adressage, nous avons évoqué les adresses privées et le fait qu’elles ne peuvent pas être routées sur Internet. Pour pouvoir communiquer dans un tel cas, on peut faire de la translation. Ne fuyez pas tout de suite : ce n’est pas de la géométrie ! >_<

NAT : cette adresse que je ne saurais voir

La translation d’adresse, ou NAT pour Network Address Translation, est une technique qui consiste pour un routeur (ou un pare-feu) à remplacer une adresse IP source par une autre. L’hôte de destination ne voit que l’adresse de substitution.

Translation d'adresse
Translation d’adresse

Comment il fait pour répondre ? o_O

Eh bien, il répond à l’adresse source qu’il voit, le plus naturellement du monde. Elle doit normalement être attribuée au routeur qui a réalisé la translation d’adresse et qui va donc recevoir la réponse, et la renvoyer à l’hôte qui a émis la requête à l’origine.

Comment le routeur sait à qui renvoyer la réponse ?

Dans le cas le plus simple, on associe une adresse source réelle, interne, à une adresse de substitution, externe. Selon l’IP à qui est adressé le paquet, le routeur sait donc vers quel hôte le renvoyer. On appelle cela du NAT statique. Il est aussi possible de définir un pool d’adresses, comme avec DHCP, et de piocher dedans quand il y a besoin. C’est du NAT dynamique. Utile quand on a moins d’adresses externes que d’adresses internes.

Réponse à un paquet ayant subi une translation d'adresse
Réponse à un paquet ayant subi une translation d’adresse

Ok… Et ça sert à quoi ?

Le principal intérêt est la sécurité. La translation d’adresse permet de dissimuler un hôte réel derrière un équipement qui se fait passer pour lui. En cas de tentative d’attaque, pas moyen de parvenir jusqu’à lui !

Pour être précis, il est techniquement possible de l’atteindre avec son adresse IP réelle, encore faut-il la connaitre. Mais si elle n’est pas routée, aucun chemin ne permet de l’atteindre. :magicien: C’est une des raisons pour lesquelles la plupart des fournisseurs d’accès à Internet, dans leurs routeurs, attribuent des adresses privées sur le réseau local et font du NAT. Les systèmes les plus vulnérables sont ainsi moins exposés sur Internet.

Une autre raison est que cela permet de faire des économies d’adresses publiques. Le stock d’adresses IPv4 disponibles sur Internet est limité, il n’y en a même pas une pour deux habitants sur Terre (environ 3,65 milliards d’adresses publiques pour 7,5 milliards d’humains en 2019). Alors avec la quantité d’objets connectés, si on veut continuer à utiliser IPv4, on rationalise encore davantage en faisant de la translation de port.

PAT : lost in translation

Quand on utilise un routeur fourni par notre opérateur télécom pour accéder à Internet, on peut y connecter de nombreux équipements en simultané, mais on ne dispose que d’une seule adresse IP publique (et donc externe). Pas moyen de se dire que l’adresse interne X va correspondre à l’adresse externe Y, puisque tout le monde a besoin de l’utiliser en même temps !

Alors, comment fait-on ? On va se baser à la fois sur les adresses de destination et sur les numéros de ports utilisés. Prenons un cas simple : deux équipements différents, un smartphone et un PC, se connectent sur deux sites web différents en même temps, disons Zeste de Savoir (92.243.7.44) et Wikipédia (91.198.174.192). Facile à NATer : le routeur peut retenir que la connexion vers Zeste de Savoir est associée au smartphone, et celle vers Wikipédia, au PC.

Translations d'adresses avec plusieurs hôtes
Translations d’adresses avec plusieurs hôtes
Source réelle Source après NAT Destination (adresse : port)
192.168.1.10 30.0.0.1 92.243.7.44 : 443
192.168.1.20 30.0.0.1 91.198.174.192 : 443

Maintenant, que se passe-t-il si les deux appareils se connectent en même temps sur Wikipédia ? Là, le routeur va devoir en plus mémoriser les numéros de port source pour renvoyer les réponses aux bons hôtes. C’est ce qu’on appelle de la translation de port, abrégé PAT pour Port Address Translation.

Translation de ports
Translation de ports
Source réelle Source après NAT Destination (adresse : port)
192.168.1.10 : 50000 30.0.0.1 : 50000 91.198.174.192 : 443
192.168.1.20 : 60000 30.0.0.1 : 60000 91.198.174.192 : 443

On trouve beaucoup de noms différents pour parler de PAT : NAPT (Network Address and Port Translation), NAT overload dans les routeurs Cisco, IP masquerade sous Linux avec iptables, … voire tout simplement NAT, par abus de langage.

Le cas le plus complexe est quand plusieurs équipements du LAN se connectent en même temps au même serveur, au même service, et avec le même port source. Statistiquement, c’est très improbable, mais pas impossible ! Dans ce cas, le routeur modifie un des ports sources pour éviter d’avoir deux flux identiques qu’on ne pourrait plus différencier.

Source réelle Source après NAT Destination (adresse : port)
192.168.1.10 : 50000 30.0.0.1 : 50000 91.198.174.192 : 443
192.168.1.20 : 50000 30.0.0.1 : 56789 91.198.174.192 : 443

Pour NATer des flux ICMP, comme c’est un protocole de couche réseau, on ne peut bien évidemment pas utiliser de numéro de port. On prend à la place l’identifiant du paquet ICMP.

Le port forwarding

Le NAT permet donc de protéger un réseau, mais le revers de la médaille, c’est qu’on ne peut pas du tout envoyer de données depuis l’extérieur vers ce réseau ! On peut alors avoir recours au port forwarding.

Le port forwarding, c’est l’inverse du PAT. Quand un flux arrive à destination d’une adresse externe sur un port donné, le routeur vérifie dans une table de correspondance si ce port est ouvert. Si oui, il transmet le paquet à un hôte défini sur un port défini par sa configuration. Le schéma suivant représente un serveur DNS écoutant sur le port 1234, derrière un routeur qui fait du port forwarding. Il est interrogé par un hôte quelconque sur Internet. Le routeur est paramétré pour que les flux UDP à destination du port 53 soient redirigés vers ce serveur sur le port 1234.

Ce numéro de port est pris au hasard. C’est pour illustrer le fait qu’on peut utiliser le port qu’on veut sur le routeur, indépendamment du port réellement utilisé par le serveur. On aurait aussi très bien pu garder le port 53.

Port forwarding avec un serveur DNS
Port forwarding avec un serveur DNS

Cette technique est pratique quand on veut rendre accessible un serveur chez soi mais qu’on est derrière un routeur qui fait du NAT.


La translation d’adresse est donc une technique utile pour la sécurité de réseaux locaux et l’économie d’adresses. Elle est principalement utilisée avec IPv4 mais rien n’empêche de faire du NAT avec IPv6. Elle ne doit pas non plus être considérée comme la panacée pour se protéger : l’utilisation d’un pare-feu bien configuré est plus efficace et moins contraignante.