Le terme de NAT est un mot que l'on voit régulièrement passer lorsqu'il s'agit de réseau. Qu'est ce que ce sigle (Netword Address Translation) signifie et à quoi ça sert?
Sur Internet, les machines sont identifiées par une adresse IP. Cette adresse est unique, elle correspond à un seul odinateur sur le réseau. Chaque machine peut proposer des services, afin de contacter un service, un protocole et un port sont associés à ce service. Certains protocoles n'ont pas de port. Il y a principalement deux protocoles employés dans l'établissement des connexions entre machine sur Internet, TCP et UDP. Sur une adresse IP donnée, un seul service écoute sur un port. Il existe une liste de ports standard pour les applications classiques, ce sont les well known ports. Ils sont attribués par l'IANA, une liste peut être trouvée dans le fichier /etc/services sur les systemes d'exploitation UNIX. On peut citer le port 80 en tcp pour le http (le web), le port 25 en tcp pour le mail ou encore le port 53 en udp et tcp pour le DNS.
Dans le monde de l'Internet lorsque l'on cherche à atteindre un service, la machine cliente (qui fait la demande) ouvre une connexion depuis son ip notée IPc vers le port associé au service noté Ps de l'IP du serveur notée IPs. Pour ce faire, elle détermine un port non utilisé sur elle-même noté Pc, et établit une connexion entre (IPc,Pc) et (IPs,Ps). Le serveur répondra en envoyant sur (IPc,Pc). Comme un dessin vaut mieux qu'un long discours:
Le fonctionnement décrit précédemment est celui d'un Internet où l'on a assez d'adresses IP pour toute machine accédant à Internet. Malheureusement lors de la mise au point d'Internet on n'a pas pensé que ça cartonnerait autant. Une adresse IPv4 est codée sur 32 bits, c'est à dire que pour l'ordinateur, c'est une suite de 32 0 ou 1, il n'y a donc que 232 (=4 294 967 296) adresses disponibles en théorie. 4 milliards et des brouettes c'est beaucoup, presque assez si on pense à la population mondiale, mais dans la pratique un service un peu conséquent a souvent besoin de plus d'un serveur. Par exemple, la plupart des sites Internet ont au moins deux serveurs pour parer à l'éventualité d'une panne. Des plateformes conséquentes en ont plusieurs dizaines ou dizaines de milliers. Ainsi facebook représente environ 30 000 serveurs. De plus, pour pouvoir router (acheminer les paquets avec les informations), on a subdivisé cet ensemble d'adresses en sous-réseaux attribués à différentes entités. Cette subdivision entraîne des pertes d'adresses IP, ne serait-ce que pour les machines qui assurent l'interconnexion de réseaux qui ont besoin d'avoir une ip sur chaque réseau auxquel elles sont connectées. Enfin, une attribution assez large aux pionniers de l'Internet a été faite, notamment pour le ministère de la défense américain ou de grandes compagnies nord américaines ou européennes. Ainsi il n'y a plus assez d'adresses IP pour tout le monde. Une évolution du protocole a été définie, appelée IPv6 mais elle n'est pas encore largement déployée et c'est bien dommage.
Une solution pour palier ce manque a été de regrouper plusieurs machines derrière une adresse IP. C'est ce que nous connaissons tous avec les box des fournisseurs d'accès à Internet. L'idée est d'avoir une machine appelée routeur qui possède deux interfaces réseau, une sur Internet avec une adresse IP unique et l'autre sur un réseau local avec une IP dite privée. Une partie des adresses IPv4 est réservée à des adresses qui ne doivent pas circuler sur Internet, ce sont les adresses IP dites privées. Les autres machines du réseau prennent également des adresses IP distinctes sur ce réseau privé et sont configurées pour envoyer les paquets à destination d'Internet vers le routeur. Le routeur va récupérer les requêtes des machines internes et les envoyer vers les serveurs sur Internet en traduisant (Translation) l'adresse source privée vers son adresse source sur l'interface internet. On va appeler ce mécanisme du SNAT (Source NAT).
De même on peut publier un service hébergé sur une machine à l'intérieur du réseau en demandant à la machine aux deux interfaces de transférer les requêtes pour un port donné vers une machine interne. On a affaire à du DNAT (Destination NAT)
Nous avons vu dans les premiers préliminaires qu'une connexion s'effectuait entre (IPc,Pc) et (IPs,Ps). dans notre cas le soucis est que IPc n'est pas une IP visible depuis le serveur. Lors de l'ouverture de la connexion, le routeur va créer une connexion (IPr,Pr) vers (IPs,Ps) et garder l'association (IPc,Pc)↔(IPr,Pr)↔(IPs,Ps) dans une table. Ainsi il peut faire passer les paquets suivants en utilisant la connexion établie (IPr,Pr)→(IPs,Ps) et envoyer les paquets reçus sur (IPr,Pr) vers (IPc,Pc). Un principe équivalent est appliquée pour le DNAT.
Notons que le serveur ne voit qu'une connexion venant de (IPr,Pr).