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