Le problème du NAT traversal se rencontre lorsque 2 personnes qui sont toutes les deux derrière un NAT veulent communiquer entre elles.
Principe du NAT en quelques mots
A --- RA ---------------------- C
A est derrière son routeur RA
C ne peut pas parler directement à A car il est "invisible" : il ’na pas d’IP publique. Si A veut communiquer avec l’extérieur, l’action doit venir de lui. Si il atteint une IP extérieure, alors une association va être créée dans le routeur RA pour rediriger le trafic en réponse vers A. A peut donc être en contact avec l’extérieur seulement si il prend l’initiative de le faire (nous sommes dans le cas d’un routeur qui n’a pas été configuré auparavant).
Fonctionnement des routeurs
A --- RA ---------------------- C
Les routeurs font du NAT en ne récrivant que le port et l’adresse IP source du paquet.
Exemple :
A envoie un paquet (IP src A, port src 100) (IP dest C, port dest 450).
RA récrit le paquet et envoi un paquet (IP src RA, port src 234) (IP dest C, port dest 450).
Les routeurs basiques :
Les routeurs les plus courants vont garder dans leur table de NAT l’association entre (IP source , port source / port public) = (IP A , port 100 / port 254) : Tout paquet arrivant sur le routeur sur le port 254 va être naté vers le port 100, IP A et inversement.
C’est une technique simple de NAT mais celle ci entraîne dans certains cas des problèmes du fait que l’association ne prend pas en compte IP de destination : n’importe quelle machine du vaste internet peut alors flooder le port public sur l’ip publique du routeur. Le routeur redirigera alors tout le trafic vers la machine et vers l’application.
Les routeurs évolués :
Les routeurs professionnels font un NAT plus précis en utilisant une association entre (IP source / port source) et (IP dest / port dest).
NAT et UDP
Pour ouvrir une "session UDP" (attention théoriquement cela n’existe pas), il suffit d’un seul paquet. Dans notre exemple :
A --- RA ---------------------- C
IP A : 192.168.0.2
IP RA privée : 192.168.0.1
IP RA publique : 217.32.2.4
IP C : 76.1.1.2
si A envoie un paquet UDP à C, alors une session, c’est à dire une association entre A et C est créée dans le routeur sur les ports choisis, exemple :
A envoie un paquet (souce : 192.168.0.2:100 , destination : 76.1.1.2:5040)
RA récrit le paquet (source : 217.32.2.4:7833 , destination : 76.1.1.2:5040) , la session UDP est établie.
C répond un paquet (source : 76.1.1.2:5040 , destination : 217.32.2.4:7833)
RA transmet le paquet (source : 76.1.1.2:5040 , destination : 192.168.0.2:100) , la session UDP est utilisée.
NAT traversal et UDP
Pour du NAT traversal, on est dans une situation où les 2 correspondants sont "invisibles", c’est à dire que les 2 n’ont pas d’IP publiques :
A --- RA ---------------------- RB --- B
IP A : 192.168.0.2
IP RA privée : 192.168.0.1
IP RA publique : 217.32.2.4
IP B : 10.10.0.4
IP RB privée : 10.10.0.1
IP RB publique : 98.33.9.12
Dans ce cas, A n’a aucun moyen de contacter B et inversement. On va donc mettre à profit l’existence d’un tiers C (76.1.1.2) accessible des deux entités pour établir la communication :
A établit la communication avec C :
A envoie un paquet (souce : 192.168.0.2:100 , destination : 76.1.1.2:5040)
RA récrit le paquet (source : 217.32.2.4:7833 , destination : 76.1.1.2:5040)
La session UDP est établie sur RA : port 100 (privé) / port 7833 (public).
B établit la communication avec C :
B envoie un paquet (source : 10.10.0.4:200 , destination : 76.1.1.2:5050)
RB récrit le paquet (source : 98.33.9.12:4512 , destination : 76.1.1.2:5050)
La session UDP est établie sur RA : port 200 (privé) / port 4512 (public).
A ce moment là, A et B sont accessibles avec l’IP de leur routeur sur les port 100 et 200.
A peut envoyer un paquet vers RB / port 4512 et B peut répondre sur l’IP de RA / port 7833, la communication est établie.
Ceci est shématique. En pratique, on utilise un serveur STUN pour que les applications (A et B) déterminent leurs adresses/ports sur lesquels ils sont visibles. Les applications vont alors les utiliser et les transmettre à un tiers qui va les mettre en relation.
NAT et TCP
Le NAT en TCP ne peut pas se faire aussi facilement car pour qu’il y ait une session TCP établie, alors il faut que la connexion TCP soit établie. Le routeur de va pas créer la correspondance comme il l’a fait pour UDP tant que la connexion TCP n’est pas accusée :
A --- RA ---------------------- B
A va envoyer un paquet TCP SYN vers B. B répond mais la réponse TCP SYN ACK ne va pas passer le routeur RA.
Il faut donc configurer manuellement des redirections de ports TCP pour traverser les routeurs.