Dans un [précédent post]( {% post_url 2014-04-06-configurer-bridge-vm %} ) 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:
{% highlight bash %}
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
{% endhighlight %}
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
etlxc.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)