Préambule

Comme on peut s’en douter en lisant le titre de cet article, on ne va pas causer des tartelettes au maroilles de ma grand-mère mais plutôt des Linux Containers et de leurs mises en place sur une distribution Debian GNU/Linux Stretch

Mais avant toutes chose, je me dois de rendre à César ce qui est à César en mentionnant que cet article n'aurait jamais pu voir le jour sans l'aide de Valère, je tiens donc à le remercier pour toute l'aide apportée et la patience dont il a fait preuve.

Prérequis et convention de nommage

Je pars du principe que l’on dispose d’une machine assez véloce et disposant d’assez d’espace disque pour installer plusieurs containers.
Le but final étant de disposer de container ayant chacune une IP publique spécifique, il nous faut aussi des IPs supplémentaires à attribuer à chaque container.
Partant d’un serveur loué chez SoYouStart – le compromis entre les kimsufi et les dédiés OVH – la gestion des IPs se réalisera directement via leur fabuleuse interface web…
Je détaillerais l’installation du serveur, la déclaration des IPs, la mise en place des MAC virtuelles et la création des containers.

Dans la suite de l'article le HOST désignera le serveur et les VM les containers.

Partir d’une Debian Jessie

Pourquoi donc, me direz-vous ? Et bien tout simplement parce que OVH a modifié l’image de Stretch pour passer la gestion du réseau de SysV à SystemD par défaut lors de l’installation. Pourquoi pas, après tout cela va bien finir par arriver…

Cependant, ce n’est pas encore le cas lors de l'installation de base d’une Debian Stretch et, surtout, la documentation officielle fournit par OVH pour la gestion des IPs supplémentaires à travers systemd-networkd et légèrement incomplète et foireuse… Mais là n’est pas le débat.

Du coup je pars d’une installation depuis une Jessie 8.10 sur la-quelle j’opère une montée en version.

Mise à jour et installation de lxc

Pour la montée en version, rien de bien compliqué, on modifie le nom de la distribution dans le source.list et on upgrade :

 [root:~] # sed -i -e "s/jessie/stretch/g" /etc/apt/sources.list
 [root:~] # apt update && apt full-upgrade -y && apt autoremove -y && apt clean
 [root:~] # reboot

Et nous voilà sur une Debian Strech !

On passe ensuite à l’installation des paquets nécessaire à la mise en place de LXC et du futur pont réseau.

[root:~] # apt install lxc libvirt0 libpam-cgroup libpam-cgfs bridge-utils dnsmasq-base debootstrap

Nous sommes à présent en mesure de créer des containers !

Création d’un pont réseau

Afin de pouvoir attacher de manière simple nos IPs supplémentaires sur nos containers, on crée d’abord un pont sur l’interface réseau principale du host en modifiant le fichier /etc/network/interfaces

Attention : Ici l’interface principal du host se nomme eth0 ce qui n’est pas forcement le cas en fonction de la distribution utilisée. De plus une sauvegarde du fichier interfaces d’origine peut s’avérer être une bonne idée.

Le fichier une fois modifié :

auto lo
iface lo inet loopback

auto br0
iface br0 inet static
    address 91.42.71.10
    netmask 255.255.255.0
    network 91.42.71.0
    broadcast 91.42.71.255
    gateway 91.42.71.254
    bridge_ports eth0
    bridge_sto off
    bridge_fd 0
    bridge_maxwait 0

Un petit reboot de la machine et, si tout c’est bien déroulé, le pont est désormais actif.

IPs supplémentaires

Bien entendu, avant d’attribuer une adresse publique à notre container, il faut être en sa possession.
Sur l’interface web de Sys cela ce passe dans le menu IP par le biais duquel – moyennant fiance (1.20 € TTC en septembre 2018) – on active les IPs supplémentaires pour notre serveur.

Une fois en possession d’une adresse, on génère une MAC virtuelle de type OVH sur celle-ci via la petite roue crantée en bout de ligne.
On peut aussi lui attribuer un reverse et une IPv6, à condition de les avoir déjà déclarées dans votre zone DNS.

Création et configuration d’un container

Une fois en possession de notre IP et de son adresse MAC virtuelle associée, on peut créer un container et le configurer.

[root:~] # lxc-create -t debian -n nomdemaVM

La création de la première machine peut-être un peu longue, servez-vous donc un café.

Une fois la création terminée, un fichier de configuration spécifique pour notre VM a été créé :

[root:~] # cat /var/lib/lxc/nomdemaVM/config


# Uncomment the following line to support nesting containers:
#lxc.include = /usr/share/lxc/config/nesting.conf
# (Be aware this has security implications)

lxc.network.type = empty
lxc.rootfs = /var/lib/lxc/nomdemaVM/rootfs
lxc.rootfs.backend = dir

# Common configuration
lxc.include = /usr/share/lxc/config/debian.common.conf

# Container specific configuration
lxc.tty = 4
lxc.utsname = nomdemaVM
lxc.arch = amd64

On édite ce fichier pour ajouter notre adresse IP, sa MAC et autres options diverses :

[root:~] # nano /var/lib/lxc/nomdemaVM/config

# Uncomment the following line to support nesting containers:
#lxc.include = /usr/share/lxc/config/nesting.conf
# (Be aware this has security implications)

lxc.network.type = empty
lxc.rootfs = /var/lib/lxc/nomdemaVM/rootfs
lxc.rootfs.backend = dir

# Common configuration
lxc.include = /usr/share/lxc/config/debian.common.conf

# Container specific configuration
lxc.tty = 4
lxc.utsname = nomdemaVM
lxc.arch = amd64
lxc.autodev = 1 <-- Rempli un /dev minimal au démarrage de la VM
lxc.kmsg = 0 <-- Bloque le passage à SystemD sur la VM
lxc.start.auto = 1 <-- Démarrage automatique de la VM si le host redémarre
lxc.start.delay = 5 <-- Laps de temps entre chaque VM à démarrer


lxc.network.type = veth <-- Interface réseau virtuelle avec un côté assigné au conteneur et l’autre côté attaché à un pont
lxc.network.flags = up < -- Activation de l'interface
lxc.network.link = br0 <-- Pont à attacher à l'interface virtuelle côté host. Il s'agit de celui créé dans le fichier interfaces de notre host
lxc.network.veth.pair = vethnomdemaVM <-- Nom de l’interface virtuelle assignée côté container
lxc.network.name = eth0 <-- Optionnel : Nom à assigner à l’interface de la VM
lxc.network.ipv4 = 1.2.3.4 <-- Notre adresse IP supplémentaire
lxc.network.ipv6 = 2008:52b0:1:5e40::1/64 <-- Optionnelle : l’IPv6 générée via interface web
lxc.network.hwaddr = 02:00:00:22:64:1c <-- Adresse MAC de type OVH générée sur notre IP supplémentaire

Ensuite nous allons aussi adresser l'IP de façon statique sur la VM :

[root:~] # nano /var/lib/lxc/nomdemaVM/rootfs/etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static

address 1.2.3.4 <-- Notre adresse IP supplémentaire
netmask 255.255.255.255
broadcast 1.2.3.4
post-up route add 91.42.71.254 dev eth0 <-- Correspond à l’ip de la passerelle du HOST
post-up route add default gw 91.42.71.254 <-- Idem
post-down route del 91.42.71.254.254 dev eth0 <-- Idem
post-down route del default gw 91.42.71.254 <-- Idem

#Configuration IPv6 optionnelle
iface eth0 inet6 static

address 2008:52b0:1:5e40::1 <-- IPv6 générée via interface web
netmask 64
gateway 2008:52b0:1:5eFF:FF:FF:FF:FF 

post-up /sbin/ip -f inet6 route add 2008:52b0:1:5eFF:FF:FF:FF:FF dev eth0
post-up /sbin/ip -f inet6 route add default via 2008:52b0:1:5eFF:FF:FF:FF:FF
pre-down /sbin/ip -f inet6 route del 2008:52b0:1:5eFF:FF:FF:FF:FF dev eth0
pre-down /sbin/ip -f inet6 route del default via 2008:52b0:1:5eFF:FF:FF:FF:FF

La passerelle d'un block IPv6 prend la forme IP:v:6FF:FF:FF:FF:FF comme stipulé dans le guide IPv6 d’OVH.

Démarrage de la VM

Une fois la configuration effectuée nous pouvons démarrer notre container.

[root:~] # lxc-start -n nomdemaVM

Si aucuns messages d’erreur ne vous empêche de lancer la VM, nous pouvons vérifier l’état de la machine :

[root:~] # lxc-ls --fancy

NAME      STATE   AUTOSTART GROUPS IPV4                           IPV6                
nomdemaVM   RUNNING 1         -      1.2.3.4, 1.2.3.4 2008:52b0:1:5e40::1

La machine affiche bien nos IPs configurées.

Une réponse au ping depuis l’extérieur – pas depuis le host – devrait confirmer le fait que notre adresse est bien routée.

[arnaud:~] $ ping mon-ndd.qqch

PING mon-ndd.qqch (1.2.3.4) 56(84) bytes of data.
64 bytes from mon-ndd.qqch (1.2.3.4): icmp_seq=1 ttl=54 time=71.7 ms
64 bytes from mon-ndd.qqch (1.2.3.4): icmp_seq=2 ttl=54 time=46.3 ms
64 bytes from mon-ndd.qqch (1.2.3.4): icmp_seq=3 ttl=54 time=66.0 ms
64 bytes from mon-ndd.qqch (1.2.3.4): icmp_seq=4 ttl=54 time=33.9 ms
^C
--- mon-ndd.qqch ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3018ms
rtt min/avg/max/mdev = 33.974/54.539/71.759/15.158 ms

Let's rock

Il n’y a plus qu’a mettre le container à jour :

[root:~] # lxc-attach -n nomdemaVM
[root@nomdemaVM:~] # apt update && apt full-upgrade -y

Et nous voilà avec un beau container disposant d’une adresse IP publique dédiée prêt à accueillir ce que bon vous semble !

Cette configuration est à dupliquer pour chaque VM que l’on veut créer avec une IP dédiée.