Guillaume Vaillant : OpenWRT, Freebox et IPv6
mercredi 20 mars 2013 à 09:00L’autre jour, j’ai décidé de repasser ma Freebox en mode bridge, et de la connecter sur un routeur sur lequel j’aurai complètement la main. Bien entendu, tant qu’à faire, je préfère un avoir un routeur sous Linux, avec accès root et tout
J’ai donc acheté un routeur NetGear WNDR3700v2, dont j’ai aussitôt remplacé le firmware par un OpenWRT.
La suite de cet article va détailler plusieurs choses:
- Comment ne pas perdre les services TV de la Freebox (tant qu’à faire);
- Comment avoir une conf IPv6 fonctionnelle.
Par contre, il ne parlera pas de l’installation et de la configuration de base d’OpenWRT sur ce routeur. Pour ça, il y a tout ce qu’il faut sur le wiki d’OpenWRT.
Avant d’aller plus loin, je vais mettre un petit schéma de l’installation, histoire de pas complètement se perdre (et puis, les dessins, ça met un peu de couleur et de vie dans ce bazar).
Configurer son routeur pour pouvoir y brancher le boîtier TV de la Freebox:
Donc, normalement, l’installation d’OpenWRT s’est bien passée, on a récupéré l’accès Internet partout à la maison (avec et sans les fils). Par contre, si on a pas pu brancher directement le boîtier TV à la Freebox, on est bien embêté (comme moi, avec la Freebox dans le bureau et la TV et son boîtier dans le salon).
En fouillant un peu, on trouve que le boîtier TV et la Freebox communiquent sur un VLAN taggé qui a l’ID 100. Du coup, la solution n’est pas bien compliquée: on modifie la configuration d’OpenWRT pour avoir une interface de plus qui permet au boîtier TV d’accéder au réseau Free et de faire son boulot.
Par défaut, on a:
- une interface wan (eth1) où l’on connecte la Freebox en mode bridge ;
- une interface lan (br-lan), cette interface est un bridge qui regroupe eth0.1 (le switch), wlan0 et wlan1 (les deux interfaces WiFi).
On rajoute donc à tout ça une interface fbx lié à un nouveau bridge br-fbx qui regroupe les interface eth0.100 (VLAN 100 taggé sur le LAN) et eth1.100 (VLAN 100 taggé sur le WAN), et dans mon cas, je connecte le boîtier TV au port numéro 4 du routeur (dans OpenWRT, les ports du routeur sont nommés de 0 – port 4 – à 3 – port 1, le port avec l’ID 5 correspond au cpu).
Ceci ce traduit par cette configuration (dans: /etc/config/network – je ne met que les morceaux utiles):
... config 'interface' 'lan' option 'ifname' 'eth0.1' option 'type' 'bridge' option 'proto' 'static' ... ... config 'switch_vlan' option 'device' 'rtl8366s' option 'vlan' '100' option 'ports' '0t 5t' ... config 'interface' 'fbx' option 'proto' 'none' option 'send_rs' '0' option 'stp' '1' option 'type' 'bridge' option 'ifname' 'eth0.100 eth1.100' ...
On active tout avec un /etc/init.d/network restart, et normalement, on a rien pété et on peut s’abrutir devant regarder la télé
Free et IPv6 à la mano
Donc, maintenant, on a tout qui fonctionne pas mal, mais… On est pas encore au top… On utilise pas encore l’IPv6 que Free propose gratuitement!
On trouve pas mal de solutions sur Internet, mais peu qui proposent de le faire de manière pure, c’est à dire sans passer par du ebtables & Cie, même si c’est sûrement ce que fait la Freebox en mode routeur et que c’est sûrement le plus rapide et le facile à mettre en place
Voilà comment on peut faire:
- d’abord, on se connecte à son compte Free, et on active le support IPv6 et on reboote la Freebox ;
- ensuite, on retourne sur son comte Free, et on note le préfixe IPv6 qui nous est alloué par Free (pour info, ce prefixe peut aussi se calculer à partir de l’adresse IPv4 de la Freebox)¹ ;
Maintenant, on est prêt pour la suite:
- préfixe IPv6: 20a01:e3X:XXXX:XXX0/64 ;
- IPv6 de la Freebox (côté Internet): 20a01:e3X:XXXX:XXX0::1 (pour information, même si le support IPv6 n’est pas activé dans le compte Free, cette IP sera joignable depuis l’extérieur) ;
- l’interface wan du routeur prendra cette IP: 20a01:e3X:XXXX:XXX0::2/126 et utilisera 20a01:e3X:XXXX:XXX0::1 comme passerelle par défaut ;
- l’interface lan du routeur prendra cette IP: 20a01:e3X:XXXX:XXX0:1::1/64 ;
- sur le routeur, on configurera radvd pour annoncer le préfix IPv6 sur l’interface lan ;
- on ajoutera quelques bricoles dans le sysctl.conf du routeur:
net.ipv6.conf.X.disable_ipv6=1 # X in [ eth0, wlan0, wlan1 ] net.ipv6.conf.all.forwarding=1 net.ipv6.conf.default.forwarding=1 net.ipv6.conf.all.proxy_ndp=1 net.ipv6.conf.default.proxy_ndp=1
- ensuite, (ça, c’est spécifique à Free), il faut peupler à la main le voisinage du routeur:
ip -6 neigh add proxy 20a01:e3X:XXXX:XXX0::1 dev br-lan
et pour chaque PC/gadget qui l’utilise, on ajoute l’IPv6 de la bête:
ip -6 neigh add proxy 20a01:e3X:XXXX:XXX0:... dev eth1 # oui, eth1, c'est pas une erreur
NB: Si on active les Privacy Extensions for Stateless Address Autoconfiguration in IPv6 (cf RFC#4941), ça devient carrément pête bonbon.
annexes:
- /etc/config/network (seules les modifs utiles sont notées ici):
... config 'interface' 'lan' option 'ifname' 'eth0.1' option 'type' 'bridge' option 'proto' 'static' option 'netmask' '255.255.255.0' option 'broadcast' '196.168.X.255' option 'stp' '1' option 'ipv6' '1' option 'ipaddr' '192.168.X.254' option 'ip6addr' '20a01:e3X:XXXX:XXX0:1::1/64' config 'interface' 'wan' option 'ifname' 'eth1' option 'proto' 'dhcp' option 'ipv6' '1' option 'ip6addr' '20a01:e3X:XXXX:XXX0::2/126' option 'ip6gw' '20a01:e3X:XXXX:XXX0::1' ...
- /etc/config/radvd:
config 'interface' option 'ignore' '0' option 'interface' 'lan' option 'IgnoreIfMissing' '1' option 'AdvSendAdvert' '1' option 'AdvSourceLLAddress' '1' option 'AdvDefaultPreference' 'medium' config 'prefix' option 'ignore' '0' option 'interface' 'lan' list 'prefix' '20a01:e3X:XXXX:XXX0::/64' option 'AdvOnLink' '1' option 'AdvAutonomous' '1' option 'AdvRouterAddr' '1'
- éventuellement, on peut initialiser netfilter à la main (mais sinon, on peut aller le faire tranquillement via le clickodrome d’OpenWRT) avec cette conf minimale:
ip6tables -Z ip6tables -X ip6tables -F ip6tables -P INPUT DROP ip6tables -P OUTPUT ACCEPT # c'est moche, mais c'est plus simple ip6tables -P FORWARD DROP ip6tables -A INPUT -i lo -j ACCEPT ip6tables -A OUTPUT -o lo -j ACCEPT ip6tables -A INPUT -i br-lan -j ACCEPT ip6tables -A OUTPUT -o br-lan -j ACCEPT ip6tables -A INPUT -i eth1 -p icmpv6 -j ACCEPT # eth1 est l'interface wan ip6tables -A INPUT -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT ip6tables -A INPUT -i eth1 -j DROP ip6tables -A FORWARD -i eth1 -o br-lan -p icmp6 -j ACCEPT ip6tables -A FORWARD -i eth1 -o br-lan -m state --state ESTABLISHED,RELATED -j ACCEPT ip6tables -A FORWARD -i br-lan -o eth1 -j ACCEPT ip6tables -A FORWARD -j DROP
¹ trouver le préfixe IPv6 que Free nous alloue à partir de son IPv4:
L’idée est la suivante, on concatène 20a01:e3 à la version hexa de son IPv4 et d’y ajouter un 0/64… Voilà un petit bout de code en Python qui vous fera ça très bien:
ip4 = "12.34.56.79" ip6 = [] i = 1 # apres le %, c'est la conversion de l'IPv4 en hexa for b in "2a010e3%s" % "".join(map(hex, map(int, ip4.split('.')))).replace("0x", ""): ip6.append(b) if i % 4 == 0: ip6.append(':') i += 1 print "%s0/64" % "".join(ip6)
Original post of Guillaume Vaillant.Votez pour ce billet sur Planet Libre.
Articles similaires
- Guillaume Vaillant : Appliquer automatiquement les mises à jour de sécurité de Debian (05/12/2012)
- Guillaume Vaillant : Mode de secours sur OpenWRT (19/03/2013)
- Guillaume Vaillant : Cryptage de partitions sous Linux (04/07/2012)
- Guillaume Vaillant : Install et conf de base d’une Debian (14/06/2012)
- Guillaume Vaillant : utilisation d’un serveur LDAP comme source d’authentification pour des utilisateurs virtuels (04/10/2012)