<?xml version="1.0" encoding="utf-8"?>
<rfcdesc title="IP/ICMP Translation Algorithm" status="standards" wg="behave" num="6145">
<rfcdate><month>April</month><year>2011</year></rfcdate>
<authors><author>X. Li</author><author>C. Bao (CERNET Center/Tsinghua University)</author><author>F. Baker (Cisco Systems)</author></authors>
<date>2011-04-28</date>
<content>
<p>Parmi les nombreuses techniques de coexistence
d'<wikipedia>IPv4</wikipedia> et <wikipedia>IPv6</wikipedia>, le <link
url="http://tools.ietf.org/wg/behave/">groupe de travail
Behave</link>, dans sa version 2 (la 1 avait été consacrée aux
<link local="behave-wg">techniques permettant de supporter le
NAT</link>) développe un mécanisme de <wikipedia name="Network address translation">traduction</wikipedia> permettant à une machine IPv6 de communiquer
avec une machine v4 et réciproquement. Une des pièces de ce mécanisme
est l'algorithme de traduction, présenté dans ce <rfc num="6145"/>.</p>
<p>Ce nouveau mécanisme de traduction entre
<wikipedia>IPv4</wikipedia> et <wikipedia>IPv6</wikipedia> s'inscrit
dans le cadre décrit dans le <rfc num="6144" local="true"/>. Il vise à
remplacer « NAT-PT » (<rfc num="2765" local="false"/> et <rfc num="2766" local="false"/>), officiellement
retiré, après n'avoir eu aucun succès. Ce RFC a lui-même été remplacé
par la suite par le <rfc num="7915" local="true"/>.</p>
<p>Plus spécifiquement, notre <rfc num="6145"/> est la version
<emphasis>sans état</emphasis> du traducteur, c'est-à-dire que le
traducteur peut traiter chaque paquet indépendemment des autres. Le
traducteur n'a pas de table des flots en cours. S'il redémarre et perd toute mémoire, pas de problème, il peut
immédiatement reprendre son travail. Cette technique permet notamment
le <emphasis>passage à l'échelle</emphasis> : un traducteur d'adresses
peut gérer un très grand nombre de clients sans épuiser sa
mémoire. Mais elle a quelques inconvénients comme le fait que les
<wikipedia name="IP fragmentation" xml:lang="en">fragments</wikipedia> <wikipedia name="Internet Control Message Protocol">ICMP</wikipedia> ne seront
pas traduits. Il
existe donc également une version <emphasis>avec état</emphasis> du nouveau
mécanisme, normalisée dans le <rfc num="6146" local="true"/>. La section
1.3 discute plus en détail ces deux possibilités, avec ou sans état.</p>
<p>Donc, le NAT64 (son nom non officiel) vise à traduire des adresses
IP entre deux réseaux, l'un v4 et l'autre v6. Comme notre <rfc num="6145"/> ne traite que le cas
sans état, les adresses doivent être converties de manière purement
algorithmique, sans référence à leur histoire (cf.  <rfc num="6052" local="true"/> pour ces algorithmes).</p>
<p>Dit comme ça, cela a l'air simple mais la traduction entre deux
protocoles différents porte pas mal de pièges. Ainsi, les en-têtes de
<wikipedia name="Paquet (réseau)">paquet</wikipedia> n'ont pas la même taille en v4 (20
octets ou plus) et en v6 (40 octets, fixe),
ce qui fait que des problèmes de <wikipedia name="Maximum Transmission Unit">MTU</wikipedia> peuvent se
poser (section 1.4). Le traducteur doit se comporter comme un routeur,
donc fragmenter les paquets trop gros (en IPv4) ou retourner un
message <wikipedia name="Internet Control Message Protocol">ICMP</wikipedia> « <foreign>Packet too big</foreign> ».</p>
<p>La section 4 du RFC décrit en détail les opérations que doit faire
le traducteur depuis IPv4 vers IPv6 (rappelez-vous que la traduction
des <wikipedia name="Adresse IP">adresses</wikipedia> v4 en v6
est essentiellement dans le <rfc num="6052" local="true"/>, section 2). Il y a des détails que ne connaissent pas
les routeurs NAT44, qui se contentent de changer adresses et
<wikipedia name="Port (logiciel)">ports</wikipedia>. En effet, ici, il faut
traduire tout l'en-tête. Je ne vais pas résumer complètement cette section, juste pointer
quelques pièges possibles. Ainsi, les en-têtes n'étant pas les mêmes
en v4 et en v6, notre RFC doit spécifier quoi en faire. Certains cas
sont évidents (comme le champ Longueur), d'autres moins. Ainsi, le
champ TOS de IPv4 doit être copié verbatim dans le champ
<foreign>Traffic Class</foreign> de IPv6. Mais le traducteur doit
aussi offrir une option pour ignorer le TOS et mettre systématiquement
zéro comme <foreign>Traffic Class</foreign>. Le champ TTL de IPv4 doit
être copié dans <foreign>Hop limit</foreign> mais
<emphasis>après</emphasis> avoir été décrémenté (rappelez-vous que le
traducteur est un routeur).</p>
<p>La vraie difficulté n'est pas tellement dans la traduction d'IP que
dans celle d'ICMP. En effet, le paquet ICMP contient le début du
paquet IP qui a motivé son envoi, et ce début de paquet doit être
traduit, également, sans quoi le destinataire du paquet ICMP n'y
comprendra rien (par exemple, sans traduction ICMP, il recevrait en
IPv6 un paquet ICMP dont le contenu est un paquet IPv4...). Notre RFC
détaille donc les traductions à faire pour tous les modèles de paquets
ICMP.</p>
<p>Le
traducteur doit aussi veiller au champ Type d'ICMP, dont les valeurs
sont différentes entre IPv4 et IPv6 (par exemple, <foreign>Echo
Reply</foreign> est 0 en v4 et 129 en v6). Certains types n'ont pas
d'équivalent (comme les types <foreign>Timestamp</foreign> ou
<foreign>Address Mask</foreign> d'ICMPv4, absents d'ICMPv6) et le
paquet ICMP doit donc être abandonné.</p>
<p>Enfin, le traducteur doit aussi prendre en charge les en-têtes de
la <wikipedia>couche 4</wikipedia> car la traduction des adresses peut
ne pas être neutre pour la <wikipedia>somme de contrôle</wikipedia>
(section 4.5) et il peut donc être nécessaire de recalculer cette
dernière.</p>
<p>Et en sens inverse ? La section 5 décrit la traduction d'IPv6 vers
IPv4. On retrouve TOS et <foreign>Traffic Class</foreign>, les
problèmes de <wikipedia name="Maximum Transmission Unit">MTU</wikipedia> et de fragmentation, et la
traduction des messages ICMP.</p>
<p>Les problèmes de MTU et de fragmentation sont des cauchemars
habituels sur l'Internet, notamment en raison d'équipements
intermédiaires (typiquement des <wikipedia name="Pare-feu (informatique)">pare-feux</wikipedia>)
programmés avec les pieds par des anonymes, ou bien configurés
n'importe comment, et qui bloquent les paquets ICMP, voire les
modifient, en ignorant complètement le <rfc num="4890" local="false"/>. Les traducteurs v4&lt;-&gt;v6 auront donc ce problème,
comme tant d'autres techniques utiles. La section 6 doit donc se
pencher sur le traitement des paquets ICMP <foreign>Packet too
big</foreign> qui signalent normalement que la MTU est plus réduite
que ne le croit l'émetteur et qu'il faut fragmenter. Comme ces paquets
sont parfois interceptés, voire modifiés, par des machines gérées par
des incompétents, le traducteur doit donc parfois faire des efforts
spécifiques (par exemple en modifiant la valeur de la MTU dans
certains messages <foreign>Packet too big</foreign>).</p>
<p>Rien n'étant parfait en ce bas monde, les traducteurs NAT64 vont
aussi introduire de nouvelles questions de sécurité. La section 8 tente
de prévoir lesquelles mais reste optimiste en considérant que la
plupart des problèmes existent déjà dans IPv4 ou dans IPv6. Ainsi, comme avec le NAT traditionnel,
l'authentification des paquets par <wikipedia name="Internet Protocol Security">IPsec</wikipedia> (<rfc num="4302"
local="false"/>) ne marchera pas.</p>
<p>Pour les gens qui aiment bien les exposés concrets, avec des 0 et
des 1, l'annexe A explique en grand détail le
processus de traduction avec un réseau simple d'exemple, connectant le
réseau traditionnel <computer>198.51.100.0/24</computer> et le réseau
nouveau <computer>2001:db8::/32</computer>, via un
traducteur. Deux machines, H4 et H6, <wikipedia>Alice et Bob</wikipedia> du NAT64, vont tenter de communiquer. Le traducteur
utilise le préfixe <computer>2001:db8:100::/40</computer> pour
représenter les adresses IPv4 et <computer>192.0.2.0/24</computer>
pour représenter les adresses IPv6. <!-- TODO pas checksum-neutral -->Ainsi,
H6, qui a l'adresse <computer>2001:db8:1c0:2:21::</computer> est
représenté en v4 par <computer>192.0.2.33</computer>. H4 a l'adresse
<computer>198.51.100.2</computer>. <image name="behave-xlate-stateless"/> Une fois le routage
correctement configuré pour passer par le traducteur, suivez le RFC
pour voir le trajet des paquets et les opérations qu'ils subissent,
dans le cas où c'est H6 qui initie la connexion, et dans le cas inverse.</p>
<p>Au moins deux mises en &#x153;uvre existent déjà,
<link url="http://ecdysis.viagenie.ca/">faite par
Ecdysis/Viagénie</link> (avec état) et <link
url="http://www.litech.org/tayga/">Tayga</link> (sans état, mais nettement plus simple, d'après ses utilisateurs). Pour
compenser l'absence de traduction avec état chez Tayga, on peut, sur
<wikipedia>Linux</wikipedia>, le coupler avec SNAT/MASQUERADE (merci à
Guillaume Leclanché pour sa suggestion).</p>
<p>Quels sont les changements entre ce mécanisme et celui du <rfc
num="2765"/> ? Ils sont résumés en section 2. Outre une complète
réorganisation des documents, il s'agit surtout de détailler bien
davantage les opérations à effectuer. Depuis, notre <rfc num="6145"/>
a été mis à jour dans le <rfc num="7915" local="true"/>.</p>
<p>Pour réfléchir à la grande question « avec état ou sans état », un
article « pro-état » : « <foreign><link
url="http://blog.ioshints.info/2011/05/stateless-nat64-is-useless.html">Stateless
NAT64 is useless</link></foreign> ».</p>
</content>
</rfcdesc>
