OpenWRT, Freebox et IPv6

L’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).

schéma réseau

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)

 

 

10 thoughts on “OpenWRT, Freebox et IPv6

  1. Salut,
    Merci pour ce super tuto qui ma était utile pour ma V5 et actuellement pour ma V6.
    J’ai une petite question.
    Es ce qu’il est possible de :
    rediriger le vlan 100 ver un réseaux wifi spécifique ?
    a savoir :
    crée un reseaux wifi supplémentaire sur le WNDR3700v2 (par exemple tv@ap)
    puis via /etc/config/network spécirfier qu’il dois aussi rediriger le vlan 100 sur le port 0 et sur l’ap tv@ap ?
    dans l’attente de réponse, merci par avance.
    cordialement

    • Bonjour,

      Je n’ai jamais essayé, mais ça ne me paraît pas du tout impossible.
      Par contre, c’est peut-être plus simple à faire via l’interface web d’openwrt.

  2. Serait il possible d’utiliser le Freebox player sur une ligne non dégroupée, avec un Freebox v5?
    Le but étant d’avoir le tuner tnt HD, et de lire les films stockés sur mon dns 325.

    D’avances, merci!

    • Alors, le setup que je propose marche avec une Freebox v5 (c’est d’ailleurs celle que j’ai).
      Par contre pour lire mes films depuis mon NAS, je ne me suis jamais trop battu avec le boîtier TV de la Freebox: j’ai utilisé successivement une Wii, une Xbox et maintenant un raspberry pi 🙂
      Ceci dit, il n’y a pas de raison que ça ne soit pas faisable, en jouant un peu avec tes interfaces, tes routes et iptables. Dans mes investigations de l’époque, je me souviens que j’avais repéré quelques IP manifestements utilisées par le boîtier HD pour communiquer avec la Freebox (192.168.27.1 pour la Freebox HD, 192.168.27.14 pour la Freebox, et un 192.168.27.30 que je n’ai jamais su identifier).

  3. Perso moi je vais regarder ca sur pFsense.
    J’avais deja tout bien fait pour l’IPV6 (pas encore bien géré dans la version stable de pFsense)

    Cool

  4. Pingback: Faire fonctionner le Freebox Player (TV) avec une Freebox en mode bridge

  5. Pingback: Faire fonctionner la Freebox Player (TV) avec une Freebox en mode bridge

  6. Pingback: Faire fonctionner la Freebox Player (TV) avec une Freebox en mode bridge | - Dépannage Informatique, Limoges et toute la haute vienne, 87, Réparateur Ordinateur, Maintenance PC à Domicile, installation box, créateur de sites internet- Dépannage Infor

  7. Pingback: Faire fonctionner la Freebox Player (TV) avec une Freebox en mode bridge | Korben

  8. Petit adendum…
    Je suis tombé sur cette article http://x0r.fr/blog/12, qui m’a permis de découvrir ndppd (http://priv.nu/projects/ndppd/).
    Le package pour mon routeur est là: http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/ndppd_0.2.2-2_ar71xx.ipk, et il lui faut cette dépendance: http://downloads.openwrt.org/backfire/10.03.1/ar71xx/packages/uclibcxx_0.2.2-3_ar71xx.ipk
    Du coup, plus besoin des «ip -6 neigh add proxy 20a01:e3X:XXXX:XXX0:… dev eth1» et on peut se permettre de réactiver les privacy extensions d’IPv6 (sous Linux: sysctl -w net.ipv6.conf.${k}.use_tempaddr=2, k in [default, all]).

Comments are closed.