<?xml version="1.0" encoding="utf-8"?>
<rfcdesc title="Discovery of the IPv6 Prefix Used for IPv6 Address Synthesis" num="7050" wg="behave" status="standards">
<rfcdate><month>November</month><year>2013</year></rfcdate>
<authors><author>T. Savolainen (Nokia)</author><author>J. Korhonen (Nokia Siemens Networks)</author><author>D. Wing (Cisco Systems)</author></authors>
<date>2013-11-05</date>
<content>
<p>Lorsqu'on utilise le mécanisme <wikipedia xml:lang="en">NAT64</wikipedia> du <rfc
num="6146" local="true"/> pour donner accès à l'Internet historique
<wikipedia>IPv4</wikipedia> depuis des machines
<wikipedia>IPv6</wikipedia>, seul le traducteur NAT64 connait le
préfixe IPv6 utilisé pour la traduction. Les machines ordinaires du
réseau local ne le savent pas. Ce nouveau RFC fournit un moyen
standard de découvrir ce préfixe.</p>
<p>Un tout petit rappel sur <wikipedia xml:lang="en">NAT64</wikipedia> (<rfc
num="6146" local="true"/>) et son copain <wikipedia xml:lang="en" name="IPv6 transition mechanisms" anchor="DNS64">DNS64</wikipedia>
(<rfc num="6147" local="true"/>) : leur but est de fournir une
connectivité <wikipedia>IPv4</wikipedia> (par exemple pour accéder à
des machines qui n'ont toujours pas <wikipedia>IPv6</wikipedia>) aux
réseaux modernes qui seront entièrement en IPv6 (<rfc num="6144" local="true"/>). Pour cela, le serveur
DNS64 « ment » en répondant aux requêtes de type AAAA (demande d'une
adresse IPv6) par une réponse synthétisée, lorsque le nom demandé n'a
qu'un A (adresse IPv4). Cette réponse synthétique utilise un préfixe
configuré à la fois dans le serveur DNS64 et dans le traducteur NAT64
qui, voyant une adresse portant ce préfixe dans le champ Destination,
va traduire l'IPv6 en IPv4 (et réciproquement au retour).</p>
<p>La plupart du temps, les machines IPv6 situées sur le réseau local
n'auront aucun besoin de savoir ce qui se passe. Pour elles, tous les
services externes sont accessible en IPv6 et elles ne connaissent pas
la magie sous-jacente. Bien sûr, en regardant les adresses IPv6
obtenues, elles pourront s'étonner de voir que tant d'entre elles
commencent par le même préfixe, mais qu'elles le fassent ou pas ne
change rien. NAT64 est prévu pour fonctionner entièrement dans le
routeur d'accès, sans participation (et donc sans mise à jour du
logiciel) des machines terminales.</p>
<p>Sauf qu'il y a des cas où il serait utile que ces machines
terminales bossent un peu. Par exemple, DNS64 ne sert à rien si
l'application n'utilise pas le DNS. Si on a un
<wikipedia name="Uniform Resource Locator">URL</wikipedia> <computer>http://192.168.0.33/</computer>,
qui est légal (quoique déconseillé) et devrait marcher, DNS64 ne sera
jamais appelé et NAT64 échouera donc. Pourtant, cet URL pourrait
fonctionner à travers NAT64 si seulement la machine terminale faisait
le travail de DNS64 en synthétisant l'adresse IPv6 correspondant à
<computer>192.168.0.33</computer>. Un problème analogue avec DNS64 se
pose si la machine terminale fait la validation
<wikipedia name="Domain Name System Security Extensions">DNSSEC</wikipedia> elle-même (ce qui est souvent <link
local="ou-valider-dnsssec">une bonne idée</link>). Dans ce cas, les
réponses « mensongères » du serveur DNS64 seront refusées. Dans ces
deux cas, on souhaite que la machine terminale synthétise une adresse
IPv6 elle-même et, pour cela, elle doit connaître le préfixe qui
permettra au routeur NAT64 de savoir ce qu'il doit faire.</p>
<p>Ce préfixe « magique » (les adresses utilisant tout autre préfixe
seront traitées par le routeur comme de l'IPv6 ordinaire) peut être de
deux types :
<enum>
<item>Un préfixe bien connu, réservé à cet usage, le WKP
(<foreign>Well-Known Prefix</foreign>) qui vaut
<computer>64:ff9b::/96</computer>. Il est décrit dans le <rfc num="6052"
local="true"/>.</item>
<item>Ou bien un préfixe décidé localement, un NSP
(<foreign>Network-Specific Prefix</foreign>),
<computer>2001:db8:1:64::/96</computer> dans les exemples suivants.</item>
</enum>
Dans les deux cas, ce préfixe doit être configuré à l'identique dans
le routeur NAT64 et dans le serveur DNS64. Et, si on utilise la
synthèse locale (locale à la machine terminale) des adresses IPv6, il
,doit aussi être connu des machines terminales, ce qui est le but de
ce RFC. Attention, il peut y avoir non pas un, mais plusieurs préfixes utilisés simultanément.</p>
<p>La technique utilisée dépend entre autres d'un nom bien connu,
<computer>ipv4only.arpa</computer>, qui n'aura jamais
<emphasis>que</emphasis> des adresses IPv4, et d'adresses IPv4 bien
connues, les WKA (<foreign>Well-Known Addresses</foreign>),
<computer>192.0.0.170</computer> et <computer>192.0.0.171</computer>.
<code>
<![CDATA[
% dig +short A ipv4only.arpa
192.0.0.170
192.0.0.171

% dig +short AAAA ipv4only.arpa
]]>
</code>
</p>
<p>Le principe (section 3 de notre RFC) est de faire une requête
<wikipedia name="Domain Name System">DNS</wikipedia> de type AAAA (adresse IPv6) pour ce nom
<computer>ipv4only.arpa</computer>. Comme ce nom n'a que des
enregistremments A (adresse IPv4), si on obtient des enregistrements
AAAA, c'est qu'il y a du DNS64 sur le trajet, qui synthétise ces
enregistrements. Sinon, il n'y a pas de service DNS64. (La requête doit se faire avec le bit CD
- <foreign>Checking Disabled</foreign> - à 0, autrement le serveur
DNS64 ne fait pas la synthèse.) À la place d'un serveur DNS64, il peut
aussi y avoir un serveur menteur qui répond même en l'absence de
données (cela est fréquent sur les <wikipedia name="Portail captif">portails
captifs</wikipedia>). Dans ce cas, le client doit aussi faire une
requête pour un nom qui n'existe pas (il n'est <link
local="noms-inexistants">pas si facile que cela</link> d'en trouver
un) et vérifier qu'il récupère bien
<computer>NXDOMAIN</computer>.</p>
<p>Une fois reçue sa réponse, la machine doit examiner tous ces AAAA
et en déduire le (ou les) préfixe(s) utilisé(s) pour la synthèse. Si
le préfixe est le WKP, c'est facile. Si c'est un NSP, c'est un peu
plus dur. C'est là que
les WKA sont utilisées : comme la machine connait les adresses IPv4
originales, elle peut les retrouver dans les adresses IPv6. 
Avec les examples plus haut, la machine fait une requête AAAA pour
<computer>ipv4only.arpa</computer>, obtient comme réponse
<computer>2001:db8:1:64::192.0.0.170</computer> (qu'on peut également
écrire <computer>2001:db8:1:64::c000:aa</computer>) et en déduit que le
préfixe utilisé est <computer>2001:db8:1:64::/96</computer>. Par exemple, avec
<wikipedia>BIND</wikipedia>, et ce fichier de configuration :
<code>
options {
        ...
        dns64 2001:db8:1:64::/96 { // Network-Specific Prefix
              clients { me; };
        };
</code>
On obtiendra :
<code>
% dig +nodnssec AAAA ipv4only.arpa
...
;; ANSWER SECTION:
ipv4only.arpa.		3485 IN	AAAA 2001:db8:1:64::c000:ab
ipv4only.arpa.		3485 IN	AAAA 2001:db8:1:64::c000:aa
</code>
Si cela ne marche pas (par exemple si on ne trouve pas
les WKA comme <computer>192.0.0.170</computer> dans la réponse), alors
la recherche du préfixe a échoué (format d'adresses inhabituel ou un
truc comme ça) et on doit laisser tomber et donc ne pas faire de
synthèse d'adresses IPv6 sur la machine cliente. La procédure de ce RFC ne
prétend pas marcher dans tous les cas.</p>
<p>Au fait, pourquoi deux adresses WKA,
<computer>192.0.0.170</computer> et <computer>192.0.0.171</computer> ?
L'annexe B du RFC discute ce choix, dû au désir de limiter les faux
positifs (par exemple si la chaîne de bits qui compose une des deux
adresses apparait également dans le préfixe NAT64.)</p>
<p>Notons que, si le canal entre le client et le serveur DNS64 n'est
pas protégé, un attaquant peut facilement informer le client avec un
mauvais préfixe. On peut (sauf pour le WKP) valider l'information avec
<wikipedia name="Domain Name System Security Extensions">DNSSEC</wikipedia> (je ne détaille pas ici, voir la section
3.1 du RFC).</p>
<p>C'est bien joli d'avoir appris le préfixe mais rappelez-vous que ce
RFC propose essentiellement une <emphasis>heuristique</emphasis> : il
ne donne pas de garanties. Il faut donc tester le préfixe qu'on vient
d'obtenir. Après tout, des tas de choses peuvent déconner. La machine
cliente peut faire les tests qu'elle veut (viser des <link
local="que-pinguer">amers publics</link>). Mais le RFC suggère une
procédure que le <wikipedia name="Fournisseur d'accès à Internet">FAI</wikipedia> qui a déployé NAT64 peut
mettre en place. Le FAI doit configurer une machine de test (qui
répond aux paquets <wikipedia name="Internet Control Message Protocol">ICMP</wikipedia>
<computer>Echo</computer> et n'a pas de <wikipedia name="Rate limiting">limitation de
trafic</wikipedia>) et mettre
deux informations dans le DNS. La machine finale fait une requête DNS de type
<wikipedia name="Domain Name System" anchor="PTR_record">PTR</wikipedia> pour une adresse WKA
(<computer>192.0.0.170</computer> ou <computer>192.0.0.171</computer>)
représentée en IPv6 et traduite au format
<computer>ip6.arpa</computer>. Puis elle fait une requête de type A
sur le nom obtenu et cela donne l'adresse de la machine de test du
FAI, si celui-ci a suivi les recommandations de notre RFC. Avec les
exemples de préfixes plus haut, on utilisera l'adresse
<computer>2001:db8:1:64::192.0.0.170</computer>, la requête PTR
portera sur
<computer>a.a.0.0.0.0.0.c.0.0.0.0.0.0.0.0.4.6.0.0.1.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa</computer>
et, si elle renvoie le nom <computer>ping.example.net</computer>, la
requête A portera sur ce nom. Mettons qu'on obtienne
<computer>192.0.2.33</computer>, on synthétisera <computer>2001:db8:1:64::192.0.2.33</computer>
et on verra bien si ça marche. (L'annexe A du RFC contient un exemple
complet de fichier de zone DNS standard utilisant cette technique.)</p>
<p>Par contre, les clients ne doivent pas faire de tests de
connectivité avec les adresses obtenues en interrogeant
<computer>ipv4only.arpa</computer>. (Elles ne sont pas censées
répondre.)</p>
<p>Notre RFC rappelle aussi que cette technique ne change rien au fait
que NAT64 est fondamentalement un bricolage provisoire, que le
résultat est « mieux que rien » mais que la bonne solution est
évidemment le passage généralisé à IPv6.</p>
<p>Ah, et, pendant qu'on parle de ce que configure localement le FAI,
le RFC n'interdit pas des déploiements de NAT64 où les clients
utilisent un autre nom que <computer>ipv4only.arpa</computer>, par
exemple si le FAI veut ne dépendre que de ses propres noms
(<computer>ipv4only.example.net</computer>).</p>
<p>Les sections 4 et 5 donnent quelques conseils pratiques pour le
déploiement de l'infrastructure nécessaire. Ainsi, le domaine
<computer>ipv4only.arpa</computer> devra avoir un long
<wikipedia name="Time to Live" anchor="Le_Time_to_Live_dans_le_DNS">TTL</wikipedia>, au moins une heure, pour bénéficier des
<wikipedia name="Mémoire cache">caches</wikipedia>. Il doit être signé avec <wikipedia name="Domain Name System Security Extensions">DNSSEC</wikipedia>.</p>
<p>Comme pour toutes les techniques de transition (ici, d'IPv4 vers
IPv6), l'<wikipedia name="Internet Engineering Task Force">IETF</wikipedia> impose une description d'une
stratégie de sortie. Comment fera t-on lorsque NAT64 et DNS64 ne
seront plus nécessaires ? La section 6 demande que les machines
terminales qui ont la possibilité de découvrir le préfixe NAT64, et de
synthétiser elles-mêmes les adresses IPv6, aient un mécanisme pour
couper cette possibilité, le jour où elle sera abandonnée.</p>
<p>Enfin, un peu de bureaucratie <wikipedia name="Internet Assigned Numbers Authority">IANA</wikipedia> en
section 8. Le domaine « spécial » <computer>ipv4only.arpa</computer> a
été enregistré selon les règles des <rfc num="3172" local="false"/>,
et <rfc num="6761" local="true"/>, règles qui n'avaient pas vraiment été
respectées, ce qui a nécessité une correction dans le <rfc num="8880"
local="true"/>. Le domaine a été placé dans le <link
url="https://www.iana.org/assignments/special-use-domain-names/special-use-domain-names.xml#special-use-domain">registre des noms spéciaux</link>. Les adresses WKA, elles, ont
été enregistrées selon les règles des <rfc num="5736" local="true"/>
(qui gère <computer>192.0.0.0/24</computer>) et <rfc num="6890"
local="true"/>. Elles sont donc désormais dans le <link
url="https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml#iana-ipv4-special-registry-1">registre des adresses spéciales</link>.</p>
<p>Il existe au moins <link
url="https://sites.google.com/site/tmoipv6/464xlat#TOC-Android-CLAT-on-a-UMTS-IPv6-only-network-with-DNS64-NAT64">une
mise en œuvre de NAT64</link> qui inclus la technique de découverte de
préfixe de ce RFC.
</p>
</content>
</rfcdesc>
