(Pour ce qui suit, j'ignorerai toute recherche DNS ou action de couche deux, car ce n'est pas la partie pertinente pour l'histoire NAT.)
Toute connexion TCP est un tuple de quatre parties:
<source IP> <source port> <destination IP> <destination port>
En bref: l'IP de destination est utilisée pour acheminer le paquet vers la bonne machine, le port de destination est utilisé pour amener le paquet sur cette machine vers le bon programme / session L'IP source est utilisée pour savoir où envoyer les réponses. Il en va de même pour le port source. Lorsqu'une réponse est envoyée, la source et la destination sont simplement échangées.
Commençons par deux ordinateurs sans NAT:
- L'ordinateur est IP
1.1.1.1
- Le serveur Web a une adresse IP
3.3.3.3
- Le port standard pour HTTP est
80
Lorsqu'un ordinateur demande une page Web, il sélectionne d'abord un numéro de port inutilisé aléatoire dans la plage aléatoire (1024-65535). Choisissons 2345
. Ensuite, la séquence suivante se produira: l'ordinateur envoie son paquet avec: IP 1.1.1.1
source, port source 2345
, IP de 3.3.3.3
destination, port de destination 80
. Les paquets arrivent sur le serveur Web, il voit sa propre adresse IP et son propre port 80
, il sait donc qu'il s'agit d'une demande de page Web. Le serveur Web renvoie ensuite la page Web en paquets avec IP 3.3.3.3
source, port source 80, IP de 1.1.1.1
destination, port de destination 2345
. L'ordinateur reçoit ces paquets et sait de quelle page Web il s'agit, en raison du numéro de port 2345
.
Ces combinaisons de ports sont souvent écrites comme telles: 1.1.1.1:2345
et 3.3.3.3:80
.
Maintenant, le nombre d'ordinateurs sur Internet dépasse de loin le nombre d'adresses IPv4 disponibles. Pour préserver l'espace d'adressage, un ensemble de plages d'adresses privées a été introduit, qui peut être librement utilisé pour le partage d'adresses. Ces rangese sont appelés RFC1918 et sont les suivants:
- 192.168.0.0 - 192.168.255.255
- 172.16.0.0 - 172.31.255.255
- 10.0.0.0 - 10.255.255.255
Ces adresses ne figurent nulle part dans les tables de routage Internet, donc si vous envoyez un paquet avec une destination dans ces plages sur le réseau principal d'Internet, elles seront simplement supprimées. En effet, des millions de personnes utilisent les mêmes adresses. Ces adresses doivent être traduites en quelque chose d'utile pour Internet. C'est là qu'intervient la traduction d'adresses réseau:
Nous avons deux ordinateurs:
- A:
192.168.0.1
et B:192.168.0.2
- Leur passerelle a une adresse IP publique de
1.1.1.1
.
- Nous gardons le même serveur Web.
- Les deux ordinateurs veulent la même page Web à partir du même serveur.
D'abord, les deux ordinateurs sélectionnent un port aléatoire: disons: 192.168.0.1:2345
et 192.168.0.2:5432
.
L'ordinateur A envoie son paquet avec la source 192.168.0.1:2345
et la destination 3.3.3.3:80
. La passerelle traduit ce paquet en 1.1.1.1:2345
destination source 3.3.3.3:80
et se souvient que toutes les réponses à cette combinaison sont envoyées 192.168.0.1
. Ainsi, quand il reçoit une réponse avec source 3.3.3.3:80
et destination 1.1.1.1:2345
, il la traduit en source 3.3.3.3:80
et destination 192.168.0.1:2345
et envoie le paquet.
L'ordinateur B envoie son paquet avec la source 192.168.0.2:5432
et la destination 3.3.3.3:80
. La passerelle traduit ce paquet en 1.1.1.1:5432
destination source 3.3.3.3:80
et se souvient que toutes les réponses à cette combinaison sont envoyées 192.168.0.2
. Ainsi, quand il reçoit une réponse avec source 3.3.3.3:80
et destination 1.1.1.1:5432
, il la traduit en source 3.3.3.3:80
et destination 192.168.0.2:5432
et envoie le paquet.
Si les deux ordinateurs sélectionnent le même numéro de port source, la passerelle choisira simplement un autre numéro de port source gratuit et n'oubliez pas de traduire également le numéro de port. Ceci est parfois appelé PAT (Port Address Translation). Il s'agit essentiellement d'un sous-ensemble de NAT.
Il y a plusieurs implémentations à tout cela. La passerelle peut simplement se souvenir uniquement de "l'ordinateur X a utilisé le port source Y" et transmettre tout ce qui a le port Y à l'ordinateur X. Elle peut se rappeler que l'ordinateur X a utilisé le port source Y et la destination Z "et ne renvoyer que du port Z au port Y vers ordinateur X. Ou il y a l'option qu'il se souvient de l'intégralité du tuple et envoie uniquement du trafic vers l'ordinateur X qui correspond à l'IP et au port source / destination.