Freebox et les sous-réseaux IPv6

Abonné chez Free, je dispose d’une plage d’adresses IP version 6. Fini les translations d’adresses, on va pouvoir joindre directement toutes les machines (moyennant le filtrage), enfin :-)
Bienvenue dans le futur!

La plage réseau disponible est en /64. Certains blogs parlent d’un /56 réellement utilisable. Bref c’est bien plus que ce dont on a besoin…

Là où le bas blèse, c’est qu’il n’est visiblement pas prévu par Free de pouvoir subdiviser le réseau disponible. Toutes les machines doivent être dans une même plage IP unique.
Et si je veux ajouter mon routeur/pare-feu pour créer un sous-réseau de serveurs? Dommage.

Heureusement, tout n’est pas perdu. Il existe une solution :

Le proxy NDP
(proxy Neighbor Discovery Protocol, RFC4389).

Table des matières :
– Routeur de sortie
– Subneting
– Les services de l’Internet en IPv6
– Configuration réseau du pare-feu intermédiaire
– Configuration d’un serveur
– Activation du routage sur le pare-feu
– Activation du filtrage
– Et après… les paquets RA
– Liens externes

Routeur de sortie

Déjà, il faut retrouver l’adresse IP de la freebox. Sur les machines, la route par défaut en IPv6 est configurée avec l’adresse IP de lien local de la freebox (fe80:…). En fait, la freebox dispose aussi de la toute première adresse IP du réseau, c’est à dire l’adresse 0. Soit en pratique chez moi :

2a01:e35:2e22:7e80::

Ca fait un peu bizarre quand on est habitué à IPv4 et son adresse 0 réservée…

Subneting

Nous allons maintenant découper artificiellement le réseau. On va créer des sous réseaux avec un masque en /80. Le tout premier est obligatoirement utilisé sur le réseau qui contient la freebox. Son adresse ip fixe ne nous permet de la mettre dans un autre sous réseau.
Le sous réseau entre la freebox et le pare-feu que l’on installe sera :

2a01:e35:2e22:7e80::/80

La freebox est en 0, le pare-feu a une adresse aléatoire dans cette plage IP pour sa première interface (externe).

Les services de l’Internet en IPv6

Les services dont ont besoin les serveurs changent d’adresse IP mais aussi parfois de nom de domaine lorsqu’ils sont en IPv6.

En basculant en IPv6, la résolution de noms (DNS) ne fonctionnera plus avec les valeurs par défaut. Il faut changer les serveurs DNS (/etc/resolv.conf) et utiliser par exemple ceux de Google :

2001:4860:4860::8888
2001:4860:4860::8844

Le service de synchronisation du temps ne fonctionnera plus non plus avec la valeur par défaut du démon ntpd. Celui-ci essaye de se synchroniser sur pool.ntp.org. On peut utiliser à la place :

ntp.deuza.net
ntp.ciril.fr
ntp.univ-lyon1.fr

Les mises à jours du système d’exploitation utilise des dépôts de paquets logiciels, de ports de logiciels ou des sources de ceux-ci. Ces dépôts sont référencés par leurs noms de domaine. Ceux-ci fonctionnent parfois en IPv4 et IPv6, mais souvent ce n’est pas le cas. Voici quelques dépôts qui marchent :

Debian : ftp.fr.debian.org, ftp2.fr.debian.org
et security.debian.org
FreeBSD : ftp.fr.freebsd.org
OpenBSD : ftp.eu.openbsd.org

Configuration réseau du pare-feu intermédiaire

Note : Le pare-feu est une (petite) machine sous Debian Linux 7.0.0 avec deux interfaces réseaux.

On configure l’adresse de la passerelle par défaut en IPv6 sur le pare-feu intermédiaire. C’est à dire :

2a01:e35:2e22:7e80::

A partir de là, depuis le pare-feu, on doit pouvoir faire un ping vers un serveur connu en IPv6 :

ping6 xue6.nebule.org
PING xue6.nebule.org(2001:41d0:8:ea05::1) 56 data bytes
64 bytes from 2001:41d0:8:ea05::1: icmp_seq=1 ttl=57 time=29.0 ms
64 bytes from 2001:41d0:8:ea05::1: icmp_seq=2 ttl=57 time=31.0 ms
64 bytes from 2001:41d0:8:ea05::1: icmp_seq=3 ttl=57 time=29.7 ms
...

Comme la machine est maintenant autonome en IPv6, on désactive définitivement IPv4 (/etc/network/interfaces).

On configure la deuxième interface réseau (interne) du pare-feu avec un deuxième réseau IPv6 en /80. Par exemple le réseau :

2a01:e35:2e22:7e80:1:/80

Le pare-feu, qui est la passerelle par défaut du réseau, est à la première adresse, j’ai préféré la 1.

Configuration d’un serveur

A partir de maintenant, on peut configurer le ou les serveurs derrière le pare-feu avec des adresses du réseau 2a01:e35:2e22:7e80:1:/80 . On peut leur attribuer à la main des adresses aléatoire sans sortir de cette plage IP.

De la même façon que sur le pare-feu, on désactive IPv4. Donc il faut aussi ajuster la résolution de noms (DNS) en conséquence.

Un serveur sur le réseau doit avoir des réponses aux ping envoyés au pare-feu :

ping6 -n 2a01:e35:2e22:7e80:1::1
PING 2a01:e35:2e22:7e80:1::1(2a01:e35:2e22:7e80:1::1) 56 data bytes
64 bytes from 2a01:e35:2e22:7e80:1::1: icmp_seq=1 ttl=64 time=1.371 ms
64 bytes from 2a01:e35:2e22:7e80:1::1: icmp_seq=2 ttl=64 time=1.365 ms
64 bytes from 2a01:e35:2e22:7e80:1::1: icmp_seq=3 ttl=64 time=1.402 ms
...

Activation du routage sur le pare-feu

On active le forward en IPv6 ainsi que le proxy NDP sur eth0 :

sysctl -w net.ipv6.conf.default.forwarding=1
sysctl -w net.ipv6.conf.all.forwarding=1
sysctl -w net.ipv6.conf.default.proxy_ndp=0
sysctl -w net.ipv6.conf.all.proxy_ndp=0
sysctl -w net.ipv6.conf.eth0.proxy_ndp=1
ip neigh add proxy 2a01:e35:2e22:7e80:: dev eth1
ip neigh add proxy 2a01:e35:2e22:7e80:1:1234:5678:90ab dev eth0
ifconfig eth0 promisc

Note : La dernière ligne permet à l’interface eth0 de recevoir des paquets réseaux qui ne lui sont pas explicitement adressés. Ces paquets pourront ensuite être renvoyés vers les serveurs derrière le pare-feu.
De l’autre côté, les serveurs s’adressent naturellement au pare-feu parce que c’est leur passerelle par défaut.

Depuis un serveur derrière le pare-feu, on doit pouvoir faire un ping vers un serveur connu en IPv6 :

ping6 xue6.nebule.org
PING xue6.nebule.org(2001:41d0:8:ea05::1) 56 data bytes
64 bytes from 2001:41d0:8:ea05::1: icmp_seq=1 ttl=57 time=29.0 ms
64 bytes from 2001:41d0:8:ea05::1: icmp_seq=2 ttl=57 time=31.0 ms
64 bytes from 2001:41d0:8:ea05::1: icmp_seq=3 ttl=57 time=29.7 ms
...

On active cette configuration par défaut, c’est à dire dès le démarrage, dans /etc/sysctl.conf :

net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.proxy_ndp=0
net.ipv6.conf.all.proxy_ndp=0
net.ipv6.conf.eth0.proxy_ndp=1

On peut en profiter pour désactiver le forward en IPv4 en même temps :

net.ipv4.ip_forward=0

Les autres lignes de commandes sont placées dans le fichier /etc/rc.local avant la dernière ligne exit 0 :

ip neigh add proxy 2a01:e35:2e22:7e80:: dev eth1
ip neigh add proxy 2a01:e35:2e22:7e80:1:1234:5678:90ab dev eth0
ifconfig eth0 promisc

Activation du filtrage

Pour le filtrage, on fait les choses assez classiquement pour commencer. On supprime les paquets INVALID. On laisse passer les paquets ESTABLISHED et RELATED. On définit en DROP le comportement par défaut.

IPv6 nécessite que l’on s’attarde sur d’autres choses :
1. Penser à bloquer tous les paquets IPv4 par défaut si on ne l’utilise pas.
2. Il faut autoriser les paquets ICMPv6 qui concernent les Neighbour Solicitation et Neighbour Advertisement. Sans ça, rien ne marche.

Exemple de script, à ajouter à /etc/rc.local :

FREEBOX="2a01:e35:2e22:7e80::"
PAREFEU0="2a01:e35:2e22:7e80::1234:5678:90ab"
PAREFEU1="2a01:e35:2e22:7e80:1::1"
SERVEUR="2a01:e35:2e22:7e80:1::2"

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -F
iptables -X
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP
ip6tables -F
ip6tables -X

ip6tables -A INPUT -m state --state INVALID -j DROP
ip6tables -A OUTPUT -m state --state INVALID -j DROP
ip6tables -A FORWARD -m state --state INVALID -j DROP
ip6tables -A INPUT -m state --state ESTABLISHED -j ACCEPT
ip6tables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -m state --state ESTABLISHED -j ACCEPT

ip6tables -A INPUT -i eth0 -s fe80::/16 -d fe80::/16 -p icmpv6 --icmpv6-type neighbour-solicitation  -j ACCEPT
ip6tables -A INPUT -i eth0 -s fe80::/16 -d fe80::/16 -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPT
ip6tables -A INPUT -i eth0 -s fe80::/16 -d FREEBOX   -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPT
ip6tables -A INPUT -i eth0 -s fe80::/16 -d ff02::/16 -p icmpv6 --icmpv6-type neighbour-solicitation  -j ACCEPT
ip6tables -A INPUT -i eth1 -s $SERVEUR  -d $PAREFEU1 -p icmpv6 --icmpv6-type neighbour-solicitation  -j ACCEPT
ip6tables -A INPUT -i eth1 -s $SERVEUR  -d ff02::/16 -p icmpv6 --icmpv6-type neighbour-solicitation  -j ACCEPT

ip6tables -A OUTPUT -o eth1 -s $PAREFEU1 -d $SERVEUR  -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPT
ip6tables -A OUTPUT -o eth0 -s fe80::/16 -d ff02::/16 -p icmpv6 --icmpv6-type neighbour-solicitation  -j ACCEPT
ip6tables -A OUTPUT -o eth0 -s fe80::/16 -d fe80::/16 -p icmpv6 --icmpv6-type neighbour-solicitation  -j ACCEPT
ip6tables -A OUTPUT -o eth0 -s fe80::/16 -d $FREEBOX  -p icmpv6 --icmpv6-type neighbour-solicitation  -j ACCEPT
ip6tables -A OUTPUT -o eth0 -s fe80::/16 -d fe80::/16 -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPT
ip6tables -A OUTPUT -o eth0 -s $PAREFEU0 -d fe80::/16 -p icmpv6 --icmpv6-type neighbour-advertisement -j ACCEPT

ip6tables -A OUTPUT -o eth0 -s $PAREFEU0 -d $GOOGLEDNS4 -p icmpv6 --icmpv6-type echo-request -j ACCEPT
ip6tables -A OUTPUT -o eth0 -s $PAREFEU0 -d $GOOGLEDNS8 -p icmpv6 --icmpv6-type echo-request -j ACCEPT
ip6tables -A OUTPUT -o eth0 -s $PAREFEU0 -d $GOOGLEDNS4 -p udp --dport 53  -j ACCEPT
ip6tables -A OUTPUT -o eth0 -s $PAREFEU0 -d $GOOGLEDNS8 -p udp --dport 53  -j ACCEPT
ip6tables -A OUTPUT -o eth0 -s $PAREFEU0 -d $NTP1       -p udp --dport 123 -j ACCEPT
ip6tables -A OUTPUT -o eth0 -s $PAREFEU0 -d $SecurityDebianOrg -p tcp --dport 80 -j ACCEPT

ip6tables -A FORWARD -i eth1 -o eth0 -s $PAREFEU0 -d $GOOGLEDNS4 -p icmpv6 --icmpv6-type echo-request -j ACCEPT
ip6tables -A FORWARD -i eth1 -o eth0 -s $PAREFEU0 -d $GOOGLEDNS8 -p icmpv6 --icmpv6-type echo-request -j ACCEPT
ip6tables -A FORWARD -i eth1 -o eth0 -s $PAREFEU0 -d $GOOGLEDNS4 -p udp --dport 53  -j ACCEPT
ip6tables -A FORWARD -i eth1 -o eth0 -s $PAREFEU0 -d $GOOGLEDNS8 -p udp --dport 53  -j ACCEPT
ip6tables -A FORWARD -i eth1 -o eth0 -s $PAREFEU0 -d $NTP1       -p udp --dport 123 -j ACCEPT
ip6tables -A FORWARD -i eth1 -o eth0 -s $PAREFEU0 -d $SecurityDebianOrg -p tcp --dport 80 -j ACCEPT

Et après… Les paquets RA

Plutôt que de configurer à la main la passerelle par défaut sur les serveurs, on peut configurer le pare-feu pour qu’il se déclare comme routeur du réseau. Ainsi, il émette des paquets de type Router Advertisement (RA) pour prévenir les différents serveurs de sa présence.
De même on peut configurer le pare-feu pour qu’il accepte les RA envoyés par la Freebox.
Bon, à la maison, ça ne change pas grand chose. Mais en rêgle générale ce n’est pas une bonne idée. Ca facilite le travail d’un intrus sur le réseau pour la découverte de la topologie et le détournement de flux réseaux.

J’ai eu le cas sur mon pare-feu de test, celui-ci disposait de deux route pour le réseau 2a01:e35:2e22:7e80:: . Une en /80 et une en /64.
Il peut y avoir des problèmes de latence et de pertes de paquets lors de la traversée du pare-feu vers Internet. Il faut modifier le comportement du pare-feu vis-à-vis des annonces de routeurs :
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.eth0.accept_ra=0
net.ipv6.conf.eth1.accept_ra=0

Liens externes

http://fr.wikipedia.org/wiki/Neighbor_Discovery_Protocol
http://tools.ietf.org/html/rfc4389
http://linux-attitude.fr/post/proxy-ndp-ipv6
http://kurt.seifried.org/2010/04/26/ipv6-and-openbsd-part-1/
http://lists.debian.org/debian-ipv6/2009/03/msg00002.html
http://lionel.parmentier.free.fr/?p=317
http://rene.margar.fr/2010/08/regles-de-firewall-pour-un-pont-ipv6/
http://en.gentoo-wiki.com/wiki/IPV6_And_Freebox
http://cv.arpalert.org/free_ipv6.html
http://forums.freebsd.org/showthread.php?t=21804
http://medi-inf.org/~kurbel/blog/blog/2012/08/03/ipv6-on-freebsd-rootserver-hosted-by-ovh/
http://forum.kimsufi.co.uk/showthread.php?t=721
http://blog.bashy.eu/2011/03/paquet-router-advertisement/
https://www.cru.fr/services/ntp/serveurs_francais

Une réflexion sur « Freebox et les sous-réseaux IPv6 »

  1. Rectification,

    Je viens de me rendre compte que la nouvelle interface de la freebox, disponible à l’adresse http://mafreebox.free.fr/ , permet maintenant de gérer le re-routage de réseaux IPv6 à l’intérieur du LAN.
    Ca se passe dans « Paramètres de la Freebox » > « Mode avancé » > « Configuration IPv6 » :-D

Les commentaires sont fermés.