Ziirish's Home :: Blog

Ziirish's Pub

 
 

Je sais que j'avais dit hier que dorénavant mes articles seraient en anglais, mais ce que je vais expliquer ici concerne un cas bien particulier qui va à priori intéresser un publique francophone.

Il y a quelques semaines, j'ai eu un problème avec ma ligne Free ADSL. En effet, un certain nombre de serveurs étaient injoignables :

root@zor0:~# traceroute amazon.fr
traceroute to amazon.fr (176.32.108.178), 30 hops max, 60 byte packets
 1  192.168.0.254 (192.168.0.254)  0.891 ms  2.105 ms  2.451 ms
 2  78.225.211.254 (78.225.211.254)  21.782 ms  23.053 ms  23.361 ms
 3  lille-6k-1-a5.routers.proxad.net (213.228.12.190)  25.862 ms  26.233 ms  28.344 ms
 4  boisgrenier-6k-1-po2.intf.routers.proxad.net (212.27.51.46)  28.731 ms  29.571 ms  30.050 ms
 5  gravelines-4k-1-v804.intf.routers.proxad.net (212.27.56.190)  30.507 ms *  32.239 ms
 6  londres-6k-1-po102.intf.routers.proxad.net (212.27.58.118)  40.686 ms  28.084 ms  28.326 ms
 7  * * *
 8  * * *
 9  * * *
[...]
root@zor0:~# traceroute wikipedia.org
traceroute to wikipedia.org (91.198.174.192), 30 hops max, 60 byte packets
 1  192.168.0.254 (192.168.0.254)  0.753 ms  2.198 ms  2.574 ms
 2  78.225.211.254 (78.225.211.254)  23.779 ms  23.854 ms  24.130 ms
 3  lille-6k-1-a5.routers.proxad.net (213.228.12.190)  26.074 ms  26.441 ms  28.323 ms
 4  boisgrenier-6k-1-po2.intf.routers.proxad.net (212.27.51.46)  27.814 ms  29.161 ms  29.569 ms
 5  gravelines-4k-1-v804.intf.routers.proxad.net (212.27.56.190)  32.225 ms * *
 6  londres-6k-1-po102.intf.routers.proxad.net (212.27.58.118)  40.156 ms  28.389 ms  28.779 ms
 7  * * *
 8  * * *
 9  * * *
[...]
root@zor0:~# traceroute fr-fr.facebook.com
traceroute to fr-fr.facebook.com (31.13.91.65), 30 hops max, 60 byte packets
 1  192.168.0.254 (192.168.0.254)  0.754 ms  1.790 ms  2.018 ms
 2  78.225.211.254 (78.225.211.254)  21.361 ms  23.164 ms  23.237 ms
 3  lille-6k-1-a5.routers.proxad.net (213.228.12.190)  25.661 ms  26.002 ms  27.445 ms
 4  boisgrenier-6k-1-po2.intf.routers.proxad.net (212.27.51.46)  29.782 ms  29.220 ms  31.100 ms
 5  gravelines-4k-1-v804.intf.routers.proxad.net (212.27.56.190)  32.023 ms  33.690 ms *
 6  londres-6k-1-po102.intf.routers.proxad.net (212.27.58.118)  39.973 ms  29.313 ms  28.057 ms
 7  * * *
 8  * * *
 9  * * *
[...]

Après avoir échangé avec le support Free, ils m'ont indiqué que le problème se situait bien de leur côté et touchait certains clients dans les départements 53 et 59.

Depuis la situation est rentrée dans l'ordre, mais le palliatif préconisé a été l'activation de l'IPv6 sur ma ligne.

Ci-après, je vais donc vous expliquer rapidement comment configurer votre serveur debian afin de tirer partie de l'IPv6. En prime, nous verrons comment configurer des VMs hébergées sur ce serveur afin qu'elles aient également accès à l'Internet en IPv6.

La première chose à faire est de récupérer votre adresse dans l'interface de Free :

IP free

IP free (direct link)

Dans mon cas, il s'agit de 2a01:e34:ee1d:3880::/64

Afin d'accéder à l'Internet en IPv6, il suffit juste d'activer l'IPv6 sur votre serveur, c'est le cas par défaut sur debian Wheezy. Ensuite, d'après le bloc que l'on a récupéré sur notre interface Free, on en déduit l'adresse de notre routeur : 2a01:e34:ee1d:3880::1. Il s'agit en fait de la première adresse disponible.

On ajoute donc la route :

ip -f inet6 route add 2a01:e34:ee1d:3880::1 dev eth0
ip -f inet6 route add default via 2a01:e34:ee1d:3880::1

Et c'est tout ! On a désormais à un réseau utilisé par... personne xD

Petite démonstration :

root@zor0:~# ping6 google.com
PING google.com(par03s12-in-x08.1e100.net) 56 data bytes
64 bytes from par03s12-in-x08.1e100.net: icmp_seq=1 ttl=58 time=52.0 ms
64 bytes from par03s12-in-x08.1e100.net: icmp_seq=2 ttl=58 time=51.5 ms
64 bytes from par03s12-in-x08.1e100.net: icmp_seq=3 ttl=58 time=53.4 ms
64 bytes from par03s12-in-x08.1e100.net: icmp_seq=4 ttl=58 time=52.7 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 51.560/52.441/53.425/0.700 ms
root@zor0:~# wget google.com -O /dev/null
--2014-11-28 13:43:11--  http://google.com/
Resolving google.com (google.com)... 2a00:1450:4007:805::1008, 74.125.195.138, 74.125.195.139, ...
Connecting to google.com (google.com)|2a00:1450:4007:805::1008|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://www.google.fr/?gfe_rd=cr&ei=3214VLLzGMXI8gfuioAo [following]
--2014-11-28 13:43:11--  http://www.google.fr/?gfe_rd=cr&ei=3214VLLzGMXI8gfuioAo
Resolving www.google.fr (www.google.fr)... 2a00:1450:400c:c05::5e, 173.194.67.94
Connecting to www.google.fr (www.google.fr)|2a00:1450:400c:c05::5e|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: `/dev/null'

    [ <=>                                                                                                                                                                                    ] 17,619      --.-K/s   in 0.08s   

2014-11-28 13:43:11 (221 KB/s) - `/dev/null' saved [17619]

Mais je vous avais promis de vous parler de mes VMs elles aussi reliées à ce beau réseau ;) J'ai ensuite découpé arbitrairement ce bloc afin de pouvoir attribuer plusieurs adresses à mes différentes VMs.

Afin de permettre à cette configuration de fonctionner, il faut activer le proxy NDP ainsi que l'IP forward pour IPv6.

On ajoute les deux lignes suivantes à notre fichier /etc/sysctl.conf :

net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.proxy_ndp = 1

Puis un petit coup de sysctl -p.

On va décider de configurer deux machines en IPv6. Pour ce faire, on va avoir besoin de 3 IPs :

  • Une pour l'interface bridge de ma machine hôte
  • Une pour la première VM
  • Une pour la seconde VM

Les IPs choisies sont donc les suivantes :

  • 2a01:e34:ee1d:3880::2/96 pour l'hôte
  • 2a01:e34:ee1d:3880::3/96 pour la première VM
  • 2a01:e34:ee1d:3880::4/96 pour la seconde VM

Le masque /96 a été choisi arbitrairement.

Ensuite on passe à la configuration réseau. Sur la machine hôte, on aura donc dans le fichier /etc/network/interfaces les lignes suivantes :

iface xenbr0 inet6 static
    address 2a01:e34:ee1d:3880::2
    netmask 96
    post-up /sbin/ip -f inet6 route add 2a01:e34:ee1d:3880::1 dev eth0
    post-up /sbin/ip -f inet6 route add default via 2a01:e34:ee1d:3880::1
    post-up /sbin/ip neigh add proxy 2a01:e34:ee1d:3880::4 dev eth0
    post-up /sbin/ip neigh add proxy 2a01:e34:ee1d:3880::3 dev eth0
    pre-down /sbin/ip -f inet6 route del default via 2a01:e34:ee1d:3880::1
    pre-down /sbin/ip -f inet6 route del 2a01:e34:ee1d:3880::1 dev eth0
    pre-down /sbin/ip neigh del proxy 2a01:e34:ee1d:3880::3 dev eth0
    pre-down /sbin/ip neigh del proxy 2a01:e34:ee1d:3880::4 dev eth0

Dans mon cas, l'interface xenbr0 est un bridge sur lequel sont reliées toutes mes VMs.

On remarque que j'ajoute les règles de proxy manuellement via la commande ip neigh add proxy xxx:xxxx:xxxx:xxxx::x dev eth0.

Et enfin, on sur les VMs, on aura dans le fichier /etc/network/interfaces les lignes suivantes :

iface eth0 inet6 static
    address 2a01:e34:ee1d:3880::3
    netmask 96
    post-up /sbin/ip -f inet6 route add 2a01:e34:ee1d:3880::2 dev eth0
    post-up /sbin/ip -f inet6 route add default via 2a01:e34:ee1d:3880::2
    pre-down /sbin/ip -f inet6 route del default via 2a01:e34:ee1d:3880::2
    pre-down /sbin/ip -f inet6 route del 2a01:e34:ee1d:3880::2 dev eth0

Un petit /etc/init.d/networking restart et c'est parti :

root@oxygen:~# traceroute6 google.com
traceroute to google.com (2a00:1450:4007:80c::100e), 30 hops max, 80 byte packets
 1  2a01:e34:ee1d:3880::2 (2a01:e34:ee1d:3880::2)  1.601 ms  1.591 ms  1.575 ms
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * 2001:4860::1:0:9f2 (2001:4860::1:0:9f2)  634.949 ms  634.952 ms
 7  2001:4860:0:1::319 (2001:4860:0:1::319)  634.932 ms  52.363 ms  53.949 ms
 8  par03s15-in-x0e.1e100.net (2a00:1450:4007:80c::100e)  55.137 ms  51.859 ms  53.676 ms
root@oxygen:~# ping6 google.com
PING google.com(par03s15-in-x0e.1e100.net) 56 data bytes
64 bytes from par03s15-in-x0e.1e100.net: icmp_seq=1 ttl=57 time=53.2 ms
64 bytes from par03s15-in-x0e.1e100.net: icmp_seq=2 ttl=57 time=52.0 ms
64 bytes from par03s15-in-x0e.1e100.net: icmp_seq=3 ttl=57 time=53.0 ms
64 bytes from par03s15-in-x0e.1e100.net: icmp_seq=4 ttl=57 time=51.5 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 51.568/52.473/53.221/0.749 ms
root@oxygen:~# wget google.com -O /dev/null
--2014-11-28 13:59:35--  http://google.com/
Resolving google.com (google.com)... 2a00:1450:4007:80c::100e, 74.125.195.102, 74.125.195.113, ...
Connecting to google.com (google.com)|2a00:1450:4007:80c::100e|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://www.google.fr/?gfe_rd=cr&ei=t3F4VL-2DLCx8welo4KIDQ [following]
--2014-11-28 13:59:35--  http://www.google.fr/?gfe_rd=cr&ei=t3F4VL-2DLCx8welo4KIDQ
Resolving www.google.fr (www.google.fr)... 2a00:1450:400c:c04::5e, 173.194.78.94
Connecting to www.google.fr (www.google.fr)|2a00:1450:400c:c04::5e|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: `/dev/null'

    [ <=>                                                                                                                                                                                    ] 17,597      --.-K/s   in 0.08s   

2014-11-28 13:59:35 (222 KB/s) - `/dev/null' saved [17597]

Pour l'instant c'est un peu manuel, mais il existe des outils afin d'automatiser cela si besoin. Dans mon cas c'est déjà une bonne base.