PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Guillaume Vaillant : OpenWRT, Freebox et IPv6

mercredi 20 mars 2013 à 09:00

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:

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:

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:

Maintenant, on est prêt pour la suite:

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
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:

...
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'
...
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'
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)

 

 

Gravatar de Guillaume Vaillant
Original post of Guillaume Vaillant.Votez pour ce billet sur Planet Libre.

Articles similaires