<?xml version="1.0" encoding="utf-8"?>
<rfcdesc title="IPv6 Tunnel Broker with the Tunnel Setup Protocol (TSP)" num="5572" status="experimental">
<rfcdate><month>February</month><year>2010</year></rfcdate>
<authors><author>M. Blanchet (Viagenie)</author><author>F. Parent (Beon Solutions)</author></authors>
<date>2010-02-19</date>
<content>
<p>Le protocole <wikipedia>IPv6</wikipedia> étant très loin d'une
connectivité complète dans l'<wikipedia>Internet</wikipedia>
d'aujourd'hui (un très grand nombre d'opérateurs et de fournisseurs
d'accès ne sont toujours pas capables de router de l'IPv6, malgré
l'<link local="epuisement-adresses-ipv4">épuisement prochain des
adresses IPv4</link>), il faut souvent passer par des
<wikipedia name="Tunnel (réseau informatique)">tunnels</wikipedia> pour pouvoir faire de l'IPv6. Ces
tunnels peuvent être configurés <link
local="ipv6-he">manuellement</link> mais il peut être plus pratique de
disposer d'un protocole qui permet aux serveurs de tunnels d'indiquer
aux clients les paramètres de la connexion (comme avec
<wikipedia name="Protocole point à point">PPP</wikipedia> ou <wikipedia name="Dynamic Host Configuration Protocol">DHCP</wikipedia>). Cela
permet d'avoir des paramètres dynamiques (la section 3 liste les
avantages de TSP). C'est un tel protocole que
normalise ce RFC. (L'idée de base avait été présentée dans le <rfc num="3053"/>.)</p>
<p><wikipedia xml:lang="en" name="Tunnel Setup Protocol">TSP</wikipedia> (<foreign>Tunnel Setup
Protocol</foreign>) permet donc à un <emphasis>client</emphasis> de
demander un tunnel à un <emphasis>serveur</emphasis> et celui-ci, s'il
est d'accord, va répondre avec les paramètres du tunnel, comme
l'<wikipedia>adresse IP</wikipedia>.</p>
<p>Comme résumé dans la section 2 de notre RFC, TSP fonctionne au
dessus de <wikipedia name="Extensible Markup Language">XML</wikipedia>, lui-même au dessus de
<wikipedia name="Transmission Control Protocol">TCP</wikipedia> ou <wikipedia name="User Datagram Protocol">UDP</wikipedia>. Les
paramètres qu'on peut négocier entre le client et le serveur sont, par
exemple :
<enum>
<item>l'<wikipedia>authentification</wikipedia> (certains serveurs
peuvent accepter des accès anonymes mais pas tous),</item>
<item>l'<wikipedia name="Encapsulation (réseau)">encapsulation</wikipedia>, TSP permet de faire un
tunnel <wikipedia>IPv6</wikipedia>-dans-<wikipedia>IPv4</wikipedia>,
le cas le plus courant (<rfc num="4213" local="true"/>),
mais aussi IPv4-dans-IPv6 et même IPv6-dans-UDP-dans-IPv4 pour pouvoir
contourner les <wikipedia name="Network address translation">NAT</wikipedia> (et leur présence peut être
détectée automatiquement, cf. section 2.1).</item>
<item>les adresses IP utilisées,</item>
<item>les serveurs <wikipedia name="Domain Name System">DNS</wikipedia>, aussi bien le résolveur
à utiliser que les serveurs faisant autorité pour
<computer>ip6.arpa</computer>, pour le préfixe délégué par le tunnel.</item>
</enum></p>
<p>En toute rigueur, TSP n'implique pas que le serveur TSP soit
également l'extrémité du tunnel. C'est le mode le plus simple (figure
2 dans le RFC) mais le serveur TSP peut être aussi un
<emphasis>courtier</emphasis> (<foreign>broker</foreign>), négociant
des paramètres pour le compte du serveur de tunnels (figure 1 dans le
RFC et section 4.1 sur la terminologie). Le protocole de signalisation
(pour se connecter au courtier) n'est pas forcément le même que le
protocole du tunnel.</p>
<p>Le protocole complet est décrit dans la section 4. Le protocole est
fort simple, le client TSP se connecte, s'authentifie, envoie sa
demande et obtient une réponse. La demande est codée en XML, la
réponse est précédée d'un code à trois chiffres résumant le succès ou
l'échec (voir annexe B pour une liste de ces codes numériques ).</p>
<p>Le client choisit de se connecter au dessus d'un des protocoles
indiqués dans la section 4.4.1. Comme les autres exemples ultérieurs,
l'exemple ici est pris sur le fichier de configuration du client TSP gw6 (qu'on obtient en <link url="http://www.go6.net/4105/freenet.asp">s'inscrivant à leur service</link>) pour
<wikipedia>Linux</wikipedia>. Si on trouve dans <computer>gw6c.conf</computer> :
<code>
tunnel_mode=v6v4
</code>
cela indique que le client va se connecter au serveur en <wikipedia name="Transmission Control Protocol">TCP</wikipedia> (<wikipedia name="Port (logiciel)">port</wikipedia> 3653) avec le
protocole IPv4, pour créer un tunnel IPv6. (La liste de toutes les méthodes
figure dans le <link url="https://www.iana.org/assignments/tunnel-setup-protocol/tunnel-setup-protocol.xhtml">registre IANA</link>, décrit en
section 7).</p>
<p>L'<wikipedia>authentification</wikipedia> figure en section
4.4.2. Elle utilise <wikipedia name="Simple Authentication and Security Layer">SASL</wikipedia>. Elle se configure, par exemple, ainsi :
<code>
userid=mapetiteentreprise
passwd=monsupermotdepasse
</code>
</p>
<p>Quant à la demande et à la réponse, elles sont décrites en section
4.4.3. Voici un exemple, vu dans le <wikipedia name="Historique (informatique)">journal</wikipedia> du client gw6 :
<code>
<![CDATA[
2009/07/20 08:43:04 I gw6c: Sent:
2009/07/20 08:43:04 I gw6c: Content-length: 217<tunnel action="create" type="v6anyv4" proxy="no"> 
     <client>  <address type="ipv4">208.75.84.80</address>  <keepalive interval="30">    
             <address type="ipv6">::</address>  </keepalive> </client></tunnel>
2009/07/20 08:43:04 I gw6c: Received:
2009/07/20 08:43:04 I gw6c: 200 Success<tunnel action="info" type="v6v4" lifetime="604800">  
       <server>    <address type="ipv4">64.86.88.116</address>    
                   <address type="ipv6">2001:05c0:1000:000b:0000:0000:0000:0218</address>  </server>
       <client>    <address type="ipv4">208.75.84.80</address>    
                   <address type="ipv6">2001:05c0:1000:000b:0000:0000:0000:0219</address>    
                   <address type="dn">bortzmeyer.broker.freenet6.net</address>    
                 <keepalive interval="30">      
                 <address type="ipv6">2001:05c0:1000:000b:0000:0000:0000:0218</address>    
                 </keepalive>  </client>
      </tunnel>
]]>
</code></p>
<p>Une fois que la demande est acceptée, le tunnel est typiquement
configuré automatiquement par le logiciel client (section 4.5), qui se charge
d'exécuter les <computer><unix>ifconfig</unix></computer>
appropriés. On voit alors son tunnel, ici en <computer>2001:5c0:1000:b::219</computer> :
<code>
sit1      Link encap:IPv6-in-IPv4  
          inet6 addr: fe80::d04b:5450/64 Scope:Link
          inet6 addr: 2001:5c0:1000:b::219/128 Scope:Global
          UP POINTOPOINT RUNNING NOARP  MTU:1280  Metric:1
          RX packets:5069 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5015 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:4526230 (4.3 MiB)  TX bytes:487854 (476.4 KiB)
</code></p>
<p>Les éléments <wikipedia name="Extensible Markup Language">XML</wikipedia> échangés sont décrits dans
la section 4.7 (et la <wikipedia name="Document Type Definition">DTD</wikipedia> complète en annexe
A). Par exemple, l'élément <computer>&lt;server&gt;</computer>
(section 4.7.3) contient deux éléments,
<computer>&lt;address&gt;</computer> et
<computer>&lt;router&gt;</computer>, qui indiquent les
caractéristiques IP de l'extrémité du tunnel.</p>
<p>Plusieurs exemples de requêtes TSP figurent dans la section 5. Avec tspc, on peut aussi les obtenir en utilisant l'option <computer>-vvv</computer> :
<code>
<![CDATA[
# /usr/sbin/tspc -vvvvv
Connecting to server with tcp
Using TSP protocol version 2.0.0
Establishing connection with tunnel broker...
Getting capabilities from server
Connection established
Authenticating bortzmeyer
Using authentification mecanism DIGEST-MD5
Authentication success
Asking for a tunnel
sent: Content-length: 252
<tunnel action="create" type="v6v4" proxy="no">
 <client>
  <address type="ipv4">192.134.7.249</address>
<keepalive interval="30"><address type="ipv6">::</address></keepalive <router>
   <prefix length="48"/>
  </router>
 </client>
</tunnel>
...
]]>
</code>
</p>
<p>Et, sur le câble, voici à quoi ressemblent les paquets : <link url="http://www.pcapr.net/view/fropert/2010/4/4/4/tsp-freenet6.pcap.html"/>.</p>
<p>Aujourd'hui, il existe deux implémentations libre du client, gw6c,
déjà cité et <link
url="http://packages.debian.org/stable/tspc">tspc</link>. Des exemples
plus concrets de configuration peuvent être trouvés dans <link
local="tunnel-broker">mon article sur les serveurs de
tunnel</link>.</p>
</content>
</rfcdesc>