Linux et IPv6

Abstarct

Cet article assez technique présente les étapes nécessaires à la configuration du protocole IPv6 sur votre machine. Ceci passe par la recompilation du noyau, la compilation de nombreux programme pour terminer par la configuration du réseau.
 
 

Introduction

Cet article fait référence à de nombreux outils : ils sont disponibles sur le CD, ainsi que l'indispensable IPv6-HOWTO de Peter Bieringer (http://www.bieringer.de/linux/IPv6/) dont cet article cherche à préciser certains points.
Un certain nombre de pré-requis mais nous ne pourront pas les détaillér ici :

Aspects logiciels

Nous détaillerons ici les outils "classiques" contenus dans chaque distribution. Ceux-ci sont, la plupart du temps, déjà installés et configurés ... mais pas toujours comme il convient pour IPv6. De plus, il est souvent recommandé d'utiliser les dernières versions des outils qui corrigent ainsi les erreurs des versions antérieures.

Afin d'éviter les manoeuvres malheureuses aux conséquences tragiques, les auteurs recommandent aux lecteurs d'entreprendre les manipulations décrites ci-dessous seulement s'ils comprennent réellement ce qu'ils font. Toutefois, nous conseillerons tout au long de l'article quelques mesures pour éviter que l'installation d'IPv6 n'empiète pas trop sur votre configuration. conserver dans l'état où se trouvait votre système avant l'installation IPv6.

Le noyau

Avant tout, rappelons que l'utilisation des noyaux 2.2.14 est fortement déconseillée car ils contiennent une faille majeure de sécurité qui permet de passer root. L'utilisation d'un noyau 2.2.16 semble la plus avisée.

Il sera souvent nécessaire de recompiler le noyau car ceux des grandes distributions supportent rarement IPv6. Le Kernel-HOWTO décrit très clairement les précautions à prendre lors de la compilation d'un noyau. Si vous n'avez jamais entrepris ceci, la lecture en est chaudement recommandée.

Si vous avez compilé votre noyau, le fichier de configuration est sauvegardé dans /usr/src/linux-x.y.z/.config. N'oubliez pas de sauvegarder ce fichier avant de vous lancer dans une nouvelle compilation pour IPv6.
Si vous utilisez le noyau initial fournit avec votre distribution, le répertoire /usr/src/linux-x.y.z contient certainement un fichier résumant la configuration utilisée pour la compilation. Par exemple, sur les Red Hat, il se situe dans le sous-répertoire config.

Avec un noyau 2.2.16, il est nécessaire d'autoriser le code expérimental (CONFIG_EXPERIMENTAL) pour accéder aux 3 options à activer concernant IPv6 :

Il faut également autoriser les options qui concerne le tunnelage. Il n'existe pas de réseau public accessible en IPv6. Ce protocole va donc être encapsulé dans des paquets IPv4.

Le Makefile du noyau comporte un champs EXTRAVERSION. Comme nous préparons un noyau spécial pour IPv6, nous pouvons y ajouter "-ipv6". Une fois la compilation effectuée (noyau et modules), il reste à installer le nouveau noyau :

cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.2.x-ipv6
Nous installons les modules (make modules_install) et nous créons une image :
mkinitrd /boot/initrd-2.2.x-ipv6.img 2.2.x-ipv6
Il ne reste alors plus qu'à configurer lilo (ou tout autre système de boot). Là encore, la prudence est de mise. Ne pas retirer de votre fichier de configuration votre noyau actuel qui fonctionne : si vous avez oublié quelques options essentielles, votre nouveau noyau risquerait ne pas booter.

Si votre ordinateur reboote correctement une première étape aura été franchie avec succès :)

Il est également possible de compiler le support d'IPv6 en tant que module (ipv6.o). Dans ce cas, vous devez ajouter à votre fichier /etc/conf.modules la ligne :

alias net-pf-10 ipv6
Il reste à charger le module si ce n'est pas déjà fait.  L'ensemble d'utilitaires de modutils permet la manipulation des modules en adressant des requêtes directement au noyau : Pour vérifier la présence du module ipv6, la commande lsmod convient parfaitement :
>> /sbin/lsmod
Module                  Size  Used by
ipv6                  106632  -1
Ici, le module est donc installé. Si ce n'est pas le cas, la commande /sbin/modprobe permet de le charger dynamiquement.

Les applications


Si le noyau Linux supporte IPv6, il faut également fournir les outils nécessaires tant à la configuration du protocole qu'à son utilisation. Les outils distribués habituellement sont prévus pour IPv4. Nous devrons donc recompiler plusieurs programmes pour assurer la compatibilité avec IPv6.

Les outils et applications décrits ci-dessous existent aussi bien en version IPv4 qu'IPv6. Comme nous allons compiler ceux pour IPv6, nous devons éviter qu'ils prennent le pas sur ceux pour IPv4. Tous les Makefile devront donc être modifiés pour installer ces outils ailleurs qu'à leur place par défaut (par exemple, /usr/local/IPv6 ou /opt/IPv6 - ce qui sera le cas dans la suite de l'article).
 

Outils de configuration : les net-tools

Les net-tools sont constitués d'outils pour la configuration d'un réseau :


Ils sont disponibles à l'adresse http://www.tazenda.demon.co.uk/phil/net-tools/.

La plupart des distributions Linux les installent, mais ne supportent pas toujours IPv6. Lors de la configuration (make clean; make config), la sélection de certaines options assure le support d'IPv6 :


Attention : les net-tools (net-tools-1.54 de la Red Hat 6.2 supportent déjà IPv6).
Pour savoir si les vôtres le supportent, vous pouvez, par exemple, exécuter la commande netstat :

>>netstat -V
net-tools 1.54
netstat 1.38 (1999-04-20)
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N
AF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +ATALK +ECONET +ROSE
HW:  +ETHER +ARC +SLIP +PPP +TUNNEL +TR +AX25 +NETROM +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB


Le +INET6 confirme le support d'IPv6 par le package.

Vous pouvez aussi utiliser la commande /sbin/ifconfig. Elle permet de connaître les paramètres des interfaces. Si le noyau a bien été compilé avec le support pour IPv6, il doit y avoir une ligne commançant par inet6 pour chaque interface active :

eth0 : Link encap:Ethernet  HWaddr 52:54:05:FD:CC:20
       inet6 addr: fe80::5054:5ff:fefd:cc20/10 Scope:Link
lo : inet6 addr: ::1/128 Scope:Host


Quelques remarques sur les résultats obtenus :

Applications IPv6

Il existe déjà de nombreuses applications utilisables avec IPv6. Nous ne détaillerons ici que très sommairement celles-ci car elles restent très similaires à celles en IPv4. Nous préciserons seulement les modifications nécessaires à leur bon fonctionnement en IPv6 : Pour en savoir plus sur tous ces outils et de nombreux autres, le IPv6-HOWTO constitue une lecture obligatoire. Il en détaille l'installation pas à pas et la configuration.
 

Configuration d'IPv6

Pour l'instant, IPv6 ne fonctionne toujours pas ... mais toutes les pièces sont maintenant en place. Il ne reste plus qu'à configurer le réseau pour qu'il fonctionne avec IPv6.

Sous Linux, la configuration du réseau se décompose en 3 étapes :

  1. configuration de l'interface
  2. configuration des paramètres du réseau
  3. démarrage des démons liés au réseau
Tout d'abord, afin de pouvoir faire quelques tests rapidement, commençons par faciliter la vie de notre machine. Celle-ci ne sait pas encore résoudre les noms en adresses IPv6. Nous allons donc donner quelques renseignements dans le fichier /etc/hosts :
#Ajouter dans /etc/hosts pour IPv6
::1     ip6-localhost ip6-loopback #adresse de bouclage
fe00::0 ip6-localnet #réseau local IPv6
ff00::0 ip6-mcastprefix #préfixe commun à toutes les adresses IPv6 multicast sur un lien
ff02::1 ip6-allnodes #adresse du groupe multicast "tous les équipements" du lien local IPv6 (équivalent en IPv4 de 224.0.0.1)
ff02::2 ip6-allrouters #adresse du groupe multicast "tous les routeurs" du lien local IPv6 (équivalent en IPv4 de 224.0.0.2)
#ff02::3 ip6-allhosts #Cette adresse est définie dans le IPv6-HOWTO ... mais la RFC2375 la désigne "unassigned"
Le fichier /etc/protocols décrit les protocoles supportés par la machine. Il permet de convertir le nom du protocole en son numéro (par exemple, 6 pour tcp, 17 pour udp, ...) :
#Ajouter dans /etc/protocols pour IPv6
ipv6       41 IPv6       # IPv6
ipv6-route 43 IPv6-Route # Routing Header for IPv6
ipv6-frag  44 IPv6-Frag  # Fragment Header for IPv6
ipv6-crypt 50 IPv6-Crypt # Encryption Header for IPv6
ipv6-auth  51 IPv6-Auth  # Authentication Header for IPv6
ipv6-icmp  58 IPv6-ICMP  icmpv6 icmp6   # ICMP for IPv6
ipv6-nonxt 59 IPv6-NoNxt # No Next Header for IPv6
ipv6-opts  60 IPv6-Opts  # Destination Options for IPv6
Remarquez à la ligne ipv6-icmp l'ajout indispensable des alias icmpv6 et icmp6. Ils ne sont pas toujours présents alors que le protocole l'est. Sans eux, point de ping6 :(

Si vous utilisez un serveur NIS, protocoles est une des maps possibles. Si votre machine n'est pas le serveur NIS, les changements que vous venez de faire n'auront d'effet que si vous définissez dans votre /etc/nsswitch.conf une recherche d'abord locale (attribut file) et ensuite seulement par les yellow pages (nis ou nisplus).

Enfin, il faut modifier le fichier /etc/xinetd.conf pour qu'il utilise les serveurs compatibles avec IPv6 décrits dans la section précédente. Par exemple, voici la section sur telnet :

service telnet
{
 flags       = REUSE NAMEINARGS
 socket_type = stream
 protocol    = tcp
 wait        = no
 user        = root
 server      = /opt/IPv6/sbin/in.telnetd6
 server_args = -h
}
Ensuite, il ne reste qu'à établir une connexion :
 >>./telnet6 ::1
Trying ::1...
Connected to ::1.
Escape character is '^]'.
login:
Le serveur en attente se voit par netstat :
>>netstat -A inet6 -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:telnet                *:*                     LISTEN
raw        0      0 *:ipv6-icmp             *:*                     7
raw        0      0 *:ipv6-icmp             *:*                     7
raw        0      0 *:ipv6-icmp             *:*                     7


Maintenant que les fichiers de configuration générale sont en place, il faut encore modifier les scripts qui initalisent le réseau pour IPv6. Peter Bieringer, auteur du IPv6-HOWTO, propose un ensemble de scripts pour ceci. Ils fonctionnent très bien avec une distribution Red Hat, mais devraient être facilement adaptables, selon lui, à toute distribution compatible système V.

Le principe consiste à modifier au minimum les fichiers existants et de rajouter des fichiers spécifiques pour IPv6.

Le fichier /etc/sysconfig/network contient les paramètres du réseau tels le gateway ou le hostname. C'est également ce fichier qui est lu pour déterminer si le réseau doit être activé ou non : c'est donc l'endroit idéal pour signaler qu'on va utiliser IPv6. Il suffit d'y ajouter la ligne :

NETWORKING_IPV6=yes
Le programme ifup active une interface. Les lignes suivantes activent la configuration d'IPv6 :
# IPv6 initialisation?
if [ "${NETWORKING_IPV6}" = "yes" ]; then
       /etc/sysconfig/network-scripts/ifup-ipv6 $DEVICE
Comme vous pouvez le constater, il existe également un fichier dédié à l'initialisation d'IPv6 pour une interface : ifup-ipv6. Ce script construit les adresses IPv6 à l'interface, charge les tables de routages statiques d'IPv6 (définies dans le fichier static-routes-ipv6) et initialise éventuellement le(s) tunnel(s) nécessaire(s) à une communication avec l'extérieur (voir section "Le monde en IPv6").

Voici une brève description de l'ensemble des scripts fournis avec le IPv6-HOWTO :

Le monde en IPv6

Il existe assez peu de réseau totalement en IPv6 et la plupart fonctionnent dans des laboratoires de recherches. En revanche, le tunnelage (l'encapsulation) d'IPv6 dans IPv4 se pratique assez couramment.

Le principe d'un tunnel est de relier 2 points en utilisant un protocole donné. Expliquer le fonctionnement d'un tunnel serait trop, toutefois le principe général est assez simple. Prenons comme exemple le cas qui nous intéresse : IPv6. L'émetteur prépare son paquet IPv6 mais, il ne peut l'envoyer via Internet car les routeurs  ne savent pas quoi en faire. Il y accole alors une entête IPv4. Le paquet IPv6 prend la place  des données, sans signification particulière,  du paquet IPv4. Ce paquet IPv4 est acheminé jusqu'à son destinataire (bout du tunnel). Celui-ci retire l'en-tête IPv4, constate que les données sont de type IPv6.  A partir de ce moment-là, le paquet IPv6 suit son chemin jusqu'à sa destination.

Plusieurs accès permettent d'obtenir ainsi une adresse globale et de créer un tunnel entre votre machine et un réseau IPv6 :


Frederic.Raynal@inria.fr
Mohsen.Souissi@inria.fr
Last modified: Thu Aug 31 16:11:00 CEST 2000