<?xml version="1.0" encoding="utf-8"?>
<rfcdesc title="IPv6 Addressing of IPv4/IPv6 Translators" num="6052" status="standards" wg="behave">
<authors><author>C. Bao (CERNET Center/Tsinghua University)</author><author>C. Huitema (Microsoft)</author><author>M. Bagnulo (UC3M)</author><author>M. Boucadair (France Telecom)</author><author>X. Li (CERNET Center/Tsinghua University)</author></authors>
<rfcdate><month>October</month><year>2010</year></rfcdate>
<date>2010-11-01</date>
<content>
<p>Il existe plusieurs mécanismes pour assurer la co-existence entre
les protocoles <wikipedia>IPv4</wikipedia> et
<wikipedia>IPv6</wikipedia>. Ce <wikipedia name="Request for comments">RFC</wikipedia> ne
normalise pas un nouveau mécanisme mais spécifie les formats d'adresse
à utiliser pour les traducteurs IPv4&lt;-&gt;IPv6, les logiciels qui
vont convertir d'un format dans l'autre. Il est donc le socle des
résultats de la nouvelle version du groupe de travail <wikipedia name="Internet Engineering Task Force">IETF</wikipedia>
<link url="http://tools.ietf.org/wg/behave">Behave</link> qui, depuis
l'échec de <wikipedia xml:lang="en" name="IPv6 transition mechanisms" anchor="NAT-PT">NAT-PT</wikipedia>, essaie de normaliser une
technique de <wikipedia name="Network address translation">traduction d'adresses</wikipedia> permettant
d'assurer la coexistence dans certains cas.</p>
<p>Le <wikipedia name="Request for comments">RFC</wikipedia> du groupe Behave qui décrit le cadre
général de cette traduction (<foreign>Framework for IPv4/IPv6
Translation</foreign>) est le <rfc num="6144" local="true"/>. Empruntons-lui
quelques exemples. Supposons par exemple un réseau purement
IPv6 (hypothèse réaliste à l'heure où il ne reste plus que <link local="epuisement-adresses-ipv4">quelques
mois d'adresses v4</link>) et qui veut parler aux serveurs Web
existants qui n'ont que v4. Un des mécanismes possibles est la
traduction d'adresses. Supposons que le site Web convoité soit en
<computer>198.51.100.129</computer>. La machine purement v6 interroge
un serveur <wikipedia name="Domain Name System">DNS</wikipedia> 64 (protocole pas encore
normalisé) qui lui répond « Va voir en
<computer>64:ff9b::c633:6481</computer> »
(<computer>c633:6481</computer> == <computer>198.51.100.129</computer>). Elle émet alors un paquet
IPv6 vers cette adresse. Sur le trajet, un traducteur d'adresses va
prendre ce paquet, le traduire en v4 algorithmiquement et, lorsque la
réponse reviendra, il la traduira en v6, l'envoyant à la machine
cliente. Voici un exemple où une machine purement IPv6 tente de contacter <wikipedia>Twitter</wikipedia>, service purement IPv4 :
<code>
% telnet twitter.com 80
Trying 64:ff9b::80f2:f0f4...
Connected to twitter.com.
Escape character is '^]'.
</code>
 Bien sûr, cette présentation est très sommaire mais c'est
parce que le travail de spécification n'est pas encore terminé. La
première étape de cette spécification est de décider des adresses
utilisées et c'est ce que fait notre RFC. (Il pourrait d'ailleurs,
dans le futur, être utilisé par des techniques autre que la
traduction, comme l'encapsulation, cf. section 1.1.)</p>
<p>Un peu de vocabulaire, d'abord (section 1.3) :
<enum>
<item>Un traducteur d'adresse est tout dispositif qui va tripoter des adresses,
qu'il ait accès aux <wikipedia name="Paquet (réseau)">paquets</wikipedia> (dans ce cas, on
peut l'appeler « traducteur v4/v6 » ou « traducteur IP ») ou pas (cas d'un
serveur <wikipedia name="Domain Name System">DNS</wikipedia> 64).</item>
<item><foreign>IPv4-embedded IPv6 address</foreign>, une adresse IPv6
qui contient une adresse IPv4 (comme dans l'exemple
<computer>64:ff9b::c633:6481</computer> plus haut).</item>
<item><foreign>IPv4-converted IPv6 address</foreign>, un cas
particulier des précédentes,</item>
<item><foreign>IPv4-translatable IPv6 address</foreign>, un autre cas
particulier des <foreign>IPv4-embedded IPv6 address</foreign>, où
l'adresse IPv6 est globalement unique et peut donc être routée dans le
grand <wikipedia>Internet</wikipedia>.</item>
</enum>
Les traductions peuvent être <emphasis>sans état</emphasis>
(<foreign>stateless</foreign>) ou bien <emphasis>avec état</emphasis>
(<foreign>stateful</foreign>). Dans le premier cas, le traducteur n'a
aucune mémoire. Chaque paquet est traité isolément, comme si le
traducteur venait juste de démarrer. Cela permet donc de traiter une
bien plus grande quantité de paquets et assure les meilleures
performances et, surtout, le <wikipedia xml:lang="en"
name="Scalability">passage à l'échelle</wikipedia>. Dans le second
cas, celui de la traduction avec état, la traduction dépend des
paquets précédents, par exemple parce que le traducteur se souvient
que les paquets venant de tel port sont destinés à telle
adresse. Nécessitant une table des correspondances en mémoire, la
traduction avec état <wikipedia xml:lang="en"
name="Scalability">passe moins à l'échelle</wikipedia>. Mais, dans
certains cas, elle est la seule réaliste, puisqu'on ne peut pas
stocker toutes les informations dans une seule adresse, surtout si
elle est IPv4.
</p>
<p>Armé de ces définitions, quels sont les formats d'adresses
<foreign>IPv4-embedded</foreign> possibles ? La section 2 les
liste. D'abord, un préfixe spécial a été <link
url="https://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml#note6">réservé
à l'IANA</link> (cf. section 6) pour
<emphasis>certaines</emphasis> de ces adresses :
<computer>64:ff9b::/96</computer> (section 2.1). Lorsque vous verrez passer une
adresse IPv6 commençant par ce préfixe, vous pouvez être sûr de voir
une adresse IPv4 embarquée.</p>
<p>Ensuite, toutes les adresses IPv6 <foreign>IPv4-embedded</foreign>,
qu'elles utilisent ce préfixe ou pas, suivent le même format (section 2.2) : un
préfixe (<computer>64:ff9b::/96</computer> ou bien un préfixe tiré de
l'espace d'adressage de l'opérateur), l'adresse IPv4, un suffixe
(parfois nul). Pour respecter la section 2.5.1 du <rfc num="4291"
local="true"/>, un octet nul est parfois ajouté au milieu de l'adresse
IPv4. Six longueurs de préfixe sont acceptées, 32, 40, 48, 56, 64, ou
96 (cette dernière est celle qui est typiquement utilisée avec le
préfixe <computer>64:ff9b::/96</computer>). Les sections 3.3 et 3.4
expliquent quelle longueur choisir selon les cas.</p>
<p>Si on utilise un préfixe de longueur 48, comme l'octet qui va des
bits 64 à 71 inclus doit être nul, l'adresse IPv4 est en deux
parties. On a donc d'abord le préfixe IPv6, les deux premiers octets
de l'adresse IPv4, un octet nul, le reste de l'adresse IPv4 et un
suffixe de cinq octets. Avec un préfixe de longueur 96, tout est plus simple, le
prefixe occupe les douze premiers octets, l'adresse IPv4 prend le
reste (et le suffixe est absent). Le tableau 1 dans la section 2.2
résume les autres possibilités.</p>
<p>Une fois ce format défini, la section 2.3 décrit le (très simple) algorithme qui
permet de passer d'une adresse IPv4 à une adresse IPv6 et
réciproquement.</p>
<p>Petite question de <link
local="representation-texte">présentation</link> : comment afficher
les adresses IPv6 <foreign>IPv4-embedded</foreign> ? Bien sûr en
obéissant au <rfc num="4291" local="true"/> (section 2.2) et au <rfc
num="5952" local="true"/>. Comme le <rfc num="4291" local="true"/>
permet de représenter les quatre derniers octets (et uniquement
ceux-ci) sous la forme d'une adresse IPv4, l'adresse
<computer>64:ff9b::c633:6481</computer>, citée plus haut, aurait aussi
pu s'écrire <computer>64:ff9b::198.51.100.129</computer>, ce qui est
certainement plus lisible.</p>
<p>Ensuite, comment utiliser ces adresses sur un vrai réseau ? La
section 3 couvre les questions de déploiement. D'abord, le préfixe
<computer>64:ff9b::/96</computer> ne doit être utilisé qu'avec des
adresses IPv4 globalement uniques (donc, par exemple, pas avec celles
du <rfc num="1918" local="true"/>). Moins évident, il ne doit pas non
plus être utilisé pour construire des adresses IPv6
<foreign>IPv4-translatable</foreign>, celles-ci devant être
globalement uniques. Si tout le monde est libre de se servir de ce
préfixe <computer>64:ff9b::/96</computer>, on ne peut pas compter
qu'on recevra les paquets qui lui sont adressés depuis un point
quelconque de l'Internet. Son usage normal est
limité à l'intérieur d'un réseau (section 3.1), autrement, il faut se
servir de préfixes spécifiques d'un opérateur.</p>
<p>Pendant qu'on parle de ce préfixe, il faut noter que les opérateurs
qui s'en servent peuvent l'annoncer dans leurs tables de routage et
qu'il apparaîtra donc sur l'Internet, par exemple si un opérateur
décide de fournir un service de traduction d'adresses à un autre. Mais
une telle annonce devrait normalement être contrôlée (section 3.2) et
ne pas être transmise à toute la <wikipedia name="Default-free zone">DFZ</wikipedia>. Et,
normalement, ceux qui annoncent ce préfixe en
<wikipedia name="Border Gateway Protocol">BGP</wikipedia> doivent logiquement fournir un service de
traduction ensuite (ou bien ils créent un <wikipedia name="Black hole
(informatique)">trou noir</wikipedia>).</p>
<p>Quel préfixe choisir pour ses services de traduction ? La section
3.3 donne quelques conseils. Par exemple, la « meilleure » longueur
est sans doute 32, car, une fois l'adresse IPv4 ajoutée, la totalité
de l'information se trouve dans les bits « de routage » (les 64
premiers). Pour le routage, c'est donc la meilleure solution mais
obtenir de son <wikipedia name="Registre Internet régional">RIR</wikipedia> un /32 entier uniquement pour le service de traduction
d'adresses peut être dificile. Des préfixes plus longs sont donc plus
raisonnables. Le RFC suggère par exemple qu'un opérateur qui a un /32
en tout consacre un /40 au service de traduction (moins de 0,5 % de
son espace d'adressage). S'il s'agit d'un
simple client et pas d'un opérateur, et qu'il a un /48, un /56
conviendra pour le service de traduction. Mais la valeur exacte dépend
aussi du scénario de coexistence considéré.</p>
<p>En cas de traduction avec état (section 3.4), les choix peuvent
être différents et le préfixe <computer>64:ff9b::/96</computer> est
souvent la solution la plus intéressante.</p>
<p>Un des intérêts de ce RFC est la section 4, qui explique les
raisons des choix faits. Ainsi, le suffixe, pour les formats où il y
en avait un, aurait pu être utilisé pour stocker de l'information sur
les <link local="loguer-adresse-et-port">ports</link> (section
4.1). Cela aurait augmenté les chances de pouvoir faire une traduction
sans état. Cette option n'a pas été retenue dans l'immédiat mais pourrait
être ajoutée plus tard. En attendant, le suffixe a obligatoirement
tous ses bits à zéro ce qui, pour le format avec préfixe /32, mène à
un identificateur d'interface (les 64 derniers bits d'une adresse
IPv6) entièrement nul. C'est normalement interdit (section 2.6.1 du
<rfc num="4291" local="true"/>) mais notre RFC explique que c'est
acceptable dans le contexte limité de la traduction d'adresse.</p>
<p>Le choix de la valeur <computer>64:ff9b::/96</computer> pour le
préfixe de référence est expliqué en section 4.2. D'abord, le préfixe existant pour les adresses
IPv4, <computer>::ffff:0:0/96</computer> (section 2.5.5.2 du <rfc
num="4291" local="true"/>), aurait pu être réutilisé (c'était prévu dans la section
2.1 du <rfc num="2765" local="false"/>). Cela aurait simplifié
l'effort de normalisation. Le problème est que, justement, ce préfixe
est déjà connu. Plusieurs mises en &#x153;uvre d'IPv6 le traitent à
part (par exemple, <wikipedia name="Microsoft
Windows">Windows</wikipedia> génère systématiquement des paquets IPv4
lorsqu'on lui présente ces adresses IPv6).</p>
<p>Il fallait donc allouer un nouveau préfixe. Un /32 aurait permis
d'avoir tous les bits significatifs dans les 64 premiers bits mais
n'aurait pas permis d'utiliser la représentation texte avec une
adresse IPv4 (qui n'est possible qu'à la fin d'une adresse
v6). Finalement, un préfixe /96 a été choisi. Sa valeur <computer>64:ff9b::/96</computer> n'a pas été
tirée au hasard : elle est neutre pour le calcul de la
<wikipedia>somme de contrôle</wikipedia>. La somme de 64 et de ff9b
est ffff, ce qui est équivalent à zéro en <wikipedia>complément à
un</wikipedia>. (Depuis, un autre préfixe l'a rejoint, le
<computer>64:ff9b:1::/48</computer> du <rfc num="8215" local="true"/>.)</p>
<p>Ces systèmes de traduction d'adresse posent-ils des problèmes de
sécurité ? Oui, dit la section 5 qui en expose certains. Par exemple,
un paquet peut mentir sur son adresse IP source, qu'il y ait
traduction ou pas. En fait, note la section 5.1, un traducteur IP est
comme un <wikipedia>routeur</wikipedia>, il a les mêmes vulnérabilités
et il peut mettre en &#x153;uvre les mêmes protections. Ainsi,
lorsqu'il reçoit un paquet IPv6 incluant une adresse IPv4, il peut,
avant traduction, s'assurer que la machine était autorisée à utiliser
cette adresse IPv4 (si le paquet vient de l'intérieur d'un réseau,
c'est relativement facile). D'autres tests sont possibles comme les
vérifications du chemin de retour (cf. <rfc num="3704"
local="true"/>).</p>
<p>D'autre part, lorsqu'un <wikipedia name="Pare-feu (informatique)">pare-feu</wikipedia> teste les
adresses IPv4 (section 5.2), on pourrait imaginer un attaquant qui
envoie des paquets IPv6 avec adresse v4 embarquée. Le paquet v6 ne
serait pas arrêté par les filtres v4 mais, après traduction,
le paquet v4 pourrait faire des dégâts. Il est donc crucial que le
pare-feu vérifie les adresses v4 embarquées comme si elles étaient natives.</p>
</content>
</rfcdesc>


