L'IPv6 de Free chez soi, pour les geeks

 x0r   10
sysadmin free ipv6 openwrt freebox ndppd

C'est bien connu maintenant, Free offre à tout client la possibilité d'obtenir son propre préfixe IPv6 gratuitement. Celui-ci n'étant pas activé par défaut, il faut aller en faire la demande sur son interface client, puis faire un reboot électrique de la Freebox.

Seulement voilà, la topologie réseau d'un geek est probablement la suivante, où la Freebox est en mode switch et avec un routeur OpenWRT calé entre le LAN et le Net :

<Internet>
    |
    |
[Freebox]------[Routeur OpenWRT]------<LAN>

ce qui n'a absolument rien à voir avec la topologie réseau du commun des mortels, où la Freebox sert de point d'accès Wi-Fi, ainsi que de routeur :

<Internet>-----[Freebox]------<LAN>

Ce guide cherche donc à exposer ce que j'ai moi-même compris, et comment faire fonctionner un réseau IPv6 où la Freebox n'est qu'un switch. On implémentera ainsi une solution permettant de router de l'IPv6 de manière globale, sans avoir recours à du brouting, mais en mettant en place un Neighbor Discovery Protocol Proxy au moyen du démon ndppd. On assurera la configuration automatique des postes en IPv6 avec radvd, même s'il est possible d'utiliser DHCPv6 à la place.

Avant de commencer, je souhaite ajouter que je suis un novice ; si vous trouvez la moindre erreur ou imprécision, n'hésitez pas à le signaler dans les commentaires.

IPv6, oui mais pourquoi ?

L'intérêt principal est de passer de l'espace d'adressage global de 32 bits d'IPv4, à des adresses de 128 bits. Avec la raréfaction des adresses IPv4 (il n'y en a déjà plus en Asie du sud-est), il faut penser à passer à l'Internet du futur tôt ou tard.

% host x0r.fr
x0r.fr has address 83.157.158.108
x0r.fr has IPv6 address 2a01:e35:39d9:e6c0:1::2

Aussi, le FAI attribuant seulement les 64 premiers bits de l'adresse IP, toutes les machines du réseau chez l'abonné choississent (ou se font attribuer) les 64 derniers bits. Donc le FAI attribue en fait une famille de 1,8 × 1019 adresses, contrairement à une seule IPv4.

En gros, ça veut dire que le NAT est obsolète (pas de bizarreries d'ouvertures de ports à faire sur le routeur, par exemple), et que n'importe qui dans le réseau peut héberger le service qu'il souhaite (ou un jeu multijoueurs, pour peu qu'il prenne en charge IPv6...), sans trafiquer le routeur.

Préparatifs

Tout d'abord, il faut vous assurer que le support de l'IPv6 soit activé dans toutes vos machines.

Ensuite, sur votre routeur OpenWRT, vous devez avoir la version Backfire (10.3.1) ou Attitude Adjustment (12.09), et installer le module noyau explicitement, ainsi que les outils associés :

root@routeur:~# opkg install kmod-ipv6 ip6tables kmod-ip6tables ip radvd

Ensuite, sur votre compte Free, activez le support IPv6 et rebootez électriquement (débrancher-rebrancher) la Freebox.

Activation de l'IPv6 chez Free

Munissez-vous également de votre préfixe IPv6. Pour moi, mon adresse IPv4 étant 83.157.158.108, mon préfixe IPv6 est 2a01:e35:39d9:e6c0::/64. La partie en gras du préfixe correspond à l'IPv4 de la Freebox encodée en hexadécimal.

Dans tout le tuto, nous présumerons que votre IPv4 est 81.234.56.78 et que votre préfixe IPv6 est 2a01:e35:1234:5670::/64. Aussi, votre réseau domestique IPv4 est supposé être 192.168.0.0/24.

Configuration des interfaces du routeur

Sur OpenWRT, il faudra attribuer deux adresses IPv6, un côté Freebox, et l'autre côté LAN. Dans /etc/config/network, mettez :

config interface wan        
        option ifname eth0.1
        option proto static
        option ipaddr 81.234.56.78
        option netmask 255.255.255.0
        option gateway 81.234.56.254
        option dns '212.27.40.240 212.27.40.241'
        option ip6addr 2a01:e35:1234:5670::2/126
        option ip6gw 2a01:e35:1234:5670::1

config interface lan            
        option type bridge
        option ifname eth0.0
        option proto static
        option ipaddr 192.168.0.254
        option ip6addr 2a01:e35:1234:5670:1::fe/64
        option netmask 255.255.255.0

Les nouvelles options sont ip6addr et ip6gw, qu'on règlera à la main. La passerelle étant bien entendu la Freebox, qui, malgré le mode routeur désactivé, reste un routeur IPv6.

Ensuite, tapez : /etc/init.d/network restart.

Vérifiez ensuite que la configuration a bien été prise en compte :

root@routeur:~# ifconfig br-lan | grep Global 
          inet6 addr: 2a01:e35:1234:5670:1::fe/64 Scope:Global
root@routeur:~# ifconfig eth0.1 | grep Global
          inet6 addr: 2a01:e35:1234:5670::2/126 Scope:Global

Enfin, activez le forwarding IPv6. Dans /etc/sysctl.conf, ajoutez :

net.ipv6.conf.all.forwarding=1                        

puis faites un sysctl -p.

Attention : les adresses commençant par fe80:: sont des adresses "link-local", qui ne sont valables qu'au sein d'un réseau. Elles ne sont pas routables sur Internet !

Configuration de radvd

Maintenant, une machine peut se connecter en Wi-Fi (par exemple) sur le réseau. Bien qu'il sache générer ses 64 derniers bits, comment obtient-il son préfixe (ses 64 premiers bits, donc) et le routeur par défaut ?

En IPv4, c'était DHCP qui s'occupe de ça. Bien qu'un DHCPv6 existe déjà, on va plutôt mettre en œuvre une fonctionnalité d'ICMPv6, à savoir le Router Sollicitation (RS) et le Router Advertisement (RA). Le routeur envoie des RA régulièrement (toutes les 10 secondes par exemple) pour annoncer aux machines du réseau qu'il est la passerelle par défaut. Lorsqu'une machine arrive sur le réseau, cependant, elle envoie un RS à tout le monde, et le routeur répond immédiatement avec un RA. Ainsi, elle s'autoconfigure.

Pour mettre cela en place, on configure le démon radvd comme suit, dans le fichier /etc/config/radvd :

config interface
    option interface    'lan'
    option AdvSendAdvert    1
    option AdvManagedFlag   0
    option AdvOtherConfigFlag 0
    list client     ''
    option ignore       0

config prefix
    option interface    'lan'
    list prefix     2a01:e35:1234:5670::/64
    option AdvOnLink    1
    option AdvAutonomous    1
    option AdvRouterAddr    0
    option ignore       0

config route
    option interface    lan
    list prefix     2a01:e35:1234:5670::/64
    option ignore       0

config rdnss                     
    option interface        'lan'
    list addr               2a01:e35:1234:5670:1::fe
    option ignore           0

config dnssl                     
    option interface        'lan'
    list suffix             'lan.example.com'
    option ignore           0

La section prefix indique les préfixes qui sont diffusés par le démon; route active les annonces de routes pour le préfixe prefix; rdnss (pour Recursive DNS Servers) donne la liste des adresses de serveurs DNS; enfin, dnssl (comme DNS Search List) donne la liste des suffixes DNS à inclure aux domaines de recherche.

Enfin, faites /etc/init.d/radvd start. Ajoutez-le aux services activés au boot par défaut avec /etc/init.d/radvd enable.

Configuration du proxy NDP

Maintenant, quand une machine se connecte au réseau, elle obtient automatiquement une adresse IPv6, avec son préfixe et sa passerelle par défaut. D'ailleurs, on peut le vérifier :

% /sbin/route -A inet6
Kernel IPv6 routing table
Destination                    Next Hop                   Flag Met Ref Use If
::1/128                        ::                         Un   0   1     4 lo
2a01:e35:1234:5670:51d:1dff:fecb:46d6/128 ::              Un   0   1   142 lo
2a01:e35:1234:5670::/64        ::                         UAe  256 0     0 wlan0
fe80::51d:1dff:fecb:46d6/128   ::                         Un   0   1     4 lo
fe80::/64                      ::                         U    256 0     0 wlan0
ff00::/8                       ::                         U    256 0     0 wlan0
::/0                           fe80::1337:caff:feba:be00  UGDAe 1024 0   0 wlan0
::/0                           ::                         !n   -1  1   382 lo

L'avant-dernière ligne est celle qui nous intéresse, et qui montre l'adresse lien-local du routeur comme passerelle par défaut.

Mais, en fait, ça ne marche pas encore. Pourquoi ? Vous allez voir.

Pour ceux qui sont familiers avec ARP en IPv4 (en deux mots : le protocole qui permet d'obtenir l'adresse MAC d'une machine en ne connaissant que son adresse IP), c'est géré en IPv6 à l'aide d'ICMPv6 encore une fois, mais avec des paquets Neighbor Solicitation (NS) et Neighbor Advertisement (NA). Or, ces paquets ne traversent généralement pas le routeur. La Freebox suppose d'ailleurs qu'il est le seul routeur du réseau, donc lors de la réponse, il s'attend à ce qu'il soit capable de résoudre l'adresse MAC de la machine source pour lui envoyer ses paquets de retour.

Sur votre routeur, ajoutez dans /etc/sysctl.conf :

net.ipv6.conf.all.proxy_ndp=1

puis, encore une fois, faites un sysctl -p.

En théorie, il ne resterait plus qu'à faire quelques manipulations pour que ça marche... mais cela ne fonctionnera qu'avec des hôtes ayant une adresse IPv6 configurée à la main. Ceux qui se connecteront en Wi-Fi n'auront pas de bol. Chaque nouvelle machine sur le réseau nécessitant une intervention manuelle sur le routeur, cette solution semble maintenant idiote, n'est-ce pas ?

C'est pourquoi nous allons installer un outil appelé ndppd, qui va permettre de proxifier les paquets NS et NA proprement et sans intervention de notre part. Ce package fait pour le moment partie du trunk d'OpenWRT, mais pas encore de la release officielle.

Si vous êtes sous Backfire, tapez ceci :

root@routeur:~# opkg install \
    http://downloads.openwrt.org/snapshots/trunk/brcm47xx/packages/ndppd_0.2.2-2_brcm47xx.ipk

Si vous êtes sous Attitude Adjustment, le paquet est directement disponible dans le dépôt :

root@routeur:~# opkg install ndppd

Mettez dans le fichier /etc/ndppd.conf :

route-ttl 30000

proxy br-lan {
   router yes
   timeout 500   
   ttl 30000

   rule 2a01:e35:1234:5670::/126 {
      auto
   }
}

proxy eth0.1 {
   router no
   timeout 500
   ttl 30000

   rule 2a01:e35:1234:5670::/64 {
      auto
   }
}

Avant de lancer le ndppd, mais seulement si vous êtes sous Backfire, il vous faudra modifier l'initscript d'origine. Sous Attitude Adjustment, un initscript du même acabit est déjà packagé. Voici mon /etc/init.d/ndppd :

#!/bin/sh /etc/rc.common
# Copyright (C) 2007-2011 OpenWrt.org

START=90                             

SERVICE_USE_PID=1
SERVICE_PID_FILE=/var/run/ndppd.pid

start() {                          
        mkdir -p /var/run
        start-stop-daemon -S -x /usr/sbin/ndppd -- -p $SERVICE_PID_FILE -d
}                                                                         

stop() {
        start-stop-daemon -K -x /usr/sbin/ndppd
}

Maintenant, enchaînez /etc/init.d/ndppd enable et /etc/init.d/ndppd start.

Tester la connectivité IPv6

Enfin, testez en pingant Google en IPv6 :

% ping6 -c4 ipv6.google.com
PING ipv6.google.com(par03s02-in-x11.1e100.net) 56 data bytes
64 bytes from par03s02-in-x11.1e100.net: icmp_seq=1 ttl=56 time=86.5 ms
64 bytes from par03s02-in-x11.1e100.net: icmp_seq=2 ttl=56 time=83.8 ms
64 bytes from par03s02-in-x11.1e100.net: icmp_seq=3 ttl=56 time=83.1 ms
64 bytes from par03s02-in-x11.1e100.net: icmp_seq=4 ttl=56 time=91.4 ms

--- ipv6.google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 83.107/86.238/91.451/3.285 ms

On voit que ça marche bien. Félicitations !

Problèmes

Firewall par défaut mal adapté

Il arrive que le firewall par défaut bloque tous les paquets ICMPv6 nécessaires, malgré le fait que nous en ayions besoin. Dans ce cas-là, rajouter dans /etc/firewall.user :

ip6tables -I INPUT 1 -p icmpv6 -j ACCEPT
ip6tables -I FORWARD 1 -p icmpv6 -j ACCEPT

puis relancer le firewall avec /etc/init.d/firewall restart.

Outils en ligne

Sources

Commentaires

Poster un commentaire

Gabriel

Merci beaucoup pour ce joli tutoriel. Du coup, je me sens utile d'avoir créé le paquet ndppd pour openwrt. Je ne l'utilise plus au quotidien (ayant quitté Free) mais si vous rencontrez un problème, n'hésitez pas à ouvrir un rapport de bug.

aztazt

Merci beaucoup :-) Pour un novice... c'est plutôt technique !

Damien Clauzel

Bonjour !

Je viens de récupérer un routeur TP-Link TL-WR1043N/ND v1 que j'ai passé sous OpenWRT Attitude Adjustement 12.09.

Est-ce que cette doc est toujours applicable pour activer le support IPv6 fourni par une Freebox ?

x0r

J'avais une Freebox v5 jusqu'en octobre 2013. J'ai entendu dire qu'il n'y a plus besoin de ndppd avec la Freebox v6 car elle aurait ajouté la possibilité de déléguer les routes, et ce sur les 16 /64 de son choix, si ma mémoire est bonne. Par contre j'imagine qu'ils n'ont pas ajouté cette fonction sur la v5... À vérifier cependant.

chris

Je crois que le ndppd conf peut etre plus simple:

route-ttl 30000

proxy eth0.1 { router yes timeout 500 ttl 30000 rule 2a01:e35:1234:5670::/64 { static } }

eeva

Un énorme MERCI pour ce tuto qui m'a permis de comprendre plein de choses sur IPV6 (et surtout m'a rassuré quand au fait que la configuration réseau pouvait rester simple !)

cgo

salut, merci pour les explications, ça marche toujours avec Barrier Breaker ! J'ai juste eu à mettre dans ndppd l'interface eth0.2 (wan) au lieu de eth0.1.

x0r

En effet, les noms des interfaces peuvent varier en fonction du matériel. Je ne m'en suis rendu compte qu'après avoir changé mon WRT54GL pour un autre routeur.

Toto

Le routeur envoie des RA régulièrement (toutes les 10 secondes par exemple) pour annoncer aux machines du réseau qu'il est la passerelle par défaut. Lorsqu'une machine arrive sur le réseau, cependant, il envoie un RS à tout le monde, et le routeur répond immédiatement avec un RA. Ainsi, il s'autoconfigure.

----------Ce serait pas plutot ?--- Lorsqu'une machine arrive sur le réseau, cependant, elle envoie un RS à tout le monde, et le routeur répond immédiatement avec un RA. Ainsi, elle s'autoconfigure.

x0r

En effet, au temps pour moi. C'est corrigé.

Poster un commentaire