Sur mon serveur chez OVH, j’ai un ensemble de machines virtuelles KVM et (bientôt) de conteneurs LXC. Pour fournir du réseau à tout ce petit monde, j’utilise de l’IPv4 et de l’IPv6, voici comment c’est configuré.

Pour l’IPv4, on a un nombre limité d’IP publiques parce que ça vaut de la thune et que ça va être de plus en tendu de multiplier les adresses, il nous faut un réseau privé (beurk), du NAT (rebeurk) et des redirections à base d’iptables (re-rebeurk). Il nous faut surtout un bridge, c’est une Debian donc ça se passe dans /etc/network/interfaces :

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        bridge_ports eth0
        bridge_fd 0
        bridge_maxwait 0
        address 188.165.205.xxx
        netmask 255.255.255.0
        network 188.165.205.0
        broadcast 188.165.205.255
        gateway 188.165.205.254
        post-up iptables -t nat -A POSTROUTING -s 10.42.0.0/24 -o br0 -j SNAT --to 188.165.205.xxx
        pre-down iptables -t nat -D POSTROUTING -s 10.42.0.0/24 -o br0 -j SNAT --to 188.165.205.xxx

iface br0 inet6 static
        address 2001:41D0:xxxx:96ce::1
        netmask 64

auto br0:0
iface br0:0 inet static
        address 10.42.0.1
        netmask 255.255.255.0

Pour le bridge, on met l’IPv4 publique et une règle iptable pour NAT-er ce qui sort. Le réseau privé est 10.42.0.0/24, on peut bien sûr choisir ce qu’on veut dans ce que fourni la RFC 1918.

Pour l’IPv6, chez OVH c’est bizarre : il fournissent un prefix 64 bit et avec une route accessible sur le /56 incluant, mais pas à partir du /64. Il faut donc ruser de la façon suivante niveau routage.

On assigne l’IPv6 avec le prefix /64, c’est plus propre, sinon le kernel se plaint avec /56 :

# ip -6 addr add 2001:41D0:xxxx:96ce::1/64 dev br0

On met une route pour atteindre la gateway dans le /56 :

# ip -6 route add 2001:41d0:xxxx:96ce::/56 dev br0

On met la route par défaut :

# ip -6 route add default via 2001:41d0:xxxx:96ff:ff:ff:ff:ff

Pour avoir cette configuration appliquée automatiquement, il faut créer /etc/network/if-up.d/ovh-ipv6-route :

#!/bin/sh

if [ "$IFACE" = "br0" ]; then
    ip -6 route add 2001:41d0:2:96ce::/56 dev br0
    ip -6 route add default via 2001:41d0:2:96ff:ff:ff:ff:ff
fi

Et pour l’arrêt, /etc/network/if-down.d/ovh-ipv6-route :

#!/bin/sh

if [ "$IFACE" = "br0" ]; then
    ip -6 route del default via 2001:41d0:2:96ff:ff:ff:ff:ff
    ip -6 route del 2001:41d0:2:96ce::/56 dev br0
fi

Il faut ensuite activer le forward entre interfaces, sinon pas de routage vers les VM, dans /etc/sysctl.conf :

net.ipv6.conf.all.forwarding=1

Enfin, le routage chez OVH ne permet pas d’intercaler un routeur pour découper le /64, il faut donc ruser avec du proxy NDP (Neighbor Discovery Protocol).

On active le proxy NDP, dans /etc/sysctl.conf :

net.ipv6.conf.all.proxy_ndp=1

On ajoute les IP à proxiser, celle de la gateway et chacune des IP fournies aux VM :

# ip neigh add proxy 2001:41d0:xxxx:96ff:ff:ff:ff:ff dev br0
# ip neigh add proxy 2001:41d0:xxxx:96ce::2 dev br0

En cas de reboot d’une VM, il faut d’abord virer ses IP du proxy, puis les remettre, sinon le kernel de la VM se plein d’une duplication d’adresse :

# ip neigh del proxy 2001:41d0:xxxx:96ce::2 dev br0
-> reboot de la VM
# ip neigh add proxy 2001:41d0:xxxx:96ce::2 dev br0