Dedibox, IPv6 et OpenVZ
  2015-03-26

Utilisateur de longue date de Kimsufi (depuis ~2008), je suis en train de migrer progressivement tous mes services IPv6 sur une Dedibox.

Mais la doc officielle pour la mise en place de l’IPv6 n’a pas été suffisante, c’est pourquoi je partage mes notes à ce sujet.

L’état désiré

Avec OpenVZ, faire fonctionner plusieurs containers (VE) sur la Dedibox (Hardware Node), en veillant à ce que tous aient une connectivité IPv4/IPv6 vers le reste du monde. Le hardware node et les containers ont leur(s) propre(s) adresses IPv6.

IPv4 ne posant aucun problème, il n’en sera fait aucune mention dans ce billet.

La mise en place d’IPv6

Un “ancien” Kimsufi dispose de son propre bloc IPv6 /64 (maintenant une seule adresse IPv6), et il suffit de mettre son adresse IPv6 et la gateway en statique.

En revanche chez Online, il est possible de diviser son bloc IPv6 /48 attribué au niveau compte client (en tout cas pour les clients Dedibox) en plusieurs sous-réseaux /56, pour ensuite les utiliser sur le serveur de son choix, avec l’avantage de pouvoir les déplacer de serveur par la suite.

Pas de configuration statique de ces sous-réseaux (à moins de risquer de perdre la gateway si elle change), l’identification/routage des sous-réseaux /56 se fait avec la délégation de préfixe IPv6 possible avec DHCPv6.

Le principe:

  • Sur son compte Online, créer un nouveau sous-réseau /56
  • Récupérer le DUID (DHCP unique identifier) associé à ce sous-réseau
  • Configurer un client DHCPv6 avec ce DUID (cela permet d’associer le sous-réseau au serveur, et de recevoir entre autre la passerelle)
  • Sur l’interface réseau du serveur, configurer en statique une adresse IPv6 de ce sous-réseau ainsi que le masque.

La documentation officielle explique les différentes étapes en détail.

Pas de bol…

Après avoir constaté que le client DHCPv6 Dibbler ne fait pas l’unanimité (bugs récurrents, intégration aux distributions, …), reste le bon vieux client DHCPv6 ISC dhclient, dont la configuration est également détaillé dans la doc d’Online.

Une fois la configuration effectuée, comportement surprenant: au bout d’un moment, le traffic IPv6 du serveur semble bloqué, malgré une gateway IPv6 présente et bien valide:

$ ip -6 route|tail -1
default via fe80::7ada:6eff:fecb:efff dev eth0  proto kernel  metric 1024  expires 1796sec mtu 1500 advmss 1440 hoplimit 64

Le fait de réappliquer des configurations sysctl après attribution de l’IPv6 statique faisait marcher le routage à nouveau, bref, de la bonne magie noire.

Commence alors une longue soirée pour comprendre les interactions entre autoconfiguration IPv6, router advertisements, forwarding, les différents sysctl net.ipv6, …

Voici les liens qui m’ont aidé à y voir plus clair:

Note: le booléen à 3 états a bien été corrigé depuis:

accept_ra - INTEGER

La configuration

Voici la configuration que j’utilise sur une Debian Wheezy, le tout est stable depuis plusieurs jours:

$ dpkg -l|grep dhcp
ii  isc-dhcp-client   4.2.2.dfsg.1-5+deb70u6  amd64 ISC DHCP client
ii  isc-dhcp-common   4.2.2.dfsg.1-5+deb70u6  amd64 common files used by all the isc-dhcp* packages

Ici 2001:bc8:abcd:ef33/56 est mon sous-réseau IPv6:

# /etc/network/interfaces

iface eth0 inet6 static
    address 2001:bc8:abcd:ef33::9
    netmask 56

    # http://strugglers.net/~andy/blog/2011/09/04/linux-ipv6-router-advertisements-and-forwarding/
    # Enable forwarding
    pre-up echo 1 > /proc/sys/net/ipv6/conf/default/forwarding
    pre-up echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

    # But disable forwarding on THIS interface so we still get RAs
    pre-up echo 0 > /proc/sys/net/ipv6/conf/$IFACE/forwarding
    pre-up echo 1 > /proc/sys/net/ipv6/conf/$IFACE/accept_ra
    pre-up echo 0 > /proc/sys/net/ipv6/conf/$IFACE/autoconf
    pre-up echo 1 > /proc/sys/net/ipv6/conf/all/accept_ra
    pre-up echo 1 > /proc/sys/net/ipv6/conf/default/accept_ra

    pre-up dhclient -cf /etc/dhcp/dhclient6.conf -6 -P eth0
    pre-down dhclient -x -pf /var/run/dhclient6.pid

La séquence xx:xx:.. est le DUID que vous trouverez dans la page IPv6 de l’espace client Online:

# /etc/dhcp/dhclient6.conf

interface "eth0" {
    send dhcp6.client-id xx:xx:xx:xx:xx:xx:xx:xx:xx:xx;
    request;
}
# /etc/sysctl.conf

RIEN concernant net.ipv6.conf.*

ip6tables: n’oubliez pas d’ouvrir le traffic DHCPv6, protocole UDP et ports 546, 547 (Wikipedia: DHCPv6)

Les logs dhclient

Pour information, mon bail dhcp dure 1h:

Apr 11 09:36:32 server01 ssh dhclient: PRC: Renewing lease on eth0.
Apr 11 09:36:32 server01 dhclient: XMT: Renew on eth0, interval 9680ms.
Apr 11 09:36:32 server01 dhclient: RCV: Reply message on eth0 from fe80::7ada:6eff:fecb:efff.
Apr 11 10:36:32 server01 dhclient: PRC: Renewing lease on eth0.
Apr 11 10:36:32 server01 dhclient: XMT: Renew on eth0, interval 10390ms.
Apr 11 10:36:32 server01 dhclient: RCV: Reply message on eth0 from fe80::7ada:6eff:fecb:efff.
Apr 11 11:36:32 server01 dhclient: PRC: Renewing lease on eth0.
Apr 11 11:36:32 server01 dhclient: XMT: Renew on eth0, interval 10920ms.
Apr 11 11:36:32 server01 dhclient: RCV: Reply message on eth0 from fe80::7ada:6eff:fecb:efff.
Apr 11 12:36:32 server01 dhclient: PRC: Renewing lease on eth0.
Apr 11 12:36:32 server01 dhclient: XMT: Renew on eth0, interval 9390ms.
Apr 11 12:36:32 server01 dhclient: RCV: Reply message on eth0 from fe80::7ada:6eff:fecb:efff.
Apr 11 13:36:32 server01 dhclient: PRC: Renewing lease on eth0.
Apr 11 13:36:32 server01 dhclient: XMT: Renew on eth0, interval 9310ms.
Apr 11 13:36:32 server01 dhclient: RCV: Reply message on eth0 from fe80::7ada:6eff:fecb:efff.