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) eteth1
le réseau local privé.On a bien des inet6 dont un
scope link
sureth0
. C'est une IP restreinte (car elle commence parfe80::
) 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'IP2a01: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