IPv6, Free et DD-WRT


Free propose depuis le 12 décembre une connectivité IPv6 "native" (ou presque) à ses abonnés dégroupés (communiqué de Free, voir aussi le blog de signal). Comment l'utiliser lorsqu'on a une Freebox en mode bridge (mode routeur non activé) et un routeur type Linksys WRT54GL avec un firmware DD-WRT ? On voudrait que le trafic IPv6 traverse le WRT de façon transparente (comme si c'était un bridge) et que le trafic IPv4 continue à être routé (avec une couche de NAT) comme d'habitude sur le modèle de ce qui est expliqué . Ça s'appelle un "brouter" en Anglais, ce qui évidemment perd un peu à la traduction en Français (sur le même modèle on pourrait dire pont+routeur = prouteur mais ça va pas le faire non plus ;-) Je ne prétends pas que c'est la seule solution, ni même la meilleure, mais c'en est une qui fonctionne, même si elle n'est pas sans inconvénient (voir plus bas la remarque sur la sécurité).

Problème: avec un firmware DD-WRT v23 SP2, la commande pour faire l'aiguillage du trafic IPv6 vers le bridge et du reste vers le routeur ne fonctionne pas:
~ # ebtables -t broute -A BROUTING -i vlan1 -p ! ipv6 -j DROP
The kernel doesn't support the ebtables 'broute' table.
La raison en est que le module noyau ebtable_broute est absent du firmware DD-WRT standard. Qu'à cela ne tienne, DD-WRT c'est de l'Open Source, on peut récupérer les sources et compiler le module en question. C'est pas évident à faire parce que DD-WRT n'est pas très bien organisé en ce qui concerne les sources et le système de build, mais c'est possible. Je n'ai pas l'intention d'expliquer par le menu comment faire la compil' en question (ce serait un peu long), mais en gros l'essentiel des instructions est même si plusieurs adaptations sont nécessaires.

Et le résultat c'est un beau module ebtable_broute.o compilé pour le noyau 2.4.34-pre2 existant dans DD-WRT v23 SP2. Le module en question ne peut marcher QUE avec ce noyau. Si vous avez une version de DD-WRT autre que v23 SP2, ou un routeur basé sur autre chose que du matériel Broadcom, passez votre chemin, ça ne marchera pas. A noter qu'en rajoutant seulement ce module au noyau existant, on évite d'avoir à recompiler et flasher tout le firmware, il y a donc peu de risques de transformer un routeur qui fonctionne en presse-papiers mais je décline quand même toute responsabilité, utilisez ceci à vos risques et périls...

Donc si vous avez bien un Linksys WRT54GL ou assimilé et DD-WRT v23 SP2, téléchargez le module ebtable_broute.o (MD5 sum: 19a6dbab923f99be3a1789fd629d5e71). Ensuite copiez-le sur votre routeur, par exemple avec scp. Si vous avez activé JFFS et que vous avez quelques octets disponibles (avec le firmware standard la mémoire flash est pleine à ras bord, personnellement j'ai utilisé la version standard_nokaid qui est plus petite), le mieux c'est de le copier sur /jffs. Sinon, vous pouvez aussi le copier sur /tmp mais il sera alors en RAM et il faudra donc refaire la copie après chaque reboot du routeur.

Ensuite, il suffit d'exécuter ces quelques commandes pour charger les modules nécessaires, puis rajouter l'interface vlan1 (qui correspond au port WAN du WRT sur lequel est branchée la Freebox) au bridge déjà existant entre vlan0 (les ports LAN) et eth1 (l'interface wireless), et enfin ajouter une règle qui va rejeter du bridge et envoyer vers les couches de routage tout ce qui n'est pas IPv6:
insmod ebtables
insmod /jffs/ebtable_broute.o    #  modifier /jffs/ebtable_broute.o suivant l'endroit où vous avez copié le module
brctl addif br0 vlan1
ebtables -t broute -A BROUTING -i vlan1 -p ! ipv6 -j DROP
Une fois que tout marche, vous pouvez bien sûr mettre ces commandes dans un script que le routeur exécute au démarrage (à condition que le module soit en mémoire flash, voir plus haut).

Et voilà ! Attendez quelques minutes (la Freebox envoie des paquets Router Advertisement toutes les 5 à 10 minutes), et votre PC devrait s'auto-configurer avec une adresse IPv6 publique qui commence par 2a01:5ad8:

Sous Windows Vista, ipconfig devrait dire quelque chose comme ça:

Ethernet adapter Local Area Connection :

   Connection-specific DNS Suffix  . :
   IPv6 Address. . . . . . . . . . . : 2a01:5d8:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
   Temporary IPv6 Address. . . . . . : 2a01:5d8:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
   Link-local IPv6 Address . . . . . : fe80::xxxx:xxxx:xxxx:xxxx%12
   IPv4 Address. . . . . . . . . . . : 192.168.1.3
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : fe80::xxxx:xxxx:xxxx:xxxx%12
                                       192.168.1.1

Sous Linux, ifconfig:

~$ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:30:1B:3E:1B:65
          inet addr:192.168.1.9  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: 2a01:5d8:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 Scope:Global
          inet6 addr: fe80::xxxx:xxxx:xxxx:xxxx/64 Scope:Link

Vous n'avez plus qu'à aller (par exemple) sur http://www.kame.net/ et vous devriez voir la tortue animée. Si la tortue est fixe, c'est que la connexion s'est faite en IPv4 et donc quelque chose n'a pas marché.

ATTENTION ! Avec cette config, les machines qui ont une stack IPv6 sont connectées à Internet "en direct" avec des adresses publiques, sans la pseudo-protection offerte par un routeur NAT. Il n'y sans doute pas encore beaucoup de virus et autres cochonneries qui parlent IPv6 mais ce n'est qu'une question de temps... On pourrait imaginer de rajouter des règles de filtrage au niveau du routeur (pardon... du bridge) DD-WRT lui-même, mais d'une part il manque là aussi des morceaux dans le firmware standard (notamment ip6tables et les modules netfilter IPv6), et d'autre part même si on rajoute les morceaux qui manquent on va rapidement se heurter au fait qu'un noyau 2.4 est très limité en ce qui concerne IPv6 et netfilter, notamment pas de "connection tracking" donc pas de possibilité de faire du "stateful inspection". Un bon firewall logiciel IPv6 sur chaque système du LAN serait plus qu'utile. Sous Linux on a toujours ip6tables, sous Windows ça risque d'être plus difficile à trouver... Je ne conseille pas de rester dans cette config de façon permanente, mais pour faire des expériences et apprendre IPv6 de façon concrète, c'est déjà pas mal. A noter que le même problème se pose avec une Freebox en mode routeur qui n'effectue aucun filtrage sur IPv6.

Remarque sur DNS: Free distribue les adresses IPv6 de ses serveurs DNS via une option ICMPv6 dans les paquets RA (Router Advertisement) envoyés par la Freebox. C'est une option très récente dont le RFC a été publié en septembre 2007 seulement: RFC 5006. A ce jour, il n'existe aucune version de Windows (pas même Vista) ni de Linux (ça devrait arriver avec le noyau 2.6.24 mais c'est apparemment aussi possible avec un simple daemon, voir ici) qui comprenne cette option. Donc si vous voulez les utiliser, vous pouvez configurer les adresses des serveurs DNS à la main: 2a01:5d8:e0ff::1 et 2a01:5d8:e0ff::2. Cela dit, ça n'a rien d'indispensable: on peut tout à fait utiliser IPv4 pour demander à un serveur DNS l'adresse IPv6 (le record AAAA en langage DNS) correspondant à un nom. Ça ne devient utile que lorsqu'on supprime la stack IPv4 pour n'utiliser que IPv6 et ça, c'est pas demain la veille !

Envoyer un commentaire