Pourquoi revenir à LXC ?

  • J'ai utilisé avec bonheur LXD 2.0 sur Ubuntu 16.04, mais depuis la version 4.0 il est obligatoire d'utiliser "snap" pour l'installation. J'ai alors eu de gros problèmes de compatibilité entre les conteneurs crées sur "apt" et leur mise en oeuvre avec "snap".
  • Snap ne me conviens pas. Je trouve ce système de package lent et gourmand en ressources.
  • Je reviens donc à la version LXC d'origine sur une distribution qui me semble plus adapté dans un contexte serveur : Debian 10.

Installation

  • Utilisation de la commande : apt install lxc

Installation/création d'un bridge virtuel (en mode NAT)

  • Création d'un fichier /etc/default/lxc-net avec le contenu suivant :
USE_LXC_BRIDGE="true"
  • Modification du fichier /etc/lxc/default.conf. Remplacer la ligne "lxc.net.0.type = empty" par :
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
  • Il est possible (mais pas obligatoire) d'affiner la configuration dans le fichier /usr/lib/x86_64-linux-gnu/lxc/lxc-net
  • Relance du service avec : systemctl restart lxc-net
  • Vérification de la présence d'une nouvelle carte réseau : ip addr

Création d'un conteneur (en mode privilégié)

  • Les templates sont dans le dossier /usr/share/lxc/templates, il est possible de les modifier (à vos risques et perils). Sur Debian, seuls les templates "alpine", "debian" et "ubuntu" fonctionnent.
  • La commande générale de création est : lxc-create -n nomImage -t nomTemplate -- -r release . Les paramètres situés après "--" sont les paramètres du template.
  • Par exemple pour une Ubuntu 16.04 : lxc-create -n srv1 -t ubuntu -- -r xenial
  • Les conteneurs sont créés dans le dossier : /var/lib/lxc
  • Pour afficher la liste des conteneurs : lxc-ls -f
  • Pour la démarrer : lxc-start -n srv1
  • Pour l'arrêter : lxc-stop -n srv1
  • Pour lancer le conteneur après un reboot, ajouter à la fin du fichier /var/lib/lxc/srv1/config :
lxc.start.auto = 1

Création d'un conteneur avec "download" (en mode privilégié)

  • Les conteneurs suivants sont disponibles :
    • alpine : 3.9  3.10  3.11  3.12  edge
    • alt : Sisyphus  P9
    • apertis : v2019.4  v2020.2
    • archlinux : current
    • centos : 6  7  8  8-Stream
    • debian : bulleye  buster  sid  stretch
    • devuan : ascii  beowolf
    • fedora : 31  32  33
    • funtoo : 1.4
    • gentoo : current
    • kali : current
    • mint : sarah  serena  sonya  sylvia  tara  tina  tricia  ulyana
    • opensuse : 15.1  15.2  tumbleweed
    • openwrt : 18.06  19.07  snapshot
    • oracle : 6  7  8
    • plamo : 6.x  7.x
    • pld : current
    • sabayon : current
    • ubuntu : bionic  focal  groovy  hirsute  trusty  xenial
    • voidlinux : current
  • Les architectures : i386  amd64 (et plus rarement ppc64el  s390x  armhf  arm64)
  • La commande générale de création est : lxc-create -n nomImage -t download -- --dist centos --release 7  --arch amd64

Backup d'un conteneur (en mode privilégié)

  • On utilise le conteneur "myDebian" par exemple
  • Arrêt du conteneur : lxc-stop -n myDebian
  • Archivage avec tar, dans le dossier /var/lib/lxc : tar -cvzf myDebian.tgz myDebian
  • Il est possible de copier l'archive sur un autre serveur LXC
  • Désarchivage, myDebian.tgz doit être dans le dossier /var/lib/lxc : tar -xvzf myDebian.tgz
  • Il est possible de renommer le conteneur : lxc-copy -R -n myDebian -N srv99
  • Dans ce cas, il faut ensuite modifier le fichier hostname :
    • lxc-attach -n srv99
    • mcedit /etc/hostname

Attribution d'adresses IP fixes

  • Dans mon exemple, je garde une plage d'adresse IP dynamique entre 10.0.3.100 et 10.0.3.254. Les adresses IP fixes seront configurés manuellement entre 10.0.3.2 et 10.0.3.99. Je configure ensuite le conteneur "srv99".
  • Dans le fichier /usr/lib/x86_64-linux-gnu/lxc/lxc-net :
LXC_DHCP_RANGE="10.0.3.100,10.0.3.254"
LXC_DHCP_MAX="155"
  • Lancer la commande systemctl restart lxc-net pour prendre en compte les modifications.
  • Dans le fichier /var/lib/lxc/srv99/config , ajoutez les lignes :
lxc.net.0.ipv4.address = 10.0.3.99/24
lxc.net.0.gateway = auto
  • Dans le conteneur srv99, dans le fichier /etc/network/interfaces , commenter ensuite les lignes :
#auto eth0
#iface eth0 inet dhcp

Configuration du firewall

  • Il faut activer le routage, pour cela activez la ligne net.ipv4.ip_forward=1 dans le fichier /etc/sysctl.conf
  • Pour la configuration iptables, installez avec apt : iptables-persistent
  • Puis modifiez le fichier /etc/iptables/rules.v4 :
###########
# REGLES NAT
###########

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

# SNAT
-A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE

# EXEMPLE DNAT
-A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.3.45:80

COMMIT

###########
# REGLES FIREWALL
###########

*filter
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]

COMMIT
  • Pour recharger la nouvelle configuration : systemctl restart netfilter-persistent