Janvier 2015 Archives

vendredi 2 janvier 2015, 18:18:32 (UTC+0100)

Raspbian & IPv6

Voilà maintenant plus d'un an que j'utilise un système Raspberry Pi comme routeur IPv6 entre le réseau local domestique et l'Internet via un tunnel SixXS. Je suis vraiment satisfait de cette solution qui permet d'agréger les services d'une «box» opérateur à moindre coût en plus de la fonction de routage. De mon point de vue, l'utilisation du système d'exploitation Raspbian s'imposait naturellement.

En configurant une nouvelle carte Raspberry Pi B+, j'ai redécouvert le fait que le protocole IPv6 n'est pas activé par défaut sur le système. C'est vraiment dommage dans un contexte où l'objet «Raspberry Pi B+» doit être nécessairement raccordé à l'Internet. En effet, il est particulièrement intéressant de pouvoir accéder via SSH à la carte sans avoir enregistré quoi que ce soit dans les services DHCP et DNS. L'autoconfiguration IPv6 prend tout son sens dans ce contexte.

Étape 1 : activer IPv6

Sur un système Raspbian fraichement installé, le support du protocole IPv6 n'est pas activé. Il apparaît que le protocole a été compilé sous forme de module dans le noyau de la distribution. La première manipulation à faire consiste donc à activer le chargement du module.

Les options de chargement des modules sont contrôlées via les fichiers placés dans le répertoire /etc/modprobe.d. Dans ce répertoire, on trouve un fichier ipv6.conf dont le contenu est le suivant :

# Don't load ipv6 by default
alias net-pf-10 off
#alias ipv6 off

Il suffit de commenter la ligne en rouge qui désactive la famille de protocole numéro 10 dans le noyau Linux et de redémarrer le système pour bénéficier du support IPv6. Le contenu du fichier devient :

# Don't load ipv6 by default
#alias net-pf-10 off
#alias ipv6 off

Une fois le redémarrage achevé, le module ipv6 est automatiquement chargé en mémoire.

$ lsmod | egrep -e '(Module|ipv6)'
Module                  Size  Used by
ipv6                  316254  22

Là, il faut bien reconnaître que c'est le module ipv6 qui occupe le plus de mémoire dans la liste complète des modules chargés en mémoire.

Il est maintenant possible d'accéder à la carte via SSH en utilisant les adresses de type lien local.

pi@raspberrypi ~ $ ip addr ls
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether b8:27:eb:82:b2:64 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::ba27:ebff:fe82:b264/64 scope link
       valid_lft forever preferred_lft forever

Une adresse de type lien local appartient au préfixe fe80::/10 et est composée automatiquement à partir de l'adresse MAC au format EUI-64. Dans l'exemple ci-dessus, on reconnaît l'insertion des deux octets ff:fe au milieu de l'adresse MAC d'origine qui apparaît sur la ligne au-dessus.

L'accès SSH à l'aide de l'adresse de type lien local se fait comme suit :

phil@myhostname:~$ ssh pi@fe80::ba27:ebff:fe82:b264%eth0
pi@fe80::ba27:ebff:fe82:b264%eth0's password: 
Linux raspberrypi 3.12.35+ #730 PREEMPT Fri Dec 19 18:31:24 GMT 2014 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Jan  3 15:49:24 2015 from fe80::226:18ff:fe27:7b9%eth0

La seule particularité de cet accès tient au fait qu'il est nécessaire de désigner l'interface du domaine de diffusion à utiliser. Ici, la notation %eth0 impose l'utilisation du réseau Ethernet sur lequel l'interface eth0 est raccordée.

Étape 2 : autoconfiguration IPv6

Si l'étape précédente ne nécessite aucun service d'infrastructure, l'affectation d'une adresse IPv6 visible sur l'Internet suppose qu'un routeur IPv6 déjà configuré se charge de l'attribution des paramètres de l'interface réseau. Sur le système Raspbian, il faut ajouter deux lignes au fichier /etc/network/interfaces.

auto lo

iface lo inet loopback
iface eth0 inet dhcp
iface eth0 inet6 auto

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
iface default inet6 auto

Après réinitialisation de l'interface active à l'aide des commandes sudo ifdown eth0 et sudo ifup eth0, l'autoconfiguration IPv6 peut s'effectuer. On visualise ci-dessous les adresses ainsi que la table de routage.

$ ip -6 addr ls
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2001:db8:fe00:814f:ba27:ebff:fe82:b264/64 scope global dynamic
       valid_lft 86368sec preferred_lft 14368sec
    inet6 fe80::ba27:ebff:fe82:b264/64 scope link
       valid_lft forever preferred_lft forever
$ ip -6 ro ls
2001:db8:fe00:814f::/64 dev eth0  proto kernel  metric 256  expires 86251sec
fe80::/64 dev eth0  proto kernel  metric 256 
default via fe80::ba27:ebff:feea:2972 dev eth0  proto ra  metric 1024  expires 1651sec

Pour compléter l'autoconfiguration, on ajoute le traitement des annonces RDNSS qui va servir à configurer le resolver DNS.

$ sudo aptitude install rdnssd
Les NOUVEAUX paquets suivants vont être installés : 
  rdnssd resolvconf{a}

On relève le résultat dans le fichier /etc/resolv.conf après réinitialisation de l'interface active.

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 2001:db8:fe00:814f::1
search mydomain

Étape 3 : multicast DNS

Pour terminer, on ajoute le service multicast DNS au système. Manipuler des adresses IPv6 sous forme numérique peut s'avérer très fastidieux. Alors pourquoi ne pas bénéficier d'une résolution des noms d'hôtes sans passer par les enregistrements DNS «classiques» ?

On installe deux paquets supplémentaires ainsi que les dépendances associées.

$ sudo aptitude install avahi-daemon avahi-utils
Les NOUVEAUX paquets suivants vont être installés : 
  avahi-daemon avahi-utils bind9-host{a} libavahi-core7{a} libbind9-80{a} libdns88{a} libisc84{a} libisccc80{a} libisccfg82{a} liblwres80{a} libnss-mdns{a} 
0 paquets mis à jour, 11 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de télécharger 1 420 ko d'archives. Après dépaquetage, 3 360 ko seront utilisés.

Une fois les paquets installés, il reste une ultime édition de fichier. La recherche de noms mdns ne doit pas être restreinte au seul protocole IPv4. On modifie donc le fichier /etc/nsswicth.conf comme ci-dessous.

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat

hosts:          files mdns_minimal [NOTFOUND=return] dns mdns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

Sur la ligne en vert ci-dessus, on a retiré les chiffres 4 pour les paramètres mdns.

Et voilà !

On accède maintenant à notre objet de l'Internet via son nom dans le Top Level Domain .local.

$ ssh pi@raspberrypi.local
The authenticity of host 'raspberrypi.local (2a01:240:fe00:814f:ba27:ebff:fe82:b264)' can't be established.
ECDSA key fingerprint is 4f:f9:17:ba:bf:57:16:a9:64:12:b7:e0:2b:51:7d:26.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'raspberrypi.local,2a01:240:fe00:814f:ba27:ebff:fe82:b264' (ECDSA) to the list of known hosts.
pi@raspberrypi.local's password: 
Linux raspberrypi 3.12.35+ #730 PREEMPT Fri Dec 19 18:31:24 GMT 2014 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Jan  3 18:32:25 2015 from fe80::226:18ff:fe27:7b9%eth0

pour conclure, même si les configurations proposées dans ce billet ont une empreinte mémoire non nulle, je dirai qu'elles facilitent beaucoup l'utilisation de la connexion réseau sans qu'il soit nécessaire de déployer un jeu de services complet par ailleurs. Les «grands débutants» pourraient aborder plus facilement les outils disponibles sur ces nouveaux objets connectés à l'Internet.


Posté par Philippe Latu | permalien | dans : raspberrypi, réseau, système | Read it in english with Google