<?xml version="1.0" encoding="utf-8"?>
<rfcdesc title="Learning NAT64 PREFIX64s using Port Control Protocol (PCP)" num="7225" status="standards" wg="pcp">
<authors><author>M. Boucadair (France Telecom)</author></authors>
<rfcdate><month>May</month><year>2014</year></rfcdate>
<date>2014-05-19</date>
<content>
<p>Lorsqu'on est situé derrière un routeur
<wikipedia xml:lang="en">NAT64</wikipedia>, parce qu'on n'a pas d'adresse
<wikipedia>IPv4</wikipedia> et qu'on dépend de ce routeur pour la
communication avec les vieux systèmes qui sont encore uniquement en
IPv4, on peut, la plupart du temps, ignorer ce que fait ledit routeur
et, notamment, le préfixe qu'il utilise pour synthétiser des adresses
<wikipedia>IPv6</wikipedia> à partir des adresses IPv4 des systèmes
archaïques. C'est la cuisine interne du routeur. Mais, parfois, ce n'est pas possible et on aurait besoin
de connaître ce préfixe pour faire la synthèse d'adresses IPv6
soi-même. Ce nouveau <wikipedia name="Request for comments">RFC</wikipedia> décrit une option du
protocole <wikipedia xml:lang="en" name="Port Control Protocol">PCP</wikipedia> permettant d'apprendre le préfixe
de synthèse.</p>
<p>Un petit rappel sur <wikipedia xml:lang="en">NAT64</wikipedia>, normalisé dans le
<rfc num="6146" local="true"/>. Lorsqu'on a un réseau purement
<wikipedia>IPv6</wikipedia>, mais qu'on veut pouvoir communiquer avec
les machines purement IPv4, une des techniques possibles est
d'installer un routeur NAT64 qui va faire de la traduction d'adresses
d'IPv6 vers IPv4 et retour. Les machines du réseau étant purement
IPv6, il faut qu'elles trouvent une adresse IPv6 lorsqu'elles
demandent, même si la machine avec qui elles veulent communiquer n'en
a pas. NAT64 est donc inséparable de DNS64 (<rfc num="6147"
local="true"/>) qui synthétise ces adresses IPv6 en les préfixant avec
un préfixe spécial, que le routeur NAT64 reconnaîtra (<rfc num="6052" local="true"/>). Le choix de ce
préfixe est une décision locale et les machines du réseau local
purement IPv6 ne connaissent pas ce préfixe. La plupart du temps, cela
ne les gêne pas. Elles croiront parler en IPv6 avec leur
partenaire. Mais, parfois, cela pourrait être utile. Par exemple, dans
certains protocoles (par exemple <wikipedia name="Session Initiation Protocol">SIP</wikipedia>), il y a des <emphasis>références</emphasis> :
Alice écrit à Bob en IPv6, le routeur NAT64 transmet à Bob en IPv4 et
Bob, voyant une session en IPv4, répond à Alice « envoies les paquets à l'adresse
<computer>192.0.34.19</computer> ». Le routeur NAT64 n'analyse pas les
paquets SIP et ne peut donc pas traduire cette référence. C'est donc
Alice qui doit le faire, ce qui implique de connaître le préfixe à
utiliser, pour que le routeur NAT64 sache quoi faire de ces
paquets. Le <rfc num="7051" local="false"/> faisait le tour des
possibilités existantes pour découvrir ce préfixe et le <rfc
num="7050" local="true"/> proposait une solution. Notre <rfc num="7225"/> en
suggère une autre.</p>
<p><wikipedia xml:lang="en" name="Port Control Protocol">PCP</wikipedia> (<rfc num="6887" local="true"/>) est un protocole (assez récent et encore
très peu déployé) de communication entre une machine sur un réseau
local et la <foreign><wikipedia name="Box (Internet)">box</wikipedia></foreign> qui relie ce
réseau à l'Internet. Son utilité principale est pour l'ouverture de
trous dans le <wikipedia name="Network Address Translation">NAT</wikipedia>, pour permettre, par exemple,
les connexions entrantes. Il permet la définition d'options qui
ajoutent des possibilités comme celle décrite dans ce RFC,
<computer>PREFIX64</computer>.</p>
<p>La section 3 de notre RFC décrit le cahier des charges. On veut :
<enum>
<item>distinguer les adresses IPv6 natives de celles qui ont été
synthétisées par NAT64.</item>
<item>pouvoir synthétiser des adresses IPv6 pour NAT64, à partir
d'adresses IPv4, même quand DNS64 n'est pas disponible ou utilisable.</item>
<item>permettre l'utilisation de <wikipedia name="Domain Name System Security Extensions">DNSSEC</wikipedia>.</item>
<item>gérer des cas compliqués comme la découverte du préfixe lorsque
le préfixe dépend de la destination.</item>
<item>fonctionner même s'il y a plusieurs routeurs NAT64 sur le réseau
local (avec des préfixes différents, sinon, cela ne serait pas drôle).</item>
</enum>
La section 4 du <rfc num="7051" local="false"/> contient des études de
cas plus détaillées. Par exemple, on peut souhaiter avoir <link
local="son-propre-resolveur-dns">son propre résolveur DNS</link>, sur
sa machine, et donc on doit faire la synthèse des adresses IPv6
soi-même. Cela nécessite de connaître le préfixe utilisé sur
<emphasis>ce</emphasis> réseau local. Il existe de nombreuses raisons
pour avoir un résolveur local sur sa machine mais le RFC en cite
surtout une : pouvoir faire du <wikipedia name="Domain Name System Security Extensions">DNSSEC</wikipedia>
proprement, c'est-à-dire avec <link
local="ou-valider-dnsssec">validation locale</link>. Autre cas où un
mécanisme pour apprendre le préfixe est nécessaire, celui cité plus
haut où une application transmet des références, sous forme d'une
adresse IP. Cela ne concerne pas que SIP, cité plus haut (<rfc
num="3261" local="true"/> et <rfc num="4566" local="false"/>) mais
aussi <wikipedia>WebRTC</wikipedia> (<rfc num="8825" local="true"/>),
<wikipedia name="BitTorrent (protocole)">BitTorrent</wikipedia> (lorsque le
<foreign>tracker</foreign> indique les adresses des
<foreign>leechers</foreign> et <foreign>seeders</foreign>), etc.</p>
<p>La section 4 du RFC décrit le format de la nouvelle option,
<computer>PREFIX64</computer>, de numéro 129 (cf. le <link url="https://www.iana.org/assignments/pcp-parameters/pcp-parameters.xhtml#options">registre IANA</link>). Le point important est que, pour chaque
préfixe IPv6 listé dans le champ <foreign>Prefix64</foreign>, il y a
une liste (pouvant être de taille nulle) de préfixes IPv4 pour
lesquels ce préfixe s'applique.</p>
<p>Que doit faire le serveur PCP avec cette option ? Lorsque le client
le demande (en mettant l'option <computer>PREFIX64</computer> dans sa
requête), le serveur lui répond poliment, avec le préfixe que lui,
serveur, utilisera pour les synthèses d'adresses IPv6. Le serveur a le
droit d'envoyer cette option <computer>PREFIX64</computer> même si on
ne lui a rien demandé. Il peut y avoir plusieurs occurrences de
l'option si le serveur PCP (le routeur NAT64) utilise plusieurs
préfixes.</p>
<p>Et le client ? Il peut demander explicitement le préfixe, en
utilisant l'option <computer>PREFIX64</computer> avec une valeur
spéciale pour le préfixe (<computer>::/96</computer>). Attention à ne
pas paniquer si la réponse contient plusieurs préfixes IPv6, c'est
normal. Le client ne doit pas garder en vrac les préfixes mais les
laisser associés à un serveur PCP particulier (au cas où il y en ait
plusieurs sur le réseau, ce qui est rare, mais permis).</p>
<p>Des exemples d'usage figurent dans la section 5, avec un exemple
détaillé pour le (compliqué) cas de SIP : le client SIP (le
<foreign><wikipedia>softphone</wikipedia></foreign>, qui n'a que IPv6)
va envoyer une requête PCP de type <computer>MAP</computer> avec les
options <computer>PORT_SET</computer> et
<computer>PREFIX64</computer>. Il récupère les <wikipedia name="Port
(logiciel)">ports</wikipedia> à utiliser et le préfixe, mettons
<computer>2001:db8:122::/48</computer>. Avec les informations sur son
adresse IPv4 externe, il va construire une offre
<wikipedia xml:lang="en" name="Session Description Protocol">SDP</wikipedia>, qui ne contiendra que de l'IPv4. Ensuite,
le logiciel fait une requête SIP <computer>INVITE</computer>, en IPv6,
en utilisant une adresse de destination formée à partir du préfixe et
de l'adresse IPv4 du serveur SIP. Le routeur NAT64, voyant ce préfixe,
va ensuite faire son travail (conversion en v4, transmission). Pareil
pour le message de routeur (l'acceptation de l'appel). Notez que
l'« intelligence » était presque entièrement dans le client : le
routeur NAT64 n'a pas d'<wikipedia xml:lang="en" name="Application-level gateway">ALG</wikipedia>.</p>
<p>À ma connaissance, il n'existe encore aucun client ou serveur PCP
avec cette option.</p>
</content>
</rfcdesc>
