IPv6 ready !

World_IPv6_launch_banner
World IPv6 launch !

Et ouais, j'ai profité de la migration de serveur pour m'intéresser à IPv6, vu que c'est l'avenir et que ça permet quelques trucs bien cool (déjà dégager le NAT). Pis ça permet d'avoir la classe en s'inscrivant sur http://www.worldipv6launch.org/.

Et en fait, c'est pas si compliqué que ça à mettre en place (en tout cas, sur mon serveur qui, il est vrai, ne fait rien de bien compliqué).

Voyons voir comment mettre ça en place sur un serveur avec des containers lxc dedans.

Situation de départ

On va reprendre la situation où elle en était à la fin de mon article sur la création de lxc :

  • un dom0 avec une interface eth0 qui donne sur internet et une interface bridge, br0 qui émule un réseau local.
  • des containers, qui possèdent tous une interface eth0. On ne traitera qu'un container, la copie des manipulations étant sans piège.
  • un champ d'ip publiques IPv6, mettons 2001:B0E:42:42::/64, fourni par mon hébergeur/FAI/la nasa…
  • la commande ip, fournie par le paquet iproute sous Debian

Choisir les ip

L'ip de la passerelle, chez Ovh (chez qui je loue mon serveur), se déduit de votre champ d'ip. Dans le cas fictif qui nous occupe, ce sera 2001:B0E:42:ff:ff:ff:ff:ff/128 => on prend l'ip de son sous-réseau et on s'arrange pour caler 5 « FF » à la fin. Voir ici pour plus de détails.

L'ip de l'interface eth0 du dom0 : 2001:B0E:42:42::1

L'ip de l'interface br0 du dom0 : 2001:B0E:42:42::2

L'ip de l'interface eth0 du container : 2001:B0E:42:42::3

J'ai pris 3 ip consécutives parce c'est plus simple à retenir mais vous faites comme vous voulez.

Quelques fichiers de conf

Dans le fichier /etc/sysctl.conf du dom0 (merci à Pierre-Philippe d'avoir remarqué cet oubli) :

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

Dans le fichier /etc/network/interfaces du dom0 :

iface eth0 inet6 static
    address 2001:B0E:42:42::1
    netmask 128
iface br0 inet6 static
    address 2001:B0E:42:42::2
    netmask 64

On ne s'occupe pas de mettre la passerelle (instruction gateway) car… ça ne marche pas ! Je ne sais pas pourquoi, sans doute un bug passager.

Dans celui du container :

iface eth0 inet6 static
    address 2001:B0E:42:42::3
    netmask 64

Dans le fichier de config du lxc (/var/lib/lxc/lxchostname/config) :

lxc.network.ipv6 = 2001:41d0:2:9c::3/64

 Mettre en place la passerelle

À cause du bug mentionné au-dessus, j'ai du placer la configuration de la passerelle dans le fichier /etc/rc.local.

C'est à ce moment que la commande ip devient utile. Faites des tests en ligne de commande avant d'écrire dans /etc/rc.local, c'est plus simple.

Quelques commande de bases :

ip -6 r(oute) l(ist)
=> affiche les routes ipv6 existantes

ip -6 r(oute) a(dd) 2001:B0E:42:ff:ff:ff:ff:ff dev eth0
=> ajoute une route ipv6 sur eth0

ip -6 r(oute) d(elete) 2001:B0E:42:ff:ff:ff:ff:ff dev eth0
=> supprime la route ipv6

ip -6 neigh add proxy 2001:B0E:42:42::3 dev eth0
=> indique que eth0 doit transmettre (forwarder) les requêtes adp à l'adresse suivante. On utilisera cette commande pour chacune des ip des containers.

Pour le dom0

ip -6 route add default via 2001:B0E:42:ff:ff:ff:ff:ff dev eth0
ip -6 neigh add proxy 2001:B0E:42:42::2 dev eth0
ip -6 neigh add proxy 2001:B0E:42:42::3 dev eth0

La première ligne est assez normale : par où faut-t'il passer pour aller vers le net.

La deuxième sert à assurer que la recherche de la machine ayant l'ip 2001:B0E:42:42::2 (br0 du dom0) sera bien transmise et que le container pourra bien répondre à cette sollicitation. Pareil pour la troisième ligne (eth0 du container).

On pourra voir avec ip -6 r l que les routes

2001:B0E:42:42::1 dev eth0  proto kernel  metric 256
2001:B0E:42:42::/64 dev br0  proto kernel  metric 256

ont été créées toutes seules comme des grandes (nécéssite peut-être un redémarrage et pas juste une activation des IPv6 sur les différentes interfaces).

Pour le container

ip -6 route add 2001:B0E:42:42::1 via 2001:B0E:42:42::2 dev eth0
ip -6 route add default via 2001:B0E:42:42::2 dev eth0

Voilà qui peut sembler étrange de spécifier la route de 2001:B0E:42:42::1 (eth0 du dom0) en passant par 2001:B0E:42:42::2 (br0 du dom0). En fait, pas du tout. Comme l'interface eth0 du container fait partie du réseau 2001:B0E:42:42/64, le serveur pense qu'il peut accéder à 2001:B0E:42:42::1 directement, or il lui faut passer par br0.

Ce problème est évitable en mettant les interfaces des containers, ainsi que br0 dans un /65 (ou un réseau encore plus petit) distinct de celui de l'interface eth0 du dom0. Je ne l'ai pas fait au début et ensuite ça m'embêtait de changer toute ma configuration.

Fini

Voilà, normalement, c'est tout bon. Vous pouvez tester votre configuration à grands coups de

ping6 ipv6.google.com

ou n'importe quel autre serveur dont vous savez qu'il répond aux pings IPv6 (fiat-tux.fr ne répondra pas : je bloque le ping des ip que je ne connais pas, désolé) . Pensez à le faire depuis tous les containers, on ne sait jamais.

Vous pouvez tester que le serveur choisit est bien censé répondre aux ping6 sur cette page.

Et si j'ai dit une bêtise ou que vous avez une question, je suis à votre disposition !

11 réflexions au sujet de “IPv6 ready !”

  1. Bonjour
    je vais enfin pouvoir configurer mes LXC chez ovh (kimsufi) j’espère !!!!
    ça fai 15 jours que j’essaie sans succés
    d’abord la passerelle donc il explique de caser les 5 ff
    exemple
    mon adresse collectée sur le manager OVH 2001:41d0:x:xxxx::1 cet adresse est pingable depuis l’extérieur
    donc la passerelle d’après ovh le lien que vous donnez est 2001:41d0::x:xff:ff:ff:ff:ff et là patatra pas bon car
    route -A inet6 add default gw 2001:41d0:x:xFF:FF:FF:FF:FF dev br0
    Aucun chemin d’accès pour atteindre l’hôte cible (réponse de la console)
    donc j’essaie ça qui me parais plus normal
    route -A inet6 add default gw 2001:41d0:x:xxFF:FF:FF:FF:FF dev br0
    console dit rien donc ok
    mes conteneurs lxc ne trouvent pas la sortie pour autant
    bon juste je voulais m’assurer de la passerelle dans un premier temps
    Cordialement
    PP

    • Si ton adresse ipv6 fournie par ovh est 2001:41d0:x:abcd::/64, l’adresse du routeur devrait être 2001:41d0:x:abff:ff:ff:ff:ff.
      Si c’est 2001:41d0:x:abc::/64, ce sera alors 2001:41d0:x:aff:ff:ff:ff:ff
      Si c’est 2001:41d0:x:ab::/64, ce sera alors 2001:41d0:x:ff:ff:ff:ff:ff

      Tu as donc la bonne adresse de routeur.
      Après, tu fais passer la route par défaut par l’interface br0, ce qui, d’après ton commentaire suivant, semble logique puisque tu as lié eth0 à br0. Et là, nos configurations diffèrent (cf le précédent article sur les lxc). Je garde eth0 indépendante mais je crée une interface dummy0 qui sera liée à br0, de même que toutes les eth0 des containers.

      Un bon outil qui m’a permis de troubleshooter ma conf ipv6, c’est tcpdump.
      Lance un tcpdump -i br0 ip6 sur le dom0 et le même sur l’eth0 d’un container, et lance un ping6 depuis le container pour voir ce que ça donne.

      Enfin, est-ce que tu as fait ça sur le dom0 : ip -6 neigh add proxy 2001:B0E:42:42::2 dev br0 ? (ou un truc équivalent hein!)
      Parce que si ce n’est pas le cas, le ping6 sortira du container, atteindra le serveur en face mais ne retournera jamais dans le container. (enfin, c’est ça qui m’est arrivé)

  2. re
    un truc que je pige pas, tu ne rattaches pas br0 à eth0 du serveur ?
    si je ne le fais pas il ne me configure pas br0 sur le serveur
    Cordialement
    pp

  3. Re à oui
    je ne suis jamais arrivé à relier br0 à dummy0
    donc je relie br0 à eth0
    j’ai testé ça pour relier br0 à dummy0

    auto dummy0
    iface dummy0 inet6 manual

    auto br0
    iface br0 inet6 static
    address 2001:41d0:x:xxxx::2
    netmask 64
    bridge_ports dummy0
    bridge_fd 0
    bridge_maxwait 0

    La réponse de la consol après un /etc/init.d/networking restart
    Reconfiguring network interfaces…br0: ERROR while getting interface flags: No such device
    Failed to bring up br0.

    Voilà comme j’ai toujours eu ce souci j’ai bridger br0 direct à eth0 voir commentaires dans ton topic LXC ipv4 (+d’un an)

    Parcontre je peus configurer dummy0 comme une eth0 normal ça fonctionne et j’ai une adresse dummy0, mais je n’arrive pas à relier br0 dessus
    Alors que relier l’interface bridge br0 à eth0 pas de problème, quelque chose doit m’échapper.

    Libre c’est chouette (on reste dans les oiseaux)

  4. re re !!
    Juste
    Pour le container ce là veut bien dire dans la configuration du conteneu.
    /lxc/myconteneur/etc/rc.local par example
    A+
    pp

    • Chez moi ça sera /lxc/mycontainer/rootfs/etc/rc.local
      J’imagine que c’est un oubli de ta part.

      Mais oui, c’est bien là.

  5. Bonjour,

    Merci pour ce HOWTO, ça m’a vraiment aidé.

    Mais je rencontre toujours des problèmes:
    – je finis par avoir de la connectivité IPv6 dans mon LXC
    – MAIS la configuration est « flaky »:
    si je ping par exemple « ping6 facebook.com » depuis le LXC, il commence par ne rien faire. Ensuite je commence à pinger le même host dans dom0, je commence par obtenir « network down » (~20 entrées) puis fini par trouver l’IPv6 de facebook.com et au même moment commence à pinger dans le LXC. Si je désactive les « neigh proxy », j’ai plus d’IPv6 dans LXC mais j’ai plus de « network down » dans le dom0.

    Pourriez vous publier /etc/network/interfaces de votre LXC et de votre dom0, ainsi que rc.local…. J’aimerais vérifier que je n’ai pas fait d’erreur.

    Merci

    • Arf ! Désolé du temps de réponse, j’ai pas eu le temps sur le moment et ensuite c’était les vacances.

      Voici mon /etc/network/interfaces :

      # This file describes the network interfaces available on your system
      # and how to activate them. For more information, see interfaces(5).

      # The loopback network interface
      auto lo
      iface lo inet loopback

      auto eth0
      iface eth0 inet static
      address 91.121.211.156
      netmask 255.255.255.0
      network 91.121.211.0
      broadcast 91.121.211.255
      gateway 91.121.211.254

      iface eth0 inet6 static
      address 2001:41d0:2:9c::42
      netmask 128

      auto br0
      iface br0 inet static
      address 192.168.1.1
      netmask 255.255.255.0
      network 192.168.1.0
      broadcast 192.168.1.255
      bridge_ports dummy0
      bridge_fd 0
      bridge_maxwait 0
      pre-up /sbin/modprobe dummy
      iface br0 inet6 static
      address 2001:41d0:2:9c::142
      netmask 64

      Et le rc.local :

      ip -6 route add 2001:41d0:2:ff:ff:ff:ff:ff dev eth0
      ip -6 route add default via 2001:41d0:2:00FF:FF:FF:FF:FF dev eth0
      ip -6 neigh add proxy 2001:41d0:2:9c::142 dev eth0
      ip -6 neigh add proxy 2001:41d0:2:9c::242 dev eth0
      ip -6 neigh add proxy 2001:41d0:2:9c::342 dev eth0
      ip -6 neigh add proxy 2001:41d0:2:9c::442 dev eth0
      ip -6 neigh add proxy 2001:41d0:2:9c::542 dev eth0
      ip -6 neigh add proxy 2001:41d0:2:9c::642 dev eth0
      ip -6 neigh add proxy 2001:41d0:2:9c::742 dev eth0
      ip -6 neigh add proxy 2001:41d0:2:9c::842 dev eth0
      ip -6 neigh add proxy 2001:41d0:2:9c::942 dev eth0
      ip -6 neigh add proxy 2001:41d0:2:9c::1042 dev eth0

      exit 0

      En espérant que ça puisse t’aider.

Les commentaires sont fermés.