Création d'un container dans Proxmox

Création d'un container dans Proxmox

Mise en place d'un conteneur LXC Debian 12 non privilégié sur l'hyperviseur Proxmox du lab interne ANSSI : téléchargement du template, assistant de création, IP statique, démarrage et vérifications côté conteneur et côté hôte.
Publié le
Statut
Terminé

Contexte et besoins

Dans le cadre de mon alternance, l’hyperviseur Proxmox VE du lab interne héberge déjà des VM pleines (contrôleur de domaine, hôte Docker, OPNsense). Pour les services Linux légers à venir (DNS interne, gestionnaire de mots de passe, reverse proxy), monter une VM complète à chaque fois consomme inutilement la RAM et le disque de l’hyperviseur. C’est le cas d’usage typique des conteneurs LXC.

L’objectif de cette intervention est de créer un conteneur LXC Debian 12 non privilégié, avec une IP statique sur le segment du lab, pour qu’il soit utilisable comme cible de service. Pas de service métier déployé encore : uniquement la mécanique LXC bien comprise et un conteneur de référence prêt à recevoir une charge.

Rappel théorique sur LXC dans Proxmox

Conteneur Linux : entre VM et processus

Un conteneur LXC est un environnement isolé qui partage le noyau de l’hôte mais a son propre arbre de fichiers, ses propres interfaces réseau, ses propres limites de ressources. C’est la même mécanique que Docker, mais orientée « système complet » plutôt que « processus applicatif » :

AspectLXC (Proxmox)DockerVM (KVM/QEMU)
Isolationnamespaces + cgroupsnamespaces + cgroupsmatérielle (hyperviseur)
NoyauPartagé avec l’hôtePartagé avec l’hôteIndépendant
DémarrageQuelques secondes< 1 seconde30 secondes à plusieurs minutes
OS supportésLinux uniquementLinux uniquementTous (Windows, BSD, etc.)
Cas d’usageService système completApplication packagéeCompatibilité maximale, sécurité

Privilégié vs non privilégié

C’est l’option de sécurité la plus importante à choisir. Sur Proxmox :

  • Conteneur privilégié : le root du conteneur est le root de l’hôte (UID 0 partagé). Une vulnérabilité d’évasion peut donner les pleins pouvoirs sur l’hyperviseur.
  • Conteneur non privilégié (recommandé) : le root du conteneur est mappé sur un UID élevé côté hôte (par exemple 100000). Une évasion donne des droits limités côté hôte.

Je crée systématiquement des conteneurs non privilégiés, sauf besoin précis.

Templates et stockages

Proxmox stocke deux types d’éléments :

  • les templates LXC (fichiers .tar.zst) dans le storage local, dossier template/cache/ ;
  • les rootfs (système de fichiers du conteneur) dans local-lvm ou un autre stockage de type rootdir.

Avant de créer un conteneur, on télécharge un template depuis Proxmox via Datacenter → pve → local → CT Templates.

Topologie

ÉquipementRôleAdresse
Passerelle du labRouteur / DHCP / DNS192.168.10.254/24
Hôte Proxmox pveHyperviseur LXC + KVM192.168.10.250/24
Conteneur LXC web-ctCible de l’intervention192.168.10.140/24 (statique)
Mon poste d’adminNavigateur Web ProxmoxDHCP sur LAN

Prérequis

  • Un hôte Proxmox VE 8 fonctionnel avec un storage local-lvm opérationnel.
  • Un accès admin (root@pam) ou un compte délégué avec les droits VM.Allocate et Datastore.AllocateSpace.
  • Un réseau bridge vmbr0 configuré (par défaut sur l’hôte).
  • Connectivité Internet pour télécharger le template Debian.

Téléchargement du template

Sur l’interface Web Proxmox, Datacenter → pve → local → CT Templates → Templates, je cherche debian-12-standard et clique sur Download. Proxmox récupère l’image depuis le miroir LinuxContainers. La taille du template est d’environ 250 Mo, le téléchargement prend une minute.

TEXT
debian-12-standard_12.7-1_amd64.tar.zst
Cliquez pour développer et voir plus

Création du conteneur

Bouton Create CT en haut à droite de l’interface Web. L’assistant en plusieurs onglets s’ouvre.

Onglet General

TEXT
Node                : pve
CT ID               : 110
Hostname            : web-ct
Unprivileged container : coché
Resource Pool       : (vide)

Password            : (passphrase 16+ caractères)
SSH public key(s)   : ssh-ed25519 AAAA... admin@poste-admin
Cliquez pour développer et voir plus

Explications ligne par ligne :

  • CT ID 110 : les conteneurs et VM partagent le même espace d’identifiants. La dernière VM créée portait le 109, j’enchaîne.
  • Hostname web-ct : nom court qui sera aussi le hostname interne du conteneur.
  • Unprivileged container: coché : choix de sécurité par défaut. À ne décocher que si on a un besoin technique précis (par exemple un conteneur qui doit charger un module noyau, cas rare).
  • Password : définit le mot de passe root du conteneur. Stocké dans le gestionnaire de mots de passe de l’équipe.
  • SSH public key : ma clé publique est ajoutée à /root/.ssh/authorized_keys du conteneur. Bonne pratique : se connecter en SSH par clé plutôt que par mot de passe une fois le conteneur démarré.

Onglet Template

TEXT
Storage  : local
Template : debian-12-standard_12.7-1_amd64.tar.zst
Cliquez pour développer et voir plus

Je sélectionne le template téléchargé à l’étape précédente.

Onglet Disks

TEXT
Storage      : local-lvm
Disk size    : 8 GiB
Cliquez pour développer et voir plus

8 Go suffisent largement pour Debian + un service léger. La taille peut être étendue plus tard avec pct resize.

Onglet CPU

TEXT
Cores : 2
CPU limit : (vide, pas de plafond)
CPU units : 1024 (poids relatif standard)
Cliquez pour développer et voir plus

Cores: 2 me donne deux threads CPU, suffisant pour la plupart des services internes.

Onglet Memory

TEXT
Memory  : 1024 MB
Swap    : 512 MB
Cliquez pour développer et voir plus

1 Go de RAM + 512 Mo de swap, ça reste raisonnable pour Debian + un petit service. Le swap est posé sur le même storage que le rootfs.

Onglet Network

TEXT
Name           : eth0
Bridge         : vmbr0
IPv4           : Static
IPv4/CIDR      : 192.168.10.140/24
Gateway (IPv4) : 192.168.10.254
IPv6           : SLAAC
Firewall       : coché
Cliquez pour développer et voir plus

Explications ligne par ligne :

  • Bridge: vmbr0 : bridge par défaut de Proxmox, relié à l’interface physique de l’hôte. Le conteneur se retrouve sur le LAN du lab.
  • IPv4: Static / 192.168.10.140/24 : je sors de la plage DHCP de la passerelle et j’utilise une IP réservée à la zone des conteneurs de service (.140 et suivantes).
  • Gateway 192.168.10.254 : passerelle du lab.
  • Firewall: coché : active le firewall Proxmox au niveau du conteneur. Indispensable : sans ça, le conteneur est totalement exposé sur le LAN.

Onglet DNS

TEXT
DNS domain  : lab.local
DNS servers : 192.168.10.250
Cliquez pour développer et voir plus

192.168.10.250 est le DC LAB.LOCAL qui sert aussi de DNS interne. Pour un conteneur sans besoin de résoudre des noms internes, on cocherait Use host settings.

Onglet Confirm

L’assistant récapitule tout. Je relis ID, hostname, storage, RAM, IP, puis Finish. Proxmox crée le conteneur en quelques secondes.

Démarrage et vérifications

Démarrage

Je sélectionne 110 (web-ct) dans l’arborescence, je clique sur Start. La LED verte apparaît. Le démarrage prend moins de 5 secondes.

BASH
# Équivalent en CLI sur l'hôte
pct start 110

# Vérification de l'état
pct status 110
# Sortie attendue : status: running
Cliquez pour développer et voir plus

Connexion à l’intérieur

Je clique sur Console dans l’interface Web. Un terminal NoVNC s’ouvre directement sur le prompt de login du conteneur.

TEXT
Debian GNU/Linux 12 web-ct tty1

web-ct login: root
Password: ********
root@web-ct:~#
Cliquez pour développer et voir plus

Alternative en CLI sur l’hôte :

BASH
# Entrer dans le conteneur sans mot de passe (équivaut à console)
pct enter 110

# Ou exécuter une commande unique
pct exec 110 -- hostnamectl
Cliquez pour développer et voir plus

Configuration initiale du conteneur

BASH
# À l'intérieur du conteneur
apt update && apt upgrade -y

# Outils de base
apt install -y curl wget vim htop ca-certificates

# Fuseau horaire
timedatectl set-timezone Europe/Paris

# Vérification du hostname et de la résolution DNS
hostnamectl
ping -c 2 google.fr
ping -c 2 dc.lab.local
Cliquez pour développer et voir plus

Explications ligne par ligne :

  • apt update && apt upgrade : met à jour le conteneur. Le template peut avoir quelques semaines de retard.
  • timedatectl set-timezone : aligne l’heure locale. Important pour les logs corrélés avec le reste du parc.
  • ping -c 2 google.fr : valide la résolution DNS publique et la sortie Internet via la passerelle.
  • ping -c 2 dc.lab.local : valide que le DNS interne (192.168.10.250) résout bien les noms du domaine du lab.

Vérifications côté hôte Proxmox

BASH
# Lister tous les conteneurs
pct list

# Configuration du conteneur (en clair, sans mot de passe)
pct config 110

# Consommation temps réel
pct status 110 --verbose
Cliquez pour développer et voir plus

pct config 110 montre l’agrégat de la configuration appliquée, par exemple :

TEXT
arch: amd64
cores: 2
features: nesting=1
hostname: web-ct
memory: 1024
net0: name=eth0,bridge=vmbr0,firewall=1,gw=192.168.10.254,hwaddr=...,ip=192.168.10.140/24,type=veth
ostype: debian
rootfs: local-lvm:vm-110-disk-0,size=8G
swap: 512
unprivileged: 1
Cliquez pour développer et voir plus

Problèmes rencontrés et solutions

SymptômeCauseCorrection
Le conteneur ne démarre pas, failed to mount /sys/fs/cgroupHôte Proxmox sans cgroups v2 (rare en VE 8)Mettre à jour l’hôte : VE 8 active cgroups v2 par défaut
Pas d’accès Internet depuis le conteneurMauvaise passerelle ou DNSVérifier ip route dans le conteneur, corriger via pct set 110 -nameserver 192.168.10.254
apt update échoue avec certificate verify failedHeure du conteneur fausse au premier bootapt install -y ca-certificates ntpdate && ntpdate fr.pool.ntp.org
Le hostname n’apparaît pas dans le DNS internePas d’enregistrement A côté DNSAjouter manuellement l’A web-ct → 192.168.10.140 dans le DNS interne
Le conteneur consomme tout le CPU de l’hôtePas de plafond CPU configurépct set 110 -cpulimit 1.0 (max 1 cœur)
Modification de mémoire à chaud refuséeMemory hotplug non actifModifier la valeur, redémarrer le conteneur (le hotplug n’est pas géré pour LXC sur tous les noyaux)

Compétences du bloc 1 mobilisées

Compétence officielleMobilisation concrète
Installer et configurer des éléments d’infrastructureCréation d’un conteneur LXC non privilégié sur l’hyperviseur Proxmox du lab.
Mettre à disposition aux utilisateurs un service informatiquePréparation d’une cible Debian 12 prête à recevoir un service applicatif léger.
Gérer le patrimoine informatique de l’organisationDocumentation du conteneur (web-ct, ID 110, IP, ressources, hôte Proxmox) dans le plan d’adressage du lab.
Réaliser les tests d’intégration et d’acceptation d’un serviceVérifications croisées (pct status, ping passerelle, ping DNS interne, ping Internet).

Bilan

web-ct est en service : conteneur Debian 12 non privilégié, 2 cœurs, 1 Go de RAM, 8 Go de disque, IP statique 192.168.10.140. Il répond au ping, il a accès à Internet, il résout les noms internes. C’est une base prête à recevoir n’importe quel petit service Linux du lab.

Trois enseignements :

  • la création LXC est plus rapide qu’une VM (5 secondes vs 1 minute) parce qu’il n’y a pas de boot d’OS — le conteneur démarre directement dans le runlevel 3 avec systemd, comme un système Linux qu’on aurait juste démarré ;
  • l’option non privilégié est essentielle pour la sécurité, sans coût pratique pour 95 % des usages ;
  • le firewall Proxmox au niveau du conteneur est une couche de défense qu’on prend trop souvent à la légère — activé par défaut + une règle d’autorisation explicite, c’est l’approche par moindre privilège.

Pour la suite, ce conteneur servira de socle pour les prochaines interventions (déploiement de services applicatifs en Docker, services système simples installés directement, etc.).

Sources

Commencer la recherche

Saisissez des mots-clés pour rechercher des articles

↑↓
ESC
⌘K Raccourci