Création d'un conteneur LXC sous Centos 7

Création d'un conteneur LXC sous Centos 7

Linux CentOS 7 LXC

Création d'un conteneur LXC sous Centos 7 (NAT bridge)

Pourquoi LXC ?

Dans cet article nous allons voir comment crée une VE (virtual Environment) sous le système d’exploitation Centos en version 7. Le choix de cette technologie pour la virtualisation est simple :

  • Projet existant depuis 2008 et maintenu
  • Virtualisation complète du système
  • Moins lourd qu’une machine virtuelle traditionnelle de type VMware/Hyper-V et plus rapide
  • Mise en place rapide, même pour un novice
  • Peut-être installé et utilisé sur des VPS (OpenVZ, KVM etc.)

Installation des paquets


Une fois votre système installé (SELinux désactivé ou non. Au choix) commencer par installer les paquets suivants :

sudo yum install epel-release -y && sudo yum update

Puis :

sudo yum install lxc lxc-templates bridge-utils debootstrap bzip2 tar gzip wget nano net-tools -y

On vérifie qu'il est aucun problème avec le noyau de la distribution :

sudo lxc-checkconfig

Normalement vous devriez avoir un résultat un peut près identique :

Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.10.0-862.2.3.el7.x86_64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
Bridges: enabled
Advanced netfilter: enabled
CONFIG_NF_NAT_IPV4: enabled
CONFIG_NF_NAT_IPV6: enabled
CONFIG_IP_NF_TARGET_MASQUERADE: enabled
CONFIG_IP6_NF_TARGET_MASQUERADE: enabled
CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled

--- Checkpoint/Restore ---
checkpoint restore: enabled
CONFIG_FHANDLE: enabled
CONFIG_EVENTFD: enabled
CONFIG_EPOLL: enabled
CONFIG_UNIX_DIAG: enabled
CONFIG_INET_DIAG: enabled
CONFIG_PACKET_DIAG: enabled
CONFIG_NETLINK_DIAG: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

Il se peut que dans la liste vous constater des problèmes de Setuid (newuidmap et newgidmap) pour résoudre cet avertissement, lancer la commande suivante :

Vous aurait besoin de passer en root pour cette action :

su root
chmod u+s /usr/bin/newuidmap && chmod u+s /usr/bin/newgidmap
exit

Installation du Bridge


Maintenant que LXC est installé, nous allons commencer a configurer le réseau pour le VE. On va commencer par crée l'interface bridge pour notre VE:

sudo nano /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
IPADDR=100.100.100.1
NETMASK=255.255.255.0
ONBOOT=yes
BOOTPROTO=none
NM_CONTROLLED=no
IPV6INIT=no
IPV6_AUTOCONF=no

Description des paramètres :

DEVICE = Correspond au nom du périphérique physique
TYPE = Le type d'interface, dans notre cas ca sera un Bridge
IPADDR = Correspond à l'adresse IP
NETMASK = Correspond à la valeur du masque réseau

ONBOOT = Correspond à l'une des valeurs suivantes :
yes (Indique que ce périphérique devrait être activé au démarrage)
no (Indique que ce périphérique ne devrait pas être activé au démarrage)

BOOTPROTO = Correspond à l'une des valeurs suivantes :
none (Indique qu'aucun protocole de démarrage ne devrait être utilisé)
bootp (Indique que le protocole BOOTP devrait être utilisé)
dhcp (Indique que le protocole DHCP devrait être utilisé)

NM_CONTROLLED = Correspond à l'une des valeurs suivantes :
yes(Votre interface réseau sera gérée par le démon NetworkManager)
no (Votre interface réseau sera gérée à l'ancienne. Cela signifie entièrement configuré par les fichiers /etc/sysconfig/network-scripts/ifcfg-ethX)

IPV6INIT = Correspond à l'une des valeurs suivantes :
yes (Initialisez cette interface pour l'adressage IPv6)
no (N'initialise pas cette interface pour l'adressage IPv6)

IPV6_AUTOCONF = Correspond à l'une des valeurs suivantes :
yes (Activez la configuration de configuration automatique IPv6 pour cette interface)
no (Ne pas activer la configuration de configuration automatique IPv6 pour cette interface)

Editer le fichier de configuration suivant :

sudo nano /etc/sysctl.d/99-sysctl.conf

Je pense que mes commentaires sont assez explicites :

# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

## Autorisation du Forward
net.ipv4.ip_forward = 1

Attention concernant la partie "net.ipv6.conf.eth0.disable_ipv6" eth0 doit être remplacée si votre interface utiliser la nouvelle nomenclature qui ressemblant à cela : enpXX ou ensXX.

Faite un reboot :

sudo reboot

Une fois la machine démarrée afficher les interfaces réseaux avec la commande :

sudo ifconfig

ou

ip a

Vous devriez avoir votre interface "br0" d'affiché dans votre liste :

br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 100.100.100.1  netmask 255.255.255.0  broadcast 100.100.100.255
        ether fe:9c:f4:28:34:ed  txqueuelen 1000  (Ethernet)
        RX packets 118159  bytes 40674836 (38.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 168207  bytes 184573543 (176.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Pour vérifier qu'elle fonctionne bien, faites un ping dessus :

ping 100.100.100.1
PING 100.100.100.1 (100.100.100.1) 56(84) bytes of data.
64 bytes from 100.100.100.1: icmp_seq=1 ttl=64 time=0.090 ms
64 bytes from 100.100.100.1: icmp_seq=2 ttl=64 time=0.079 ms
64 bytes from 100.100.100.1: icmp_seq=3 ttl=64 time=0.079 ms
^C
--- 100.100.100.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.079/0.082/0.090/0.011 ms

Création du conteneur LXC


Nous pouvons maintenant procéder à la création de notre premier conteneur :

sudo lxc-create -t download -n <NOM_DE_MA_VE>

Choix de la distribution que vous souhaiter installer, dans notre cas ca sera une debian 10 (64bits)

Setting up the GPG keyring
Downloading the image index

---
DIST    RELEASE ARCH    VARIANT BUILD
---
alt     Sisyphus        amd64   default 20200519_01:17
alt     Sisyphus        arm64   default 20200519_01:17
alt     Sisyphus        i386    default 20200519_01:17
alt     Sisyphus        ppc64el default 20200519_01:17
alt     p8      amd64   default 20200518_01:17
alt     p8      i386    default 20200518_01:17
alt     p9      amd64   default 20200519_01:17
alt     p9      arm64   default 20200519_01:17
ubuntu  xenial  armhf   default 20200520_07:42
ubuntu  xenial  i386    default 20200520_07:42
ubuntu  xenial  ppc64el default 20200520_07:42
ubuntu  xenial  s390x   default 20200520_07:42
voidlinux       current amd64   default 20200519_17:10
voidlinux       current arm64   default 20200519_17:10
voidlinux       current armhf   default 20200519_17:10
voidlinux       current i386    default 20200519_17:10
---

Distribution: debian
Release: buster
Architecture: amd64

Downloading the image index
Downloading the rootfs

Downloading the metadata
The image cache is now ready
Unpacking the rootfs

---
You just created a Debian buster amd64 (20200520_05:24) container.

To enable SSH, run: apt install openssh-server
No default root or user password are set by LXC.

Cela pourrait mettre plus au moins de temps selon votre connexion le temps de récupérer tous les paquets Procédons maintenant à la configuration de notre conteneur, éditer le fichier de configuration de votre VE :

sudo nano /var/lib/lxc/<NOM_DE_MA_VE>/config

Votre fichier devrait ressembler à cela :

# Template used to create this container: /usr/share/lxc/templates/lxc-download
# Parameters passed to the template:
# For additional config options, please look at lxc.container.conf(5)

# Distribution configuration
lxc.include = /usr/share/lxc/config/debian.common.conf
lxc.arch = linux64

# Container specific configuration
lxc.rootfs = /var/lib/lxc/<NOM_DE_MA_VE>/rootfs
lxc.utsname = mon-conteneur

# Network configuration
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = virbr0

Commencer par supprimer le bloc "Network configuration" puis ajouter ce bloc à la place et sauvegarder :

## Réseau
lxc.network.type      = veth
lxc.network.veth.pair = eth.VE
lxc.network.flags     = up
lxc.network.link      = br0

## Interface côté conteneur
lxc.network.name   = eth0
lxc.network.hwaddr = 00:00:00:77:77:77

## L'IPv4 de votre VE
lxc.network.ipv4 = 100.100.100.2/24

## L'IPv4 de passerelle pour votre VE
lxc.network.ipv4.gateway = 100.100.100.1

Configuration du conteneur LXC


Lancer maintenant votre VE :

sudo lxc-start -n <NOM_DE_MA_VE> -d

-n : Nom de la machine -d : Lance la machine en tâche de fond

Maintenant que votre machine a démarré, nous allons assigner un mot de passe root. Lancer la commande suivante :

sudo lxc-attach -n <NOM_DE_MA_VE>

lxc-attach : Affiche le shell local de la machine

Changer le mot de passe root de la VE :

passwd root

Ajouter des serveurs DNS a votre fichier resolv.conf :

echo "nameserver 8.8.8.8" >> /etc/resolv.conf && echo "nameserver 8.8.4.4" >> /etc/resolv.conf

nameserver Dans mon cas, pour la démo, j'ai mis ceux de Google (8.8.8.8 / 8.8.4.4)

Puis sortez de votre conteneur :

exit

Vous revenez sur votre sur le shell de votre hôte (le nom de machine change au niveau du terminal...)

Redirection des ports

Pare-feu avec IPtables :

sudo iptables -t nat -F POSTROUTING
sudo iptables -t nat -A POSTROUTING -o <NOM_DE_VOTRE_INTERFACE_PHYSIQUE_DE_VOTRE_SERVEUR> -j MASQUERADE
sudo iptables -t nat -A PREROUTING -p tcp -s 0/0 -d <IP_DE_VOTRE_SERVEUR_PHYSIQUE> --dport <PORT_A_NATE> -j DNAT --to <IP_DE_VOTRE_VE>:<PORT_DE_VOTRE_VE>
NOM_DE_VOTRE_INTERFACE_PHYSIQUE_DE_VOTRE_SERVEUR : En général c'est votre carte physique principal qui porte l'adresse public de votre serveur (eth0 ou ensXX)
IP_DE_VOTRE_SERVEUR_PHYSIQUE : L'IP public de votre serveur
PORT_A_NATE : Le numéro du port que vous souhaitez rediriger
IP_DE_VOTRE_VE   : L'IP choisi pour votre VE (celui indiqué dans le fichier config dans le dossier de la VE)
PORT_DE_VOTRE_VE : Le port de destination

Exemple pour la redirection du port 80 vers celui de la VE :
sudo iptables -t nat -A PREROUTING -p tcp -s 0/0 -d 192.168.1.50 --dport 80 -j DNAT --to 100.100.100.2:80

Pare-feu avec FirewallD :

sudo firewall-cmd --permanent --zone=public --add-masquerade
sudo firewall-cmd --permanent --zone=trusted --add-interface=br0
sudo firewall-cmd --permanent --add-forward-port=port=22:proto=tcp:toaddr=100.100.100.2:toport=22
sudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=100.100.100.2:toport=80
sudo firewall-cmd --permanent --add-forward-port=port=443:proto=tcp:toaddr=100.100.100.2:toport=443
sudo firewall-cmd --reload

--permanent : Comme le nom l'indique la règle sera permanent
--direct : Utiliser ce paramètre pour que la configuration reste temporaire à la place de --permanent

Article précédent Article suivant