Je suis Charlie

Autres trucs

Accueil

Seulement les RFC

Seulement les fiches de lecture

Mon livre « Cyberstructure »

Ève

Fonctionnement du client du « tunnel broker » sur Unix

Première rédaction de cet article le 31 octobre 2007
Dernière mise à jour le 25 novembre 2009


Il existe d'innombrables solutions pour connecter un ilôt de machines IPv6 au reste de l'Internet IPv6, même lorsque les fournisseurs sur le trajet sont purement IPv4. Cet article décrit le fonctionnement concret d'une de ces solutions, le tunnel broker.

Le principe du tunnel broker est le suivant : le routeur IPv6 du réseau local négocie avec un serveur de tunnels qui lui indique le préfixe délégué et d'autres caractéristiques du tunnel. Ledit routeur va ensuite encapsuler ses paquets IPv6 dans de l'IPv4 à destination dudit serveur de tunnels, qui sert également de routeur.

Le serveur n'existe apparemment pas en logiciel libre mais il y a plusieurs clients comme tspc ou gw6. Ici, le routeur IPv6 du réseau local est une Debian et se sert du logiciel tspc. Avant de configurer le client, il faut trouver un serveur, il en existe un gratuit à Freenet6 (expliqué plus loin) mais, comme le réseau étudié ici s'inscrivait dans un projet auquel Renater participe, on utilise d'abord le tunnel broker de Renater. Il faut d'abord obtenir un compte auprès de Renater (si on veut un « préfixe de site », un /48, les /64 sont, eux, sans formalité), puis installer tspc (aptitude install tspc).

La configuration se fait dans le fichier /etc/tspc.conf. Voyons les points saillants :

 
# authentication method:
# Valeur par défaut...
auth_method=any

# IPv4 address of the client for its tunnel endpoint:
# Valeur par défaut...
client_v4=auto

# user identification:
# Le compte obtenu auprès du serveur de tunnels
userid=bortzmeyer

# password:
# Non, je ne le montre pas :-)

# Name of the script:
# Valeur par défaut...
template=setup

# 'server' is the tunnel broker identifier
# C'est le serveur indiqué par Renater, réservé à leurs clients ou
# partenaires. Notez le numéro de port, un autre serveur de tunnels
# existe sur cette machine avec un port différent (selon qu'on a un
# compte ou bien qu'on bénéficie du service gratuit, lisez bien la
# documentation de votre fournisseur).
server=tunnel-broker.renater.fr:3654

# retry_delay=time
# Valeur par défaut. Testé, ce service fonctionne bien, même lorsque
# la liaison IPv4 sous-jacente est fragile.
retry_delay=30

# Tunnel encapsulation mode:
# Valeur par défaut...
tunnel_mode=v6anyv4

# Tunnel Interface name:
# Valeur par défaut...
if_tunnel_v6v4=sit1
if_tunnel_v6udpv4=tun

# proxy_client indicates that this client acts as a TSP proxy for
# Valeur par défaut...
proxy_client=no

# Keepalive for v6udpv4 tunnels:
# Valeur par défaut...
keepalive=yes
keepalive_interval=30

# Logging facility uses syslog on Unix platforms
# Ne semble pas fonctionner, tout est apparemment enregistré dans /var/log/tspc.log
syslog_facility=DAEMON
syslog_level=ERR

# Router configuration
# On est routeur pour tout le réseau local, donc :
host_type=router

# prefixlen specifies the required prefix length for the TSP client 
# Pour un routeur, c'est la valeur normale (cf. RFC 3177)
prefixlen=48

# if_prefix is the name of the OS interface that will be configured
#  with the first /64 of the received prefix from the broker and the
#  router advertisement daemon is started to advertise that prefix
#  on the if_prefix interface.
#if_prefix=eth0
if_prefix=dummy0
# Une mention particulière ici. Contrairement à ce qu'on pourrait
# croire, cette mention est obligatoire. Comme nous préférions
# configurer à la main un certain nombre de paramètres, nous indiquons
# quand même une interface, mais "bidon", pour éviter que tspc ne
# modifie les réglages de notre vraie interface, eth0. L'interface
# "bidon" se crée sur Linux avec "modprobe dummy; ifconfig dummy0 up".

# For reverse DNS delegation of the prefix, define the following:
# Pas utilisé.
#dns_server=

Une fois le client lancé (c'est fait automatiquement au démarrage, sinon /etc/init.d/tspc start), on peut voir les interfaces, dummy0 a été configuré par tspc, à partir des informations données par le serveur de tunnels, eth0 a été configurée à la main (via le fichier standard Debian, /etc/network/interfaces) :

dummy0    Lien encap:Ethernet  HWaddr 32:A5:E1:71:37:A3  
          adr inet6: 2001:660:f108::1/64 Scope:Global
          adr inet6: fe80::30a5:e1ff:fe71:37a3/64 Scope:Lien
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
          ...

eth0      Lien encap:Ethernet  HWaddr 00:0C:6E:6E:E5:D4  
          inet adr:82.151.64.129  Bcast:82.151.64.255  Masque:255.255.255.128
          adr inet6: 2001:660:f108:1::1/64 Scope:Global
          adr inet6: fe80::20c:6eff:fe6e:e5d4/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          ...

sit1      Lien encap:IPv6-dans-IPv4  
          adr inet6: fe80::5297:4081/64 Scope:Lien
          adr inet6: 2001:660:f001:1::d/128 Scope:Global
          UP POINTOPOINT RUNNING NOARP  MTU:1280  Metric:1
          RX packets:1548 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1748 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0 
          RX bytes:520111 (507.9 KiB)  TX bytes:312956 (305.6 KiB)

(L'adresse IPv6 est envoyée par le serveur de tunnels et, avec le service Freenet6, peut changer de temps en temps.) Et le routage IPv6 se passe bien, aussi bien pour le routeur, que pour les autres machines du réseau local (testé avec des adresses IPv6 statiques mais on aurait pu utiliser RA, Router Advertisement).

Le protocole utilisé entre client et serveur de tunnels a fait l'objet d'une normalisation dans le RFC 5572. Le principe est simple : le client envoie ses demandes en XML et le serveur lui renvoie dans le même format les paramètres choisis (il n'y a pas de négociation, c'est à prendre ou à laisser). Voici un exemple de sessions :


# /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>
...

Et si cela ne marche pas ? Le client affiche le code d'erreur numérique à trois chiffres et il n'y a plus qu'à regarder dans le document cité plus haut ce qu'ils signifient. Par exemple, 303 est Unsupported tunnel type et se produit lorsqu'on demande à un tunnel broker un service qu'il ne fournit pas.

Pour Freenet6, on va utiliser une machine Gentoo hébergée aux États-Unis (le routeur de la société mère de Freenet6, Hexago, est au Canada). Sur une Gentoo, il n'y a pas de paquetage tspc tout fait, il faut compiler le client. On obtient le source en s'inscrivant sur http://www.go6.net/4105/freenet.asp. Attention, c'est gratuit mais il faut remplir un formulaire où les cases « Je veux recevoir du spam » sont cochées par défaut. Ne pas oublier de les décocher ! Une fois obtenu le source, l'installation (tel que documentée dans le fichier joint, HEX_DC_0005_Gateway6_Client_Guide.pdf) est simple :

% cd tspc-advanced
% make all target=linux
root# make install installdir=/usr/local/gw6c  target=linux

On doit alors configurer le fichier gw6c.conf. Les points saillants sont :

# Obtenus en s'inscrivant
userid=bortzmeyer
passwd=SECRET
...
server=broker.freenet6.net
...
auth_method=any
...
# Il est possible qu'on puisse obtenir un /48 mais je n'ai pas essayé
prefixlen=64
...
# La délégation DNS ne fonctionne pas pour moi. Peut-être n'est-elle
# accessible que si on a au moins un /48 ou bien que si on est un
# client payant ?
dns_server=ns1.bortzmeyer.org:ns2.bortzmeyer.org

Les tunnels sont souvent plus lents que le chemin direct (davantage de routeurs, des passerelles entre v4 et v6 surchargées), moins fiables, sans compter les problèmes de MTU. On va donc demander à privilégier l'accès IPv4, ce qui se fait à l'aide du fichier /etc/gai.conf :

# For testing purposes, always use IPv6 for AFNIC    
precedence 2001:660:3003::/48 200
# Otherwise, always prefer IPv4                              
precedence ::ffff:0:0/96  100

Ces règles disent que les adresses IPv6 doivent être privilégiées pour l'accès à l'AFNIC (préférence 200) mais, dans tous les autres cas, on préfère IPv4 (préférence inférieure, 100). Testons avec telnet :

% telnet www.afnic.fr
Trying 2001:660:3003:2::4:20...
Trying 192.134.4.20...
...
% telnet www.kame.net
Trying 203.178.141.194...
Trying 2001:200:0:8002:203:47ff:fea5:3085...

Pour ces deux machines double-pile (v4 et v6), on obtient bien l'ordre attendu.

Pour s'assurer que le démon tspc soit bien lancé au démarrage, on crée un fichier /etc/init.d/freenet6 :


#!/sbin/runscript

opts="start stop check"

depend() {
        use net
}

start() {
        ebegin "Starting IPv6 connection through Freenet6"
        (
             modprobe ipv6
             /usr/local/gw6c/bin/gw6c -f /usr/local/gw6c/etc/gw6c.conf
        )
        eend $?
}

stop() {
        ebegin "Stopping IPv6 connection"
        start-stop-daemon --stop --quiet --exec /usr/local/gw6c/bin/gw6c
        eend $?
}

check(){
        ebegin "Performing Consistency Check"
        killall -IOT gw6c &>/dev/null
        eend $?
}

et on l'installe avec :

# rc-update add freenet6 default

Merci à Simon Muyal pour ses explications et à Mohsen Souissi pour l'aide.

Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)

Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)