|
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 :
- savoir
compiler un noyau ;
- savoir
ce qu'est un Makefile ;
- savoir
configurer un réseau sous IPv4 (adressage, routage, configuration
des démons, etc.) ;
- avoir
de bonnes notions théoriques sur IPv6 ... mais l'article précédent
a dû y pourvoir ;-)
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 :
- 'The
IPv6 protocol (EXPERIMENTAL)' CONFIG_IPV6
- 'IPv6:
enable EUI-64 token format' CONFIG_IPV6_EUI64
- 'IPv6:
disable provider based addresses' CONFIG_IPV6_NO_PB
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 :
- insmod
: installation d'un module
- rmmod
: retire un module du noyau
- lsmod
: liste les modules
- modinfo
: fournit des informations sur un module
- etc
...
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 :
- hostname
: permet d'allouer son nom à une machine ;
- netstat
: affiche des informations sur le réseau (table de routage,
statistiques sur les interfaces, masquarading, ...) ;
- arp
(Address Resolution Protocol) : cette commande permet de manipuler
la table ARP (cache d'entrée ARP) ;
- ifconfig
: outil permettant de configurer une interface réseau ;
- rarp
(Reverse ARP) : effectue le travail inverse de arp ;
- route
: permet de manipuler les tables de routage.
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
:
- dans
la section "Protocol Families", 3 options sont obligatoires
:
- UNIX
protocol family
- INET
(TCP/IP) protocol family
- INET6
(IPv6) protocol family
- dans
la section "Device hardware types", il faut sélectionner
"SIT (IPv6-inIPv4) support". En effet, pour l'instant,
la plupart des connexions inter-sites en IPv6 sont réalisées
au travers d'un tunnel IPv4 : les paquets IPv6 sont encapusulés
dans des paquets IPv4 par l'émetteur. Pour chaque paquet IPv4,
le récepteur retire l'en-tête IPv4 et récupère, dans le champs
data, le paquet IPv6 qui est alors traité comme tel.
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 :
- dans
la présentation du plan d'adressage, nous avons vu que l'adresse
lien-local résultait de la concaténation de fe80::/64 avec
l'indentificateur d'interface (Fig.
6). Cet identificateur est construit à partir de l'adresse
MAC, dont les 24 premiers bits désignent le constructeur et
les 24 derniers l'interface elle-même. Les 24 premiers bits
(5054:05) proviennent de la partie constructeur de l'adresse
MAC (à un bit près, ce qui explique que les valeurs ne sont
pas exactement les mêmes). Ensuite, ajoutons les 16 bits de
FFFE puis les 24 derniers bits de l'adresse MAC (FD:CC:20) ;
- l'adresse
est notée en /10 mais elle pourrait être notée en /64 puisque
les 64 premiers bits sont fixés de manière identique pour
toutes les adresses lien-local alors que les 64 derniers bits
dépendent de l'interface ;
- une
interface peut avoir plusieurs adresses IPv6. Ici, l'interface
eth0 ne dispose que de l'adresse lien-local, mais lors du
chargement du module ipv6 (ou au boot si vous avez compilé
IPv6 'en dur' dans le noyau), l'autoconfiguration permet d'obtenir
une ou plusieurs autres adresses IPv6 globales.
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
:
- xinetd
(http://synack.net/xinetd/)
: ce "super-démon" remplace inetd (il fera l'objet
d'un prochain article car il est bien plus paramétrable et
sécurisé qu'inetd). Pour qu'il supporte IPv6, il faut exécuter
le configure avec l'option --with-inet6. Parmi les outils
fournis avec xinetd, itox et xconv.pl permettent de
convertir votre fichier de configuration /etc/inetd.conf en
un fichier de configuration adapté ;
- utilitaires
IP (ftp://ftp.inr.ac.ru/ip-routing/)
: une série d'utilitaires compatibles avec IPv6 : ping, traceroute,
... La Red Hat 6.2 contient déjà iputils-20000121, compatible
avec IPv6 ;
- netkit
(ftp://ftp.suse.com/pub/people/kukuk/ipv6/)
: fournit plusieurs outils adaptés pour IPv6 : ping, ping6,
inetd, finger, fingerd, telnet, telnetd. Les binaires générés
portent le même nom que ceux qui existent déjà par défaut
: prenez garde à ne pas les écraser ! Signalons un problème
de compilation pour telnetd (mauvais chemin d'un include,
il suffit de trouver la position du fichier (termcap.h) et
de la mettre en dur dans le fichier )
- ftpd-BSD
(http://www.eleves.ens.fr:8080/home/madore/programs/#prog_ftpd-BSD)
: un serveur FTP supportant IPv6 ;
- lukemftp
(ftp://ftp.netbsd.org/pub/NetBSD/misc/lukemftp/)
: un client FTP. Pensez à renommer en ftp6 le client avant
de l'installer dans /usr/local/bin/ pour éviter la confusion
avec le client ftp pour IPv4 ;
- tcpdump
et libpcap (http://www.tcpdump.org/)
: outils bien connus. Les 2 se compilent en spécifiant l'option
--enable-ipv6 pour le configure. A noter que le binaire de
la Red Hat supporte déjà IPv6 (version 3.4-19).
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 :
- configuration
de l'interface
- configuration
des paramètres du réseau
- 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 :
- Fichiers
existants modifiés :
- /etc/sysconfig/network-scripts/ifcfg-eth0
: fichier de configuration de l'interface eth0 ;
- /etc/sysconfig/network
: fichiers contenant les paramètres du réseau ;
- /etc/sysconfig/network-scripts/ifup
: programme d'activation d'une interface ;
- /etc/sysconfig/network-scripts/ifdown
: désactivation d'une interface.
- Fichiers
spécifiques à IPv6 :
- /etc/sysconfig/network-scripts/ifcfg-sit{1,2}
: paramètres de configuration de tunnel(s) ;
- /etc/sysconfig/network-scripts/ifup-ipv6
: programme d'activation d'une interface pour
IPv6, appelé par ifup ;
- /etc/sysconfig/network-scripts/ifdown-ipv6
: désactivation d'une interface pour IPv6, appelé
par ifdown ;
- /etc/sysconfig/network-scripts/network-functions-ipv6
: ensemble de fonctions qui gère réellement les paramètres
fournis par les autres fichiers et programmes (réelle
initialisation des interfaces, ajout ou effacement de
routes, ...)
- /etc/sysconfig/network-scripts/
- /etc/sysconfig/network-scripts/
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 :
- freenet6
(http://www.freenet6.net/) :
ce site permet de créer un tunnel par l'intermédiaire d'une
interface web. Il ne fournit qu'une adresse à l'autre extrémité
du tunnel, mais cela suffit pour tester sa configuration,
ses serveurs et utilitaires avant de rejoindre le 6bone. Signalons
également que ce serveur propose de jouer à Quake en Ipv6
(non testé) ;
- IPv6
tunnel broker (http://carmen.cselt.it/ipv6/) :
ce site, sécurisé, est réservés aux utilisateurs inscrits.
Il propose de se connecter au 6bone via son réseau IPv6. Pour
ce faire, il vous aide à construire dynamiquement un tunnel
entre votre machine hôte ou routeur et l'un de ses serveurs
(tunnel) ;
- 6bone
(http://www.6bone.net/6bone_hookup.html) :
ce site décrit de manière plus générale les procédures à suivre
pour connecter un site entier au 6bone, le réseau IPv6 mondial
(expérimental).
Frederic.Raynal@inria.fr
Mohsen.Souissi@inria.fr
Last modified: Thu Aug 31 16:11:00 CEST 2000
|
|