UDP hole punching
L' UDP hole punching est une technique communément utilisée dans les systèmes utilisant un système de translation d'adresses (NAT) afin de faire communiquer, par UDP (User Datagram Protocol), deux machines se trouvant sur des réseaux privés différents.
Cette technique est communément utilisée dans les logiciels peer-to-peer et la téléphonie sur IP (Voice over Internet Protocol)[1].
Elle peut également être utilisée pour permettre l'établissement d'un virtual private network sur UDP.
L'UDP hole punching établit la connectivité entre deux hôtes communiquant à travers un ou plusieurs traducteurs d'adresses. Généralement, un hôte tiers présent sur le réseau public est utilisé pour établir les numéros de ports réseau qui seront utilisés pour une communication directe entre les hôtes privés.
Une fois que la communication a été établie, l'état des serveurs NAT est maintenu par un trafic de communication normal, ou en absence d'un tel trafic, par des paquets keep-alive (consistant généralement en paquets UDP vides ou en paquets ayant un contenu minimal).
Fonctionnement
L'UDP hole punching est une méthode pour établir une communication UDP bidirectionnelle, à travers Internet, entre deux hôtes situés dans des réseaux privés. Cette technique n'est pas applicable dans tous les scénarios ou avec tous les types de NAT.
Rappel sur le NAT
Plusieurs types de NAT existent. Dans l'explication suivante nous prendrons comme cas le NAT dynamique masquerading.
Le NAT permet aux machines d'un réseau privé d'établir des connexions sortantes vers Internet avec une seule adresse IP publique, l'adresse de la machine NAT. Pour se faire le NAT va maintenir un suivi des connexions démarrées par les machines du réseau privé et au tuple d'adresses IP et de port réseau, source puis destination, (IP1, P1, IPdst, Pdst) va faire correspondre le tuple (EIP, EPX, IPdst, Pdst).
Lorsque la machine contactée va répondre elle répondra avec le tuple (IPdst, Pdst, EIP, PX).
Pour faire communiquer deux machines, M1 et Malpha, de réseaux privés différents il suffit donc :
- que M1 connaisse l'adresse publique de Malpha et le port Y utilisé par le NATB
- et que Malpha connaisse l'adresse publique de M1 et le port X utilisé par NATA.
Au passage du premier paquet UDP de M1 vers Malpha le NATA enregistrera dans ses connexions ouvertes le fait qu'il attend un retour.
Au passage du premier paquet UDP de Malpha vers M1 Ă travers le NATB, ce dernier enregistrera cette connexion comme en cours d'ouverture et attendra un retour.
A ce point là les NAT/Firewall auront été poinçonnés (traduction littérale de Hole Punching) et permettront donc le dialogue entre M1 et Malpha
Il est à noter que même si le terme de Hole Punching peut faire penser à un trou dans le Firewall cette technique ne remet pas en cause la sécurité du NAT/Firewall.
Les machines M1 et Malpha doivent donc trouver un moyen de s'Ă©changer ces informations.
Echanges d'information
Les hôtes se trouvant sur réseau privé et accédant à Internet par un NAT utilisent généralement la méthode STUN (Session Traversal Utilities for NAT) ou ICE (Interactive Connectivity Establishment (en)) pour déterminer l'adresse publique du serveur NAT de l'autre bout de la communication.
Dans le processus d'UDP Hole punching on utilise un serveur de rendez-vous S, sur le réseau public, pour échanger les informations nécessaires à la communication directe entre les deux pairs.
Les deux hĂ´tes commencent Ă Ă©mettre, et utilisent plusieurs tentatives.
Sur un Restricted cone NAT (en), le premier paquet de l'hôte distant sera bloqué.
Le NAT enregistre ensuite le fait qu'il y ait eu l'envoi d'un premier paquet vers l'hôte distant et permettra la réception de tout paquet ayant l'adresse IP et le port de l'hôte distant.
Maintien de connexion
Sur un serveur NAT, l'état d'une communication UDP expire après une certaine période, quelques dizaines de secondes généralement[2], le UDP hole punching ré-envoie donc périodiquement des paquets keep-alive pour s'assurer de la mise à jour des compteurs de la machine d'état du NAT et ainsi l'empêcher de clore la communication.
Limitations
L'UDP hole punching ne marche pas avec machines faisant du symmetric NAT (en) (aussi appelé NAT bi-directionnel) qui se retrouve fréquemment dans les réseaux de grosses entreprises.
Le Firewall du serveur NAT doit rejeter l'ouverture de connexion depuis l'extérieur sinon ce premier flux prendra le port prévu et les flux sortant du NAT en provenance de la Machine privée seront contraint de prendre un port différent, cassant le mécanisme de Hole Punching.
Etapes de la mise en place du Hole Punching
Soient M1 et Malpha, deux hôtes, chacun sur son propre réseau privé;
Soient NATA et NATB les deux routeurs NAT avec des adresses publiques respectives EIPA et EIPB;
Soit S est un serveur public avec une adresse IP publique connue.
- 1. M1 et Malpha commencent chacun un échange UDP avec S; les serveurs NATA et NATB créent leurs états de translation UDP et assignent un numéro de port externe temporaire, EPA et EPB.
- 2. S examine les paquets UDP pour connaitre les ports source utilisés par NATA et NATB (les ports NAT externes EPA et EPB).
- 3. S communique EIPA:EPA Ă Malpha et EIPB:EPB Ă M1.
- 4. M1 envoie un paquet Ă EIPB:EPB.
- 5. NATA examine le paquet de M1 et créé le couple de tuple suivant dans sa table de translation: (IP1, P1, EIPB, EPB)=>(EIPA, EPA, EIPB, EPB).
- 6. Malpha envoie un paquet Ă EIPA:EPA.
- 7. NATB examine le paquet de Malpha et créé le couple de tuples suivant dans sa table de translation: (IPalpha, Palpha, EIPA, EPA)=>(EIPB, EPB, EIPA, EPA).
- 8. Selon l'état de la table de translation de NATA lorsque le premier paquet de Malpha arrive, ce paquet est éliminé (s'il n'y a pas d'entrée dans la table de translation) ou accepté (si une entrée existe).
- 9. Selon l'état de la table de translation de NATB lorsque le premier paquet de M1 arrive, ce paquet est éliminé (s'il n'y a pas d'entrée dans la table de translation) ou accepté (si une entrée existe).
- 10. Ainsi, des trous ont été créés dans les NAT, les deux hôtes peuvent communiquer directement. Dans le pire des cas, le second paquet de M1 atteint Malpha et le second paquet de Malpha atteint M1.
Si les deux hôtes ont un Restricted cone NAT (en) ou un Symmetric NAT (en), les ports externes du NAT vont différer de ceux utilisés pour S. Sur certains routeurs, les ports externes sont choisis séquentiellement, rendant ainsi possible l'établissement d'une conversation en devinant les ports choisis.
Voir Ă©galement
Références
- (en) Cet article est partiellement ou en totalité issu de l’article de Wikipédia en anglais intitulé « UDP_hole_punching » (voir la liste des auteurs).
- « UDP Hole Punching, State of Peer-to-Peer (P2P) Communication across Network Address Translators (NATs) », ietf.org, (consulté le )
- « Simple Security in IPv6 Gateway CPE », ietf.org, (consulté le )
Liens externes
- Peer-to-Peer Communication Across Network Address Translators, PDF – contient une explication détaillée du processus de Hole Punching
- Netfilter Connection Tracking and NAT Implementation – contient des informations sur l'implémentation du NAT et du suivi de connexion du noyau Linux
- STUNT – Simple Traversal of UDP Through NATs and TCP too
- Network Address Translation and Peer-to-Peer Applications (NATP2P)