Ajouter une IP failover à un container LXC

  • ovh
  • IP failover
  • adresse MAC
  • lxc
  • linux container
  • machine virtuelle
  • bridge

Dans un précédent post nous expliquions comment attribuer une IP failover achetée chez OVH vers une machine virtuelle exécutée par l'hyperviseur KVM. Il est également possible d'associer l'IP au conteneur LXC, ce que nous proposons d'expliquer ici.

La configuration a lieu en deux étapes :

  • d'abord, configurer un bridge sur la machine hôte. Cette opération n'est, évidemment, à exécuter que lors de la première installation ;
  • ensuite, manipuler le fichier de configuration du conteneur pour qu'il crée une interface réseau qui ira se connecter au réseau OVH, via le bridge. Cette opération est à répéter pour chaque conteneur LXC.

Nous assumons que:

  • vous possédez une adresse IP Failover chez OVH ;
  • et que vous avez créé une adresse MAC virtuelle via l'interface d'administration du fournisseur.

Créer le bridge sur la machine hôte

Pour cela, éditer le fichier /etc/network/interfaces :

(conseil: sauvegardez le fichier d'origine avant toute modification ! Une mauvaise configuration peut faire perdre l'accès réseau au serveur, et, partant, toute possibilité de connexion via ssh. Si vous êtes dans le cas, vous devrez redémarrer le serveur en mode rescue et corriger la configuration.)

Dans l'exemple ci-dessous, l'IP de l'hôte est 94.23.44.XXX. Vous pouvez déterminer l'adresse de broadcast telle que décrit dans ce guide. Il suffit de remplacer les trois derniers chiffre de l'adresse IP de l'hôte par 254.

Voici ce vers quoi vous devriez arriver sur la machine hôte:

# The loopback network interface
auto lo
iface lo inet loopback

auto eth0

iface eth0 inet manual

iface eth0 inet6 manual

auto br0 
iface br0 inet static
        address 94.23.44.XX
        netmask 255.255.255.0
        network 94.23.44.0
        broadcast 94.23.44.255
        gateway 94.23.44.254
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridg_maxwait 0

iface br0 inet6 static
        address 2001:41D0:2:2D88::1
        netmask 64
        post-up /sbin/ip -f inet6 route add 2001:41D0:2:2Dff:ff:ff:ff:ff dev eth0
        post-up /sbin/ip -f inet6 route add default via 2001:41D0:2:2Dff:ff:ff:ff:ff
        pre-down /sbin/ip -f inet6 route del default via 2001:41D0:2:2Dff:ff:ff:ff:ff
        pre-down /sbin/ip -f inet6 route del 2001:41D0:2:2Dff:ff:ff:ff:ff dev eth0

Ceci fait, il est normalement possible de redémarrer le réseau sans quitter la console : service networking restart (en mode root). La machine doit continuer à répondre au ping.

La commande ifconfig doit renvoyer ceci :

br0       Link encap:Ethernet  HWaddr 74:d0:2b:26:be:82  
          inet addr:94.23.44.XXX  Bcast:94.23.44.255  Mask:255.255.255.0
          inet6 addr: 2001:41d0:2:2d88::1/64 Scope:Global
          inet6 addr: fe80::76d0:2bff:fe26:be82/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:10158 errors:0 dropped:1 overruns:0 frame:0
          TX packets:10651 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1285075 (1.2 MB)  TX bytes:2848337 (2.8 MB)

eth0      Link encap:Ethernet  HWaddr 74:d0:2b:26:be:82  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:11366 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11679 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1613287 (1.6 MB)  TX bytes:2998767 (2.9 MB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:5606 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5606 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:862871 (862.8 KB)  TX bytes:862871 (862.8 KB)

Créer et configurer le container LXC

Vous pouvez créer un container LXC suivant la démarche habituelle, avec la commande lxc-create. Cela aboutira à la création d'un container et... d'un fichier de configuration. C'est ce fichier qui va nous intéresser. Sous Ubuntu, le fichier de configuration d'un container créé sous l'utilisateur root est sité dans le répertoir /var/lib/lxc/<nom du conteneur>/config.

Dans l'exemple suivant, l'adresse IP failover est 87.98.253.aaa. Le fichier est à modifier comme suit (voir les commentaires) :

# Les premières options et en-têtes sont omises ici


# Network configuration
# ici est configuré un accès au réseau interne, qui permet aux containers de se connecter entre eux.
# Vous pouvez éventuellement la supprimer (jamais essayé)
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.network.hwaddr = 00:16:3e:55:52:55

# ici le fichier est modifié :

# on donne un nom à la première interface (celle pour le réseau interne)
lxc.network.name = eth0
# on donne un nom à l'interface telle qu'elle apparait depuis l'hôte
lxc.network.veth.pair = vethVMMailpriv

# on crée une seconde interface :
lxc.network.type= veth
lxc.network.flags = up
# cette interface va se connecter au bridge créé sur l'ĥôte:
lxc.network.link = br0
# on donne un nom à cette seconde interface :
lxc.network.name = eth1
# on attribue directement l'adresse IP failover
# la notation est importante: elle prend la forme ip/masque broadcast (ici l'adresse de broadcast est la même que l'adresse IP)
lxc.network.ipv4 = 87.98.253.aaa/32 87.98.253.aaa
# on indique également l'adresse MAC virtuelle générée par l'interface admin d'OVH:
lxc.network.hwaddr = 02:00:00:fb:8a:ef
# on indique un nom pour qu'elle soit évidente dans l'hôte
lxc.network.veth.pair = vethVMMailpub
# et on renseigne la gateway de la machine virtuelle, qui est la même que celle de l'hôte:
lxc.network.ipv4.gateway = 37.59.6.254

Il n'est pas nécessaire de modifier le fichier /etc/network/interfaces à l'intérieur du container. Si cela est fait, cela ne pose pas de problème particulier. Par contre, il ne faut pas omettre d'ajouter la configuration réseau au fichier de configuration du conteneur (le fichier config). En cas d'omission, le réseau est instable: il semble que parfois le conteneur suit son propre fichier de configuration (/etc/network/interfaces), parfois la machine hôte supprime la configuration créée à l'intérieur du conteneur, et l'accès à internet est perdu depuis le conteneur.

Si vous désirez ajouter des routes supplémentaires au démarrage de l'interface, il est possible de les ajouter au container :

  • directement dans le fichier /etc/network/interfaces du container (via la commande post-up)
  • via le fichier de configuration, en utilisant l'option lxc.network.script.up et lxc.network.script.down telle que décrite dans la documentaiton du fichier de configuration.

Effet sur l'hôte

Après le démarrage du container, la commande ifconfig devrait indiquer les nouvelles interfaces publiques et privée du container :

br0       Link encap:Ethernet  HWaddr 00:25:90:71:xx:xx  
          inet addr:xxx.xxx.xxx.xxx  Bcast:xxx.xxx.xxx.xxx  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6899848 errors:0 dropped:7548 overruns:0 frame:0
          TX packets:5993110 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1423848105 (1.4 GB)  TX bytes:685448492 (685.4 MB)

eth0      Link encap:Ethernet  HWaddr 00:25:90:71:xx:xx  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:38346657 errors:0 dropped:0 overruns:0 frame:0
          TX packets:27003050 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:7598557003 (7.5 GB)  TX bytes:10480865550 (10.4 GB)
          Interrupt:16 Memory:fbce0000-fbd00000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:2326626 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2326626 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:320451368 (320.4 MB)  TX bytes:320451368 (320.4 MB)

lxcbr0    Link encap:Ethernet  HWaddr fe:12:6f:93:75:6c  
          inet addr:10.0.3.1  Bcast:10.0.3.255  Mask:255.255.255.0
          inet6 addr: fe80::509e:33ff:fe1c:b0f5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2293856 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2226704 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:182953795 (182.9 MB)  TX bytes:460284425 (460.2 MB)

vethVMMailpriv Link encap:Ethernet  HWaddr fe:1e:61:76:89:55  
          inet6 addr: fe80::fc1e:61ff:fe76:8955/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2109538 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1986346 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:426540050 (426.5 MB)  TX bytes:343043225 (343.0 MB)

vethVMMailpub Link encap:Ethernet  HWaddr fe:59:f4:31:xx:xx  
          inet6 addr: fe80::fc59:f4ff:fe31:222b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8697094 errors:0 dropped:0 overruns:0 frame:0
          TX packets:39146399 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:6831530014 (6.8 GB)  TX bytes:8189090228 (8.1 GB)