Difference between revisions of "MOOC:Compagnon Act43-s7"

From Livre IPv6

(Mécanisme de transition NAT64/DNS64)
(Traduction des adresses)
Line 137: Line 137:
  
 
=== Traduction des adresses ===
 
=== Traduction des adresses ===
{{TODO|Paragraphe à revoir}}
+
{{TODO|Paragraphe à revoir [[MOOC:Act44_Traduction_des_adresses]]}}
 
La traduction d'adresse d'un protocole à un autre suit le même principe que celui appliqué dans les passerelles NAT traduisant des adresses IPv4 privées vers des adresses IPv4 publiques (appelé aussi NAT44). Le traducteur reçoit un paquet avec des adresses source et destination chacune dans un des espaces d'adressage, et doit traduire ces adresses dans l'autre espace d'adressage pour pouvoir ré-émettre le paquet.
 
La traduction d'adresse d'un protocole à un autre suit le même principe que celui appliqué dans les passerelles NAT traduisant des adresses IPv4 privées vers des adresses IPv4 publiques (appelé aussi NAT44). Le traducteur reçoit un paquet avec des adresses source et destination chacune dans un des espaces d'adressage, et doit traduire ces adresses dans l'autre espace d'adressage pour pouvoir ré-émettre le paquet.
  

Revision as of 00:01, 24 June 2015

Mécanime de traduction des en-têtes IP

Contexte d'utilisation de la traduction des en-têtes IP

Le besoin de traduction d'un protocole vers un autre apparait si l'on souhaite faire communiquer 2 machines ne parlant chacune qu'un seul de ces 2 protocoles, le traducteur jouant alors un rôle d'intermédiaire (ou relais) dans la communication.

Afin de respecter les modèles d'architectures en couches (OSI, TCP/IP), la traduction n'intervient qu'entre protocoles d'un même niveau. On pourra donc distinguer la traduction niveau applicatif, niveau transport et niveau réseau. Dans le cas du protocole IP (niveau réseau), il s'agit bien sûr de faire communiquer 2 machines, chacune n'utilisant qu'une version du protocole, IPv4 ou IPv6. Dans le cadre de communication client vers serveur, il y aura donc 2 cas :

  1. le client ne parle qu'IPv6 et le serveur ne parle qu'IPv4,
  2. le client ne parle qu'IPv4 et le serveur ne parle qu'IPv6.

Aujourd'hui, le cas le plus fréquent est le premier, les serveurs gardant majoritairement une connectivité IPv4. Il s'agit donc de mettre en place un dispositif de traduction entre ces 2 protocoles pour permettre à ces machines de communiquer.

Un contexte pour lequel ce type de solution est pertinent est celui des réseaux mobiles 3GPP 3rd Generation Partnership Project) [1]. En effet, dans la norme 3GPP, les sessions PDP (Packet Data Protocol) mises en place pour la connexion de données ne peuvent être double pile que depuis la Release-9. Pour avoir un support double pile sur ces réseaux, il est nécessaire d'ouvrir 2 contextes, ce qui peut être préjudiciable pour le dimensionnement des équipements. Une solution est alors de ne déployer qu'une version du protocole sur le réseau mobile. Les équipements mobiles seront donc connectés à un réseau IPv6 et la compatibilité avec les services IPv4 sera assurée par la traduction d'en-tête IP.

Un tel dispositif devra naturellement se situer en coupure des communications entre les 2 machines, afin d'en intercepter les paquets pour les traduire, et les ré-émettre sur le réseau vers le destinataire, en utilisant le bon protocole. C'est pour cela que ce dispositif est comparable au traditionnel NAT (Network Address Translator) utilisé entre les réseaux IPv4 privés et public. Mais dans notre cas, ce dispositif n'effectue pas une simple translation d'un espace d'adressage à un autre, mais une véritable traduction de l'en-tête.

Les traducteurs assurant le relais entre un réseau IPv6 (coté client) et l'Internet IPv4 (coté serveur) sont appelés NAT64. Les traducteurs assurant le relais inverse (entre un client IPv4 et un serveur IPv6) sont appelés NAT46. Ce dernier cas d'usage est moins fréquent aujourd'hui mais pourra devenir d'actualité dans le contexte d'une utilisation majoritaire d'IPv6.

Principe de la traduction entre protocoles IP

Transposition des champs de l'en-tête

Il faut ici bien situer le problème : le traducteur qui reçoit un paquet avec un en-tête IPvX doit créer un nouvelle en-tête IPvY à partir des informations à sa disposition (les données de l'en-tête IPvX + données de configuration).

Si l'on observe les en-têtes IPv4 et IPv6 comme dans l'activité 21, on remarque qu'il y a un certain nombre de champs qui ont une sémantique très proche (TTL/Hop limit, DiffServ, Payload Length). Pour ces derniers, la transposition est évidente. Les tableaux ci-dessous résument les informations qu'il faut utiliser pour renseigner les différents champs des en-têtes IPv4 ou IPv6 que doit créer le traducteur (Voir RFC6145 Section 4)

Création d'un en-tête IPv6 à partir d'un en-tête IPv4

Champ de l'en-tête IPv4 Champ dans le nouvel en-tête IPv6 Valeur
Version Version 6
IHL Ignorer
Type Of Service Traffic Class Recopier
Flow label 0
Packet Length Payload Length Packet Length - IHL (en-tête IPv4 + options) + 8 (si extension de fragmentation)
Ident./Flag/Offset Extension Fragmentation Créer une extension de fragmentation à partir des valeurs IPv4
TTL Hop Limit Décrémenter de 1
Protocol Next Header Recopier ou extension de fragmentation si besoin. ICMPv4 (1) devient ICMPv6 (58).
Checksum Ignorer
Source Address Source Address Voir le paragraphe Traduction des adresses
Destination Address Destination Address Voir le paragraphe Traduction des adresses
Options IPv4 Les options IPv4 ne sont pas traduites.

Création d'un en-tête IPv4 à partir d'un en-tête IPv6

Champ de l'en-tête IPv6 Champ dans le nouvel en-tête IPv4 Valeur
Version Version 4
IHL 5
Traffic Class Type of Service Recopie
IPv6 Flowlabel Ignorer
Payload Length Packet Length Payload Length + IHL
Ident./Flag/Offset 0
Hop Limit TTL Décrémenter de 1
Next Header Protocol Recopier. ICMPv6 (58) devient ICMPv4 (1)
Checksum Calculer une fois l'en-tête créé
Source Address Source Address Voir le paragraphe Traduction des adresses
Destination Address Destination Address Voir le paragraphe Traduction des adresses
Extensions IPv6 Les extensions d'en-tête IPv6 ne sont pas traduites.

Traduction des adresses

TODO: Paragraphe à revoir MOOC:Act44_Traduction_des_adresses

La traduction d'adresse d'un protocole à un autre suit le même principe que celui appliqué dans les passerelles NAT traduisant des adresses IPv4 privées vers des adresses IPv4 publiques (appelé aussi NAT44). Le traducteur reçoit un paquet avec des adresses source et destination chacune dans un des espaces d'adressage, et doit traduire ces adresses dans l'autre espace d'adressage pour pouvoir ré-émettre le paquet.

Un NAT44 reçoit du réseau privé des paquets avec une adresse IPv4 source privée. Pour pouvoir émettre ce paquet vers l'Internet IPv4, le mécanisme de NAT remplace cette adresse source par une adresse IPv4 de l'espace d'adressage public, cette adresse étant une de celles routées vers lui.

La traduction de l'en-tête d'un paquet IP d'une version à une autre nécessite la traduction des deux champs d'adresse IP source et destination. Le traducteur doit donc décider d'une correspondance routable entre une adresse de l'espace d'adressage IPv4 vers une adresse de l'espace d'adressage IPv6. Le cadre général de cette traduction d'adresse est précisé par la RFC 6052.

La traduction d'une adresse IPv4 en IPv6 est simple car l'espace d'adressage IPv6 est assez large pour y trouver une adresse IPv6 à faire correspondre avec une adresse IPv4. La technique pour créer une adresse IPv6 à partir d'une adresse IPv4 est d'inclure les 32 bits de cette adresse à la suite d'un préfixe IPv6. Selon la taille du préfixe à utiliser, le mécanisme d'inclusion est différent, comme précisé dans le RFC 6052 section 2.2. Le préfixe utilisé sera un préfixe routé vers le traducteur, afin que celui-ci assure son rôle de relais. L'adresse ainsi créée permet d'identifier un noeud IPv4 dans l'espace d'adressage IPv6. La traduction effectuée par le relais est alors sans état.

La traduction d'une adresse IPv6 en adresse IPv4 est plus complexe car il est impossible de représenter l'espace d'adressage IPv6 dans celui d'IPv4. Le traducteur aura besoin d'une information supplémentaire, obtenue au préalable, afin de pouvoir désigner l'adresse IPv6 pertinente dans le contexte du paquet IPv4 à traduire. Par exemple, dans le cas d'un traducteur entre un réseau local IPv6 et l'Internet IPv4, le traducteur ne sait pas comment traduire l'adresse source du paquet sortant : il doit utiliser une de ses propres adresses. Le paquet retour contient alors cette adresse comme destination. Le traducteur a besoin ici d'une information contextuelle : la correspondance choisie entre les adresses source IPv6 et IPv4 du paquet sortant (plus des informations de niveau transport pour distinguer les flux). La traduction effectuée par le relais est dans ce cas avec état.

Mécanismes complémentaires

Traduction des paquets ICMP

Comme décrit dans l'activité 31, les messages ICMP servent au contrôle de la connectivité de bout en bout, ainsi qu'aux rapports d'erreurs d'acheminement des paquets. La présence d'un traducteur sur ce chemin ne doit pas perturber ce mécanisme, sous peine de grandement complexifier son fonctionnement. Celui-ci doit donc s'efforcer de traduire les messages ICMPv4 en messages ICMPv6, et inversement, pour être ainsi transparent dans ces échanges.

Le traducteur recevant un message ICMPv4 (resp. ICMPv6) doit donc interpréter le contenu de ce message pour créer un message ICMPv6 (resp. ICMPv4) à retransmettre. L'en-tête IP est traduit selon les mécanismes présentés plus haut. L'en-tête ICMPv4 (resp. ICMPv6) doit donc être transformé par le traducteur en en-tête ICMPv6 (resp. ICMPv4). Cette traduction est facilitée par le fait que les sémantiques des messages de ces 2 protocoles ne sont pas très éloignées : les fonctions supplémentaires de découverte de voisins intégrées dans ICMPv6 ne sont valides que sur le lien et ne seront pas traduites. De plus, les paquets ICMP n'ont pas besoin d'informations contextuelles pour être interprétés. La traduction des messages ICMP est dite sans état. La RFC 6145 définit le mécanisme pour effectuer cette traduction.

Le champ ICMP type devra être ajusté dans certains cas lors de la traduction car les valeurs pour la même sémantique de messages peuvent être différentes entre les versions du protocole. Par exemple, les messages Echo Request et Reply sont identifiés par la valeur du champ ICMP type 8 et 0 en ICMPv4, 128 et 129 en ICMPv6. Certains messages ICMPv4 ne seront pas traduits car leur sémantique (obsolète) n'a pas été transposée dans ICMPv6.

La traduction de l'en-tête ICMP modifie les en-têtes des niveaux réseau et transport. Elle impacte donc la somme de contrôle calculée pour ces en-têtes. Le champ checksum doit donc être recalculé suite à la traduction.

Relais-Traducteur DNS auxiliaire

Afin d'assurer la transparence aux protocoles applicatifs et aux utilisateurs, les mécanismes de traduction doivent s'appuyer sur les services d'un relais DNS auxiliaire ("DNS-ALG", DNS Application Layer Gateway). Celui-ci permet de convertir les résolutions d'adresses IPv4 en adresses IPv6, ou inversement, avec un préfixe particulier qui sera routé vers le relais transport ou réseau.

Du point de vue du client, il se comporte comme n'importe quel serveur DNS de rattachement. Il accepte les requêtes et les transfère au serveur DNS de rattachement, s'il ne dispose pas déjà de l'information dans son cache local. Mais ce DNS est dit menteur car il est capable de répondre positivement à la demande d'une ressource inexistante.

Par exemple, lorsqu'un client IPv6 formule une requête AAAA, le relais DNS la transfère au serveur DNS. Si la réponse est une réponse de type A uniquement, le relai DNS applique alors la traduction de l'adresse IPv4 obtenue en adresse IPv6, comme spécifié dans la RFC 6052. Il combine un préfixe IPv6 aux 32 bits de chacune des adresses obtenues comme résultats. L'adresse IPv6 obtenue sera transmise au client en réponse à sa requête AAAA. Un DNS permettant la résolution en IPv6 de nom de domaine enregistré uniquement en IPv4 est appelé DNS64.

Les versions récentes du logiciel serveur DNS BIND/Named peuvent assurer le rôle de DNS64. Le logiciel Trick or Treat Deamon (TOTD) peut également être utilisé pour cet usage.

Pour aller plus loin : Limitations de la traduction

TODO: Section à écrire

(MTU/Fragmentation, Sécurité, Compatibilité des applications)


Mécanisme de transition NAT64/DNS64

NAT64 {RFC 6146] et DNS64 [RFC 6147] constituent ensemble une technique de traduction de niveau réseau.

TODO: Section à écrire: principes, adressage

44-fig2.png
Figure: Principe du NAT64/DNS64

Exemple d'un déploiement de NAT64 sur le réseau mobile

TODO: Expliquer GGSN et ME

Comme décrit en début de chapitre, le déploiement d'un réseau seulement IPv6 peut s'avérer intéressant dans le cadre d'un réseau mobile type UMTS (3G). L'interopérabilité avec les services IPv4 peut alors être réalisée en traduisant les paquets IPv6 en paquets IPv4 à travers un dispositif NAT64, couplé à un relais-traducteur DNS64. L'intérêt d'un tel dispositif est qu'il est relativement simple à configurer côté équipement client : il suffit que celui-ci utilise l'adresse du DNS64 en tant que serveur de résolution de nom.

44-fig3.png
Figure 3: Accès à un serveur en IPv6

Dans la figure 3, le client cherche ici à joindre le service hébergé sur le serveur IPv6 example.org.

  1. Pour en connaître l'adresse IP, il interroge donc le serveur de résolution de nom, en l'occurrence le dispositif DNS64. L'interrogation du client concerne les enregistrements IPv6 (AAAA) car ceux-ci sont les seuls qui seront utilisables depuis le client connecté sur un réseau IPv6 seul (étape 1).
  2. Ce nom de domaine possède une résolution en IPv6 (il possède un enregistrement AAAA). Le dispositif DNS64 se comporte alors comme un résolveur de nom normal et transfère cet enregistrement au client en guise de réponse (étape2).
  3. Le client peut alors se connecter directement au service à partir de l'adresse IPv6 obtenue (étape 3).

44-fig4.png
Figure 4: Accès à un serveur en IPv4

Dans la figure 4, le client cherche maintenant à joindre un autre service, comme old.org. Or ce service ne possède pas de connectivité IPv4.

  1. Comme précédemment, le client va interroger son résolveur de nom, le DNS64, sur la présence d'un enregistrement AAAA pour le service (étape1).
  2. Le DNS64 interroge le service DNS (étape 2) sur les différentes adresses disponibles
  3. Le DNS64 n'obtient que des adresses de type IPv4 (enregistrement A) (étape 3).
  4. Ces enregistrements ne correspondent pas aux adresses attendues par le client. Le DNS64 va alors transformer les adresses IPv4 obtenues du service en adresses IPv6 afin de satisfaire la demande du client. Cette traduction d'adresse se fait conformément au RFC 6052 : dans notre exemple, le DNS64 complète le préfixe 64:ff9b::/96 avec l'adresse IPv4 obtenue (étape 4).
  5. Le client utilise donc cette adresse IPv6 comme destinataire de la communication. Ici, le navigateur du client ouvre une connexion TCP à destination d'une adresse appartenant au préfixe 64:ff9b::/96. Ce préfixe est routé dans l'infrastructure du réseau mobile vers le dispositif NAT64. Celui-ci reçoit donc les paquets en provenance du client et à destination de l'adresse transformée par le DNS64 (étape 5).
  6. Le NAT64 doit maintenant traduire ces paquets d'IPv6 vers IPv4. Il créé donc un en-tête IPv4 à partir des champs de l'en-tête IPv6, comme spécifié dans le RFC 6144. Pour l'adresse destination du paquet IPv4, le traducteur applique la transformation inverse de celle appliquée par le DNS64 : il extrait l'adresse IPv4 en soustrayant de l'adresse destination du paquet IPv6 le préfixe utilisé pour la traduction d'adresse dans l'infrastructure mobile, en l'occurrence 64:ff9b::/96. Ne pouvant représenter l'adresse IPv6 du client dans une adresse IPv4, le traducteur choisit une des adresses IPv4 à sa disposition comme adresse source (cette adresse devra être routée vers ce dispositif afin que le traducteur capte aussi les paquets retour à destination du client). Il conserve une trace en mémoire de la correspondance entre l'adresse du client et l'adresse IPv4 choisie, ainsi que des ports TCP source et destination utilisés comme informations contextuelles de la connexion afin de pouvoir effectuer la traduction inverse. Après avoir fait ces traitements, le NAT64 transmet des paquets IPv4 vers le service old.org fonctionnant avec le protocole du siècle dernier (étape 6).

Conclusion

La traduction des paquets d'une version du protocole IP vers une autre version rend possible des communications entre deux réseaux utilisant chacun des versions différentes, et ce de façon quasi transparente pour les extrémités. La traduction d'adresses permet d'identifier une machine IPv4 dans l'espace d'adressage IPv6. La traduction inverse nécessite, quant à elle, des informations contextuelles propres à la communication.

Cette solution a donc les avantages et les inconvénients du NAT44 : si la configuration des clients est simple, ce mécanisme connait certaines limites comme la faible capacité à passer à l'échelle des traducteurs ainsi que l'impact sur les protocoles applicatifs (si ceux-ci transportent aussi des adresses IP).

Il faut de plus noter, dans le cas d'un client IPv6 seul, que le système, les applications et les protocoles utilisés par ce client devront être compatibles avec IPv6. Dans certains cas, ces conditions ne sont pas remplies et le client ne pourra pas alors profiter de l'interopérabilité rendue possible par le NAT64.

Malgré ces inconvénients, ce mécanisme se développe de plus en plus car il devient intéressant aujourd'hui de pouvoir déployer des réseaux seulement IPv6 à la place de réseaux IPv4 privés (notamment quand l'espace d'adressage privé n'est plus suffisant pour adresser l'ensemble des clients). Certains opérateurs mobiles ont notamment fait ce choix pour leur réseau.

Personal tools