Création d'un conteneur LXC sous Centos 7 (NAT bridge)
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 :
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
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
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
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...)
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