IPv6 avec Freebox en mode bridge
par , le dimanche 11 novembre 2012 à 01:16

Catégorie : Général
Mots clés :

Free l'un des ISP pionner dans le déploiement d'IPv6 permet d'avoir un réseau IPv6 chez soi, et ce en toute simplicité sous Linux. ça tombe bien car il devient urgent d'y passer car la pénurie est à notre porte.


En 2007 Free a déployé, à la vitesse de l'éclair, IPv6 en utilisant une variante de 6to4 : 6rd (rd=rapid deploiment). Cette variante permet d'avoir sur la Freebox un réseau complet de 2^64 adresses publiques, c'est-à-dire plus d'IP personnelles que l'ensemble des IPv4 disponibles sur tout Internet !

Mais comment fait-on si l'on utilise la FreeBox en mode modem donc sans voir la FreeBox elle-même et donc sans réseau entre elle et les équipements de l'abonné ?

Pour ma part mon j'ai un serveur qui fait aussi office de routeur. Il est configuré en IP static coté modem FreeBox. Je voudrais y ajouter l'IPv6 (le réseau en fait) qui m'est attribué et passer en double pile IPv4/IPv6.

Bien que la variante 6rd soit basée sur un tunnel 6to4 on peut dire que c'est de l'IPv6 natif car on obtient un vrai préfix IPv6 associé au réseau de Free; les premiers bits indiquant bien que c'est de l'IPv6 non encapsulé et correspondant à un prefix donné à Free.

Cependant, il y a une petite subtilités : les bits suivants correspondent à l'adresse IPv4 publique que Free attribue à chaque abonné ce qui voudrait dire que l'on ne peut avoir une telle adresse sans IPv4; ça n'arrange pas notre histoire de pénurie. Mais bon, Free finira par données des adresses IPv6 seule quand on aura basculé dans le full IPv6. On en reparle d'ici quelques années.

Activation d'IPv6

Bon alors maintenant activons IPv6 sur notre routeur linux :

  • connecter-vous à l'interface 'console' de la Freebox
  • activer IPv6 dans les options Internet
  • redémarrer la FreeBox

et voilà c'est terminé, votre serveur Linux ou n'importe quel PC que vous branchez sur le FreeBox a de forte chance d'être immédiatement accessible en IPv6, et vous venez de rendre vulnérable votre serveur/router car il y a de forte chance qu'aucun firewall ne soit activé. Et inutile de compter sur vos règles iptables ou votre shorewall (ou pfbuilder), le filtrage IPv6 étant complètement dissocié de la partie IPv4.

En fait, dès que la FreeBox active IPv6 elle transmet des annonces radv sur le réseau qui la relie à votre serveur Linux, et comme celui-ci a certainement le support IPv6 activé par défaut, c'est dans la poche.

Petite précision, toute cette configuration est effectuée sous GNU/Linux Debian. Le wiki Debian contient une section sur le sujet.

Vérifions quand même coté Linux qu'IPv6 est bien supporté. Un simple ip addr devrait suffire car toute interface réseau Ethernet a automatiquement une IPv6 de lien local :

server:~# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
   inet6 ::1/128 scope host
      valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
   link/ether 40:61:86:34:28:58 brd ff:ff:ff:ff:ff:ff
   inet 82.224.154.135/24 brd 82.224.154.255 scope global eth0
   inet6 2a01:e35:2e09:a870:4261:86ff:fe34:2858/64 scope global dynamic
      valid_lft 86224sec preferred_lft 86224sec
   inet6 fe80::4261:86ff:fe34:2858/64 scope link
      valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 100
   link/ether 00:0e:0c:80:fb:8c brd ff:ff:ff:ff:ff:ff
   inet 10.0.0.1/24 brd 10.0.0.255 scope global eth1
   inet6 fe80::20e:cff:fe80:fb8c/64 scope link
      valid_lft forever preferred_lft forever

Ici eth0 est l'interface coté publique (relié à la FreeBox donc) et eth1 le réseau local privé.

On a bien des inet6 dont un scope link sur eth0. C'est une IP restreinte (car elle commence par fe80::) qui permet de communiquer sur le LAN connecté à l'interface. Cela permet de discuter avec les autres serveurs du LAN, faire des annonces, et répondre aux broadcast. L'IP 2a01:e35:2e09:a870:4261:86ff:fe34:2858 est celle que nos obtenons pas configuration automatique et elle est dan un LAN /64 pour nous tout seul.

En 'sniffant' le réseau local relié à la FreeBox nous pouvons voir passer les annonces de routeur contenant le prefix IPv6 que Free attribue au réseau public personnel à chaque abonné. Ce sont ces annonces qui permettent à l'interface réseau de s'auto-configurer dynamiquement en mode stateless. Aucun serveur DHCP n'est nécessaire dans ce cas de figure. L'adresse IPv6 de la carte utilisera ce prefix et l'adresse MAC de la carte :

server:/etc/shorewall6# tcpdump -i eth0 -v ip6
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
01:05:00.746795 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 104) fe80::207:cbff:fe10:ce97 > ip6-allnodes: [icmp6 sum ok] ICMP6, router advertisement, length 104
    hop limit 64, Flags [none], pref medium, router lifetime 1800s, reachable time 0s, retrans time 0s
      prefix info option (3), length 32 (4): 2a01:e35:2e09:a870::/64, Flags [onlink, auto], valid time 86400s, pref. time 86400s
      rdnss option (25), length 40 (5):  lifetime 600s, addr: dns3.proxad.net addr: dns2.proxad.net
      mtu option (5), length 8 (1):  1480
      source link-address option (1), length 8 (1): 00:07:cb:10:ce:97

avec Wireshark on obtient :

On obtient même les adresses IPv6 des serveurs DNS.

C'est le moment de vérifier que le server/routeur Linux a bien accès en IPv6 au monde extérieur.
Il existe à ce propos un site qui a été mis en place pour le World IPv6 Day. En lançant Firefox (ou Iceweseal) depuis le routeur Linux, vous devez obtenir ceci :

et le détail du test :

Note: le Wordl IPv6 Day est déjà passé mais le site rest un bon outils de test.

Accès au réseau privé

Il nous faut ouvrir l'accès aux stations du LAN privé. Il y a plusieurs choix possibles :

  • créer un sous-réseau IPv6 et le router à travers le firewall; dans ce cas il faut utiliser quelques fonctions de proxy. Je vous invite à lire l'article du wiki de Gentoo.
  • utiliser un pont ethernet pour 'fusionner' les 2 réseaux et faire comme si toutes les stations sont reliées au LAN de la FreeBox. Je vous invite à lire l'article de Sébastien Chaumontet.
  • utiliser un routage classique sur le réseau IPv6 tout en faisant croire que tous les host sont sur la LAN freebox.

De notre coté, nous allons retenir la 3éme solution qui ne nécessite pas trop de bidouillage.

Pour commencer nous allons annoncer aux hosts internes note préfix IPv6 et la route par défaut IPv6 :

  • installation, sur notre routeur linux, du démon radvd qui va annoncer aux host internes le préfix que nous a attribué Free; c'est aussi ce démon qui va nous indiquer la route par défaut à nos hosts interne, cette route étant forcément notre routeur linux (et il n'est pas possible de modifier cette configuration) :

Activation du routage IPv6 dans le noyau, fichier /etc/sysctl.conf :

net.ipv6.conf.all.forwarding=1

et pour prendre en compte immédiatement les modifications

sysctl -p

Installation du service radvd :

apt-get install radvd

Configuration du démon radvd dans le fichier /etc/radvd.conf :

interface eth1
{
   AdvSendAdvert on;
   prefix 2a01:e35:2e09:a870::/64
   {
      AdvOnLink on;
   };
};   

Les points importants dans cette configuration sont :

  • indiquez l'interface du LAN interne dans le paramétre 'interface'; il s'agit du LAN contenant vos host privés et non du LAN freebox<->routeur-linux.
  • indiquez le prefix que Free vous a attributé pour le paramètre 'prefix'; ce prefix a été trouvé lors de la capture réseau avec WireShark, option 'prefix' du champ ICMPv6 Option du packet ICMP.

Une fois le service redémarré par une simple /etc/init.d/radvd restart, les host internes vont obtenir une IPv6 publique en plus de l'IP lien local (en plus de l'IPv4 privée) et une route IPv6 par défaut (en plus de la route IPv4 par défaut); exemple :

antoine@pcantoine:~$ ip -6 addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2a01:e35:2e09:a870:21d:60ff:fe6d:9988/64 scope global dynamic
       valid_lft 86162sec preferred_lft 14162sec
    inet6 fe80::21d:60ff:fe6d:9988/64 scope link
       valid_lft forever preferred_lft forever

antoine@pcantoine:~$ ip -6 route

2a01:e35:2e09:a870::/64 dev eth0  proto kernel  metric 256  expires 86039sec
fe80::/64 dev eth0  proto kernel  metric 256
default via fe80::20e:cff:fe80:fb8c dev eth0  proto kernel  metric 1024  expires 1428sec

L'IP attribuée correspond à la ligne inet6 2a01:e35:2e09:a870:21d:60ff:fe6d:9988/64 scope global dynamic qui indique une IP publique (global) et dont le début de l'adresse correspond bien à notre prefix Free.

La route par défaut en IPv6 _default via fe80::20e:cff:fe80:fb8c correspond bien au routeur Linux. Il s'agit ici de l'IP lien local du routeur sur le LAN interne (entre le routeur et les host interne).

Nous tenons le bon bout, les packets IPv6 des hosts vont correctement prendre le bon chemin pour sortir vers intenet. Il nous reste quelques détails à régler : le retour des packets depuis internet et le réglage du firewall.

Il faut bien comprendre qu'en IPv6 la notion de translation d'adresse n'est pas naturelle et donc que tous les host sans filtrage sont immédiatement accessibles depuis l'extérieur. Pour le firewall nous allons utiliser Shorewall6 qui nous offre aussi une fonction de IPv6 – Proxy the neighbors (sorte d'équivalent au proxy ARP). C'est ce proxy neighbourg qui va nous permettre de faire une simili-bridge. Le proxy neighbourg consiste à annoncer en ICMPv6 les hosts internes sur le LAN externe, permettant ainsi de faire croire à la FreeBox que les hosts sont directement sur le lan FreeBox<->routeur linux. C'est le routeur linux qui va prendre les packets et ensuite utiliser le routage 'traditionnel' pour transmettre les packets entrant.

Installation de Shorewall6 :

apt-get install shorewall6

et activation dans le fichier /etc/default/shorewall6 :

startup=1

ensuite il faut remplir le fichier proxy-neighbourg et définir le filtrage de base; exemple avec 2 hosts internes :

root@server:/etc/shorewall6/proxyndp


#ADDRESS INTERFACE EXTERNAL HAVEROUTE PERSISTENT 2a01:e35:2e09:a870:21d:60ff:fe6d:9988 eth1 eth0 2a01:e35:2e09:a870::2 eth0 eth1root@server:/etc/shorewall6#

eth1 étant l'interface du LAN interne sur le routeu linux et eth0 le LAN publique coté Freebox.

pour le filtrage de base (sortie Internet autorisée, entrée depus Internet bloquée) :

root@server:/etc/shorewall6/interfaces

#
# Shorewall version 4.0 - Sample Interfaces File for two-interface configuration.
# Copyright (C) 2006 by the Shorewall Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# See the file README.txt for further details.
#------------------------------------------------------------------------------
# For information about entries in this file, type "man shorewall-interfaces"
#
# The manpage is also online at 
# http://shorewall.net/manpages/shorewall-interfaces.html
#
###############################################################################
#ZONE   INTERFACE   BROADCAST   OPTIONS
net     eth0            detect          tcpflags
loc     eth1            detect          tcpflags
#lg tun0        detect      tcpflags
#virt   virbr0      detect      tcpflags
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

root@server:/etc/shorewall6/zones

#
# Shorewall version 4.0 - Sample Zones File for two-interface configuration.
# Copyright (C) 2006 by the Shorewall Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# See the file README.txt for further details.
#------------------------------------------------------------------------------
# For information about entries in this file, type "man shorewall-zones"
#
# The manpage is also online at 
# http://shorewall.net/manpages/shorewall-zones.html
#
###############################################################################
#ZONE   TYPE    OPTIONS         IN          OUT
#                   OPTIONS         OPTIONS
fw  firewall
net ipv6
loc ipv6
#lg ipv6
#virt   ipv6
#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE

root@server:/etc/shorewall6/policy

#
# Shorewall version 4.0 - Sample Policy File for two-interface configuration.
# Copyright (C) 2006 by the Shorewall Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# See the file README.txt for further details.
#------------------------------------------------------------------------------
# For information about entries in this file, type "man shorewall-policy"
#
# The manpage is also online at 
# http://shorewall.net/manpages/shorewall-policy.html
#
###############################################################################
#SOURCE     DEST        POLICY      LOG LEVEL   LIMIT:BURST

#
# Note about policies and logging:
#   This file contains an explicit policy for every combination of
#   zones defined in this sample.  This is solely for the purpose of
#   providing more specific messages in the logs.  This is not
#   necessary for correct operation of the firewall, but greatly
#   assists in diagnosing problems. The policies below are logically
#   equivalent to:
#
#   loc net     ACCEPT
#   net all     DROP        info
#   all all     REJECT      info
#
#   The Shorewall-perl compiler will generate the individual policies
#   below from the above general policies if you set 
#   EXPAND_POLICIES=Yes in shorewall.conf. 
#

# Policies for traffic originating from the local LAN (loc)
#
# If you want to force clients to access the Internet via a proxy server
# on your firewall, change the loc to net policy to REJECT info.
#loc        net     ACCEPT
#loc        $FW     ACCEPT
loc     all     ACCEPT  
#virt       all     ACCEPT

#
# Policies for traffic originating from the firewall ($FW)
#
# If you want open access to the Internet from your firewall, change the
# $FW to net policy to ACCEPT and remove the 'info' LOG LEVEL.
# This may be useful if you run a proxy server on the firewall.
#$FW        net     ACCEPT
#$FW        loc     ACCEPT
$FW     all     ACCEPT

#
# Policies for traffic originating from the Internet zone (net)
#
#net        $FW     DROP        info
#net        loc     DROP        info
net     all     DROP        

# THE FOLLOWING POLICY MUST BE LAST
all     all     REJECT      

#LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE

root@server:/etc/shorewall6/rules

#
# Shorewall version 4.0 - Sample Rules File for two-interface configuration.
# Copyright (C) 2006,2007 by the Shorewall Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# See the file README.txt for further details.
#------------------------------------------------------------------------------
# For information about entries in this file, type "man shorewall-rules"
#
# The manpage is also online at 
# http://shorewall.net/manpages/shorewall-rules.html
#
#############################################################################################################
#ACTION     SOURCE          DEST            PROTO   DEST    SOURCE  ORIGINAL    RATE        USER/   MARK

Ping/ACCEPT net         all
Ping/ACCEPT $FW         all
Ping/ACCEPT loc         all
SSH/ACCEPT  net         $FW
HTTP/ACCEPT net         $FW
DNS/ACCEPT  net         $FW
ACCEPT      net         $FW         tcp 5222

#DNAT       net         loc:10.0.0.10       udp 31336   -       
#DNAT       net:83.167.38.34    virt:192.168.122.40 tcp 3389    -
#
## Emule
#ACCEPT     net         $FW         tcp 4662
#ACCEPT     net         $FW         udp 4676
#ACCEPT     net         $FW         udp 4672
#
## BitTorrent
#ACCEPT     net         $FW         tcp 6881
#ACCEPT     net         $FW         tcp 6882

#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Voilà, on peut maintenant faire quelques tests de validation depuis l'un des PC internes; par exemple :

antoine@pcantoine:~$ host www.free.fr
www.free.fr has address 212.27.48.10
www.free.fr has IPv6 address 2a01:e0c:1:1599::1

antoine@pcantoine:~$ ping6 -c 3 www.free.fr
PING www.free.fr(www.free.fr) 56 data bytes
64 bytes from www.free.fr: icmp_seq=1 ttl=59 time=73.4 ms
64 bytes from www.free.fr: icmp_seq=2 ttl=59 time=20.4 ms
64 bytes from www.free.fr: icmp_seq=3 ttl=59 time=20.7 ms

--- www.free.fr ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 20.424/38.200/73.434/24.915 ms

antoine@pcantoine:~$ lynx "http://[2a01:e0c:1:1599::1]"
...

et enfin accès à la page du IPv6 Day depuis un PC du LAN interne :

On constate que l'IPv6 est bien publique et commence par le même préfix que l'IPv6 publique du routeur linux (sinon il n'y a aucun chance que cela marche), alors que l'IPv4 est l'unique IP disponible qui est translaté au niveau du routeur.

On a ainsi une IP publique fixe en IPv6 par host configuré sur le proxy.

Ce système n'est pas l'idéle car :

  • chaque host IPv6 doit être déclaré dans le fichier /etc/shorewall6/proxyndp
  • l'adresse MAC de chaque host ainsi accessible en IPv6 est rendu publique car codé (et à peine masquée) par l'autoconfiguration stateless du mécanisme mis en place.

En revanche, et gràce au standard même d'IPv6, chaque host ne fait plus l'objet de (source) NAT au niveau du firewall et donc les problèmes de translattion d'adresse (casspied pour tout ce qui est flux audio/video (vidéo-conférence, ...)) entre 2 host privés sur intenet font partie du passé. Mais encore faudrait-il qu'un maximum d'utilisateurs passe sur ce nouveau protocol, ce qui n'est pas gagné.

A bientôt

Antoine

Ecrire à l'auteur