IPv6 sécurisé sur Freebox Révolution avec une Raspberry Pi

IPv6 est le protocole du futur Internet. Il existe depuis longtemps, mais la transition massive n’a toujours pas eu lieu, malgré la pénurie d’adresses IPv4.

Free a été le premier FAI grand public à proposer l’IPv6 via leur offre Freebox.

N’importe quel abonné Freebox peut aujourd’hui activer l’IPv6. La Freebox va alors établir un tunnel 6to4rd pour fournir une connectivité IPv6 sur son LAN, et va se mettre a envoyer des paquets Router Advertisement pour annoncer le préfixe (un /64) qui a été alloué aux machines sur le LAN qui savent faire de l’IPv6.

Dès lors, toute machine connectée au LAN de la Freebox et sachant parler l’IPv6 va pouvoir s’auto-assigner une IPv6 “publique” (ayant un scope global) et parler en IPv6 avec le reste du monde.

Problème : Puisque chaque machine obtient une adresse IPv6 ayant un scope global, n’importe quel autre machine sur l’Internet IPv6 peut communiquer avec tous les devices connectés sur le LAN. La Freebox ne propose strictement aucun moyen de filtrer le traffic IPv6. Il faudrait donc mettre en place un filtrage sur chaque device, sans exception. Sauf qu’installer un firewall sur une machine Windows, Mac ou Linux, c’est facile, mais dans certains autres cas, c’est tout simplement impossible.

Par exemple, une imprimante réseau qui saurait faire de l’IPv6 serait alors potentiellement utilisable par n’importe qui, depuis l’autre bout du monde, et il n’y a aucun moyen d’empêcher cela.

Activer l’IPv6 sur sa Freebox est donc un pari risqué. Le nombre d’adresses disponibles fait qu’il est certes très peu probable qu’on arrive a trouver l’adresse IPv6 de votre imprimante. Mais le risque existe bel et bien, et l’imprimante n’est qu’un exemple pas trop “grave” du problème (au pire, on vous vide le bac de feuilles / la cartouche) car l’accès à d’autres devices pourrait être beaucoup plus compromettant (Camera IP, Serveur NAS, …).

Que faire, alors ?

Plusieurs solutions existent :

  • Ne pas activer l’IPv6. Ca peut paraitre bête, mais pour l’instant, le commun des mortels n’a pas vraiment besoin d’IPv6. Donc a moins de savoir vraiment ce que l’on fait, mieux vaut ne pas l’activer tout simplement.
  • Utiliser la Freebox comme modem (en mode Bridge) et avoir un routeur/bridge externe. On trouve plusieurs tutos sur Internet pour faire cela, mais cette solution a plusieurs inconvénients, car lorsque la Freebox est en mode Bridge, on perd un certain nombre de fonctionnalités, dont le Wifi, l’UPnP, la Seedbox, la TNT en multiposte, … .(cf: http://www.free.fr/assistance/5082.html)
  • Conserver la Freebox en mode Routeur, et utiliser un deuxième routeur externe uniquement pour la gestion de l’IPv6. C’est cette solution que je vais décrire ici, et pour ce faire, je vais utiliser une Raspberry Pi, car c’est une solution qui ne coute pas cher, qui consomme peu et qui peut se brancher facilement à la Freebox. On peut cependant faire la meme chose avec n’importe quel device qui fait tourner Linux en adaptant un peu.

Depuis Freebox OS 2.0, la configuration IPv6 permet de configurer des “next hops” pour 8 prefixes /64 (Autrement dit, chaque abonné Freebox dispose d’un /61). De plus, lorsqu’un next hop est configuré sur le premier prefixe, la Freebox n’envoie plus de Router Advertisements sur le LAN.

L’objectif est donc de :

  • Mettre une Raspberry Pi sur le LAN, et activer IPv6
  • Router le premier préfixe vers la Raspberry Pi
  • Configurer une adresse de ce préfixe sur l’interface LAN de la Raspberry Pi
  • Faire en sorte que la Raspberry Pi envoie les Router Advertisements pour ce préfixe sur son interface LAN
  • Activer le routage des paquets IPv6
  • Mettre en place des règles IP6Tables pour filtrer le traffic IPv6

Tout d’abord, il faut donc brancher la Raspberry Pi au LAN de la Freebox. Elle va obtenir une IPv4 automatiquement, grâce au DHCP.

La Raspberry Pi n’a pas IPv6 actif par défaut. Il faut donc l’activer avec les commandes suivantes :

pi@raspberrypi ~ $ sudo modprobe ipv6
pi@raspberrypi ~ $ sudo echo ipv6 >> /etc/modules

 

 

Cela aura pour effet de rajouter une adresse IP de type Link-local a l’interface eth0. Cette adresse est automatiquement générée en se basant sur l’adresse MAC, elle sera donc toujours la même. Il faut la noter, on en aura besoin plus tard. Dans l’exemple ci dessous, il s’agit de fe80::ba27:ebff:fe36:cb4e

pi@raspberrypi ~ $ sudo ifconfig eth0
eth0      Link encap:Ethernet  HWaddr b8:27:eb:36:cb:4e  
          inet addr:192.168.42.34  Bcast:192.168.42.255  Mask:255.255.255.0
          inet6 addr: fe80::ba27:ebff:fe36:cb4e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:82134 errors:0 dropped:3 overruns:0 frame:0
          TX packets:83989 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:31899129 (30.4 MiB)  TX bytes:34922782 (33.3 MiB)

Ensuite, il faut activer IPv6 dans l’interface web de la Freebox, et configurer le Next Hop du premier préfixe avec l’adresse IP Link-local de la Raspberry Pi que l’on a notée plus haut. Il faut également noter l’adresse IPv6 lien local de la Freebox (ici fe80::f6ca:e5ff:fe57:1ceb) ainsi que le préfixe (ici 2001:db8:dead:beef::/64). Le préfixe utilisé ici à été modifié pour rédiger ce tutoriel, n’essayez pas d’y accéder, c’est une IP qui n’existe pas vraiment.

Screen Shot 2015-09-27 at 23.18.07

Il est possible que l’adresse IPv6 lien local ne s’affiche pas, juste après avoir activé l’IPv6. Il suffit de fermer et ouvrir la page de configuration a nouveau pour la voir s’afficher.

Il est bien important que ce soit le premier préfixe pour lequel on spécifie le next hop. Autrement, la Freebox va continuer d’envoyer des Router Advertisements sur le LAN, et le traffic IPv6 risque donc de passer directement par la Freebox, sans passer par la Raspberry Pi, et donc sans filtrage.

A partir de maintenant, on a donc un prefixe IPv6 public qui est routé de la Freebox vers la Raspberry Pi (a travers son IP Link-local sur le LAN).

Passons maintenant a la configuration IPv6 de la Raspberry Pi.

On va assigner la premiere adresse IPv6 du préfixe a l’interface eth0, et rajouter une route par défaut vers l’adresse IPv6 Link-local de la Freebox. Dans le cas de notre exemple, il faut donc executer la commande suivante. Pensez donc a remplacer les deux adresses IPv6 par celles notées à l’étape prédédente (pour construire l’adresse IPv6 de l’interface, il faut simplement retirer le “/64″ a la fin du préfixe, et le remplacer par “1”) :

pi@raspberrypi ~ $ sudo cat <<EOF >>/etc/network/interfaces
iface eth0 inet6 static
	address 2001:db8:dead:beef::1
	netmask 64
	post-up ip -6 route add default via fe80::f6ca:e5ff:fe57:1ceb dev eth0
EOF

 

Il faut ensuite installer le paquet “radvd” et le configurer pour qu’il annonce le bon préfixe sur le réseau local. Dans le cas de notre exemple, cela donne les commandes suivantes (pensez a remplacer le préfixe par votre préfixe, celui que vous avez noté) :

pi@raspberrypi ~ $ sudo apt-get install radvd

pi@raspberrypi ~ $ sudo cat <<EOF >/etc/radvd.conf
interface eth0
{
   AdvSendAdvert on;
   prefix 2001:db8:dead:beef::/64
   {
   };
};   
EOF

Une fois cela fait, il faut activer le routage des paquets IPv6 dans Linux.

pi@raspberrypi ~ $ sudo echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf

 

A partir de maintenant, si on redémarre la Raspberry Pi, elle va agir en tant que routeur IPv6, et l’IPv6 sera fonctionnel sur le réseau LAN, tout comme si on avait tout simplement activé IPv6 sur la Freebox. Mais le problème que l’on souhaitait résoudre a la base sera présent, puisqu’aucun filtrage n’est en place. Donc toutes les machines sur le LAN qui savent faire de l’IPv6 seront directement joignables depuis le reste de l’Internet IPv6.

Il nous reste donc a mettre en place un filtrage basique. L’idée est de retomber dans le même genre de protection que celle fournie implicitement en IPv4 par le NAT. A savoir, les machines vers le LAN peuvent accéder a toute machine vers l’Internet, mais l’inverse n’est pas possible. Pour cela, on crée un fichier de configuration pour ip6tables (le firewall IPv6 de Linux) :

sudo cat <<EOF >/etc/ip6tables.conf
*filter
:INPUT ACCEPT [14:960]
:FORWARD DROP [34:3344]
:OUTPUT ACCEPT [63:15248]
-A FORWARD -s 2001:db8:dead:beef::/64 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
EOF

 

Encore une fois, n’oubliez pas d’adapter la commande a votre préfixe. Ce que l’on fait ici c’est qu’on va refuser de router les paquets qui viennent de l’internet vers notre LAN, sauf si on est capable de les associer a une session qui a été initiée depuis notre LAN vers l’Internet.

Reste maintenant a faire en sorte que ces règles soient mises en place au démarrage :

pi@raspberrypi ~ $ sudo cat <<EOF >>/etc/network/interfaces
	post-up ip6tables-restore < /etc/ip6tables.conf
EOF

 

Puis a rebooter la Raspberry Pi afin d’appliquer tous ces nouveaux paramètres.

pi@raspberrypi ~ $ sudo reboot

Voila, c’est terminé !

Si tout se passe bien, vos machines sur le LAN devraient maintenant recevoir un router advertisement IPv6 de la Raspberry Pi, et donc s’auto-assigner une adresse IPv6 globale, et router leur traffic IPv6 vers la Raspberry Pi, qui va le faire suivre a la Freebox.

Vous pouvez verifier que tout fonctionne en allant visiter le site http://test-ipv6.com/ qui devrait normalement vous retourner un score de 10/10.