Architecture cible
Internet <-> [ens0 / ext] Debian 13 Serveur Clonezilla [ens1 / lan] <-> Switch <-> Postes clients (BIOS/UEFI)
│ │
NAT/routing dnsmasq (DHCP+TFTP)
Nginx (HTTP fichiers Clonezilla)
Identifier les deux interfaces :
ip link show
On suppose dans cette page que :
Créer/éditer la configuration réseau avec (ifupdown classique) :
/etc/network/interfaces
sudo tee -a /etc/network/interfaces << 'EOF'
auto ens1 iface ens1 inet static address 192.168.100.1/24 gateway 192.168.100.1 dns-nameservers 8.8.8.8 1.1.1.1 EOF
Puis activer :
sudo ifup ens1
⚠️ Ne définissez pas de passerelle par défaut sur ens1 si ens0 fournit déjà la route par défaut. Retirez la ligne gateway ci-dessus dans ce cas.
sudo apt update sudo apt install -y nginx dnsmasq ipxe-qemu pxelinux syslinux-common \ wget rsync unzip nftables
Vérifiez que les fichiers iPXE nécessaires sont disponibles :
# Pour BIOS legacy ls /usr/lib/ipxe/undionly.kpxe # Pour UEFI ls /usr/lib/ipxe/ipxe.efi ls /usr/lib/ipxe/ipxe-snponly.efi
Si les chemins diffèrent, cherchez-les :
dpkg -L ipxe-qemu | grep -E '\.(efi|kpxe)$' find /usr -name 'undionly.kpxe' -o -name 'ipxe*.efi' 2>/dev/null
sudo mkdir -p /srv/www/clonezilla cd /tmp wget https://free.nchc.org.tw/clonezilla-live/stable/clonezilla-live-X.X.X-XX-amd64.zip # Vérifiez toujours la dernière version stable sur https://clonezilla.org/downloads.php sudo unzip clonezilla-live-X.X.X-XX-amd64.zip -d /tmp/cz
⚠️ Vérifiez l'URL de téléchargement sur le site officiel de Clonezilla pour obtenir la dernière version stable.
Clonezilla Live utilise une architecture classique de live-boot : noyau Linux, initramfs, et filesystem.squashfs.
sudo mkdir -p /srv/www/clonezilla/live sudo mkdir -p /srv/tftp/boot
# Copier les fichiers du système de fichiers live (squashfs + vmlinuz + initrd)
sudo cp /tmp/cz/live/vmlinuz /srv/www/clonezilla/live/ sudo cp /tmp/cz/live/initrd.img /srv/www/clonezilla/live/ sudo cp /tmp/cz/live/filesystem.squashfs /srv/www/clonezilla/live/
# Copier aussi les fichiers pour TFTP (si besoin de PXELINUX en fallback)
sudo cp /tmp/cz/live/vmlinuz /srv/tftp/boot/ sudo cp /tmp/cz/live/initrd.img /srv/tftp/boot/
Vérifiez les noms exacts des fichiers dans l'archive :
ls -la /tmp/cz/live/3.3
Arborescence cible
/srv/www/clonezilla/ ├── live/ │ ├── vmlinuz │ ├── initrd.img │ └── filesystem.squashfs └── boot.ipxe ← script iPXE personnalisé /srv/tftp/ ├── undionly.kpxe ← iPXE pour BIOS ├── ipxe-snponly.efi ← iPXE pour UEFI └── boot.ipxe
Copier les firmwares iPXE vers le répertoire TFTP :
sudo cp /usr/lib/ipxe/undionly.kpxe /srv/tftp/ sudo cp /usr/lib/ipxe/ipxe-snponly.efi /srv/tftp/
Le script iPXE est le cœur de la chaîne de boot. Il télécharge le noyau et l'initramfs de Clonezilla depuis Nginx en HTTP, puis démarre Clonezilla avec les bons paramètres.
sudo tee /srv/www/clonezilla/boot.ipxe << 'IPXEEOF'
#!ipxe
echo ============================================
echo Clonezilla Live via iPXE
echo Server: 192.168.100.1
echo ============================================
echo
set server_ip 192.168.100.1
set http_base http://${server_ip}/clonezilla/live
kernel ${http_base}/vmlinuz boot=live username=user union=overlay config components quiet ocs_prerun="dhclient" ocs_live_run="ocs-live-general" ocs_live_extra_param="" keyboard-layouts=fr locales=fr_FR.UTF-8 ip=dhcp nosplash vga=791
initrd ${http_base}/initrd.img
boot
IPXEEOF
Explication des paramètres du noyau
Paramètre Rôle boot=live Active le mode live-boot de Debian/Clonezilla username=user Utilisateur de la session live union=overlay Système de fichiers en overlay config components quiet Charge les composants de config, mode silencieux ocs_prerun="dhclient" Démarre un client DHCP avant Clonezilla (pour avoir le réseau dans CZ) ocs_live_run="ocs-live-general" Lance le menu Clonezilla interactif keyboard-layouts=fr Disposition clavier français (adaptez si besoin) locales=fr_FR.UTF-8 Locale française ip=dhcp Configuration IP via DHCP au boot vga=791 Résolution 1024×768 (adaptez selon vos écrans)
Copier le script également en TFTP (au cas où) :
sudo cp /srv/www/clonezilla/boot.ipxe /srv/tftp/boot.ipxe
💡 Si vous souhaitez automatiser le clonage sans menu interactif, remplacez ocs_live_run par exemple : ocs_live_run=“ocs-sr -g auto -e1 auto -e2 -c -r -j2 restoredisk IMAGE_NAME sda”
(à adapter selon votre image et vos disques cibles)
dnsmasq gère à la fois le DHCP, le TFTP et la redirection vers iPXE en fonction du type de client (BIOS ou UEFI).
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig 2>/dev/null
sudo tee /etc/dnsmasq.conf « 'DNSMASQEOF' # ===================================================== # dnsmasq - Serveur Clonezilla (DHCP + TFTP + DNS proxy) # =====================================================
# — Écoute uniquement sur l'interface interne — interface=ens1 bind-interfaces
# — Plage DHCP — dhcp-range=192.168.100.100,192.168.100.200,255.255.255.0,12h dhcp-option=option:router,192.168.100.1 dhcp-option=option:dns-server,192.168.100.1,8.8.8.8
# — TFTP — enable-tftp tftp-root=/srv/tftp
# — Redirection selon le type de boot client —
# Option 43 (Vendor Class) pour identifier les clients PXE dhcp-match=set:efi-x86_64,option:client-arch,7 dhcp-match=set:efi-x86_64,option:client-arch,9 dhcp-match=set:bios-x86,option:client-arch,0
# BIOS Legacy → charger undionly.kpxe dhcp-boot=tag:bios-x86,undionly.kpxe
# UEFI x86_64 → charger ipxe-snponly.efi dhcp-boot=tag:efi-x86_64,ipxe-snponly.efi
# — Proxy DNS (résolution locale + forward) — domain-needed bogus-priv server=8.8.8.8 server=1.1.1.1
# — Logs (utile pour debug) — log-dhcp log-facility=/var/log/dnsmasq.log DNSMASQEOF5.2 Désactiver le démarrage automatique par défaut de dnsmasq systemd-resolved Sur Debian 13, vérifiez que systemd-resolved ne conflit pas sur le port 53 :# Si systemd-resolved est actif et occupe le port 53 sudo systemctl stop systemd-resolved 2>/dev/null || true sudo systemctl disable systemd-resolved 2>/dev/null || true
# Alternative: désactiver le stub listener dans systemd-resolved # Editez /etc/systemd/resolved.conf et mettez DNSStubListener=no # Puis: sudo systemctl restart systemd-resolved5.3 Redémarrage de dnsmasqsudo systemctl enable dnsmasq sudo systemctl restart dnsmasq sudo systemctl status dnsmasqVérifiez que le DHCP et le TFTP écoutent :ss -ulnp | grep -E '67|69' ss -tlnp | grep -E '53'
sudo tee /etc/nginx/sites-available/clonezilla « 'NGINXEOF' server {
listen 80; listen [::]:80;
server_name 192.168.100.1;
# Servir uniquement sur l'interface interne # Pour limiter l'accès au réseau local de clonage : allow 192.168.100.0/24; deny all;
root /srv/www;
location /clonezilla/ {
autoindex on;
# Autoriser le boot PXE (User-Agent non standard)
if_modified_since off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# Types MIME corrects
types {
application/octet-stream squashfs;
application/octet-stream kpxe;
application/octet-stream efi;
application/octet-stream img;
text/plain ipxe;
}
}
# Page d'accueil optionnelle
location / {
try_files $uri $uri/ =404;
}
} NGINXEOF6.2 Activation du sitesudo rm -f /etc/nginx/sites-enabled/default sudo ln -sf /etc/nginx/sites-available/clonezilla /etc/nginx/sites-enabled/clonezilla
# Vérifier la syntaxe sudo nginx -t
# Redémarrer sudo systemctl restart nginx sudo systemctl enable nginx6.3 Test de l'accès HTTP Depuis une machine du réseau 192.168.100.0/24 :curl http://192.168.100.1/clonezilla/boot.ipxe curl -I http://192.168.100.1/clonezilla/live/vmlinuzVous devez voir 200 OK et le contenu du script/de la liste.
Pour que les postes clients puissent accéder à Internet (notamment pour que Clonezilla puisse télécharger des mises à jour, ou que les machines clonées aient un accès réseau après le clone), il faut activer le routage IPv4 et le NAT entre ens1 (lan) et ens0 (wan).
sudo tee -a /etc/sysctl.d/99-clonezilla-routing.conf « 'EOF' net.ipv4.ip_forward = 1 EOF
sudo sysctl -p /etc/sysctl.d/99-clonezilla-routing.conf7.2 Règles NAT avec nftables Sur Debian 13, nftables remplace iptables :sudo tee /etc/nftables.conf « 'NFTCONF' #!/usr/sbin/nft -f
flush ruleset
table ip nat {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
# Masquerade : tout le trafic sortant par ens0 (internet)
oifname "ens0" masquerade
}
}
table ip filter {
chain forward {
type filter hook forward priority filter; policy drop;
# Autoriser le trafic établi à revenir
ct state established,related accept
# Autoriser le trafic du LAN de clonage vers internet
iifname "ens1" oifname "ens0" accept
# Bloquer le trafic d'internet vers le LAN de clonage (sécurité)
iifname "ens0" oifname "ens1" drop
}
} NFTCONF
sudo chmod +x /etc/nftables.conf sudo systemctl enable nftables sudo systemctl restart nftablesVérification :sudo nft list ruleset 💡 Si vous préférez toujours utiliser iptables (wrapper nft) : echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward sudo iptables -t nat -A POSTROUTING -o ens0 -j MASQUERADE sudo iptables -A FORWARD -i ens1 -o ens0 -j ACCEPT sudo iptables -A FORWARD -i ens0 -o ens1 -m state –state RELATED,ESTABLISHED -j ACCEPT
Voici le flux complet de démarrage d'un poste client :(sequence omitted — described below)Étape 1 — Demande DHCP : Le poste client (BIOS ou UEFI) émet une requête DHCP Discover sur ens1. dnsmasq répond avec une IP dans la plage 192.168.100.100-200 et indique le fichier de boot correspondant à l'architecture détectée :
BIOS → undionly.kpxe (firmware iPXE pour PXE legacy) UEFI x86_64 → ipxe-snponly.efi (firmware iPXE pour UEFI)
Étape 2 — Transfert TFTP : Le client télécharge le firmware iPXE via TFTP depuis /srv/tftp/. Étape 3 — Exécution du script iPXE : Le firmware iPXE se charge, obtient son adresse DHCP, puis exécute le script boot.ipxe. Selon votre configuration, iPXE peut soit le charger automatiquement s'il est passé comme option (voir note ci-dessous), soit vous pouvez faire en sorte que le script iPXE soit chargé après le chargement du firmware.
⚠️ Point critique : Par défaut, le firmware iPXE ne sait pas quel script exécuter. Deux approches : Approche A — Embed le script dans le firmware iPXE (recommandé) : Compiler iPXE avec un script embarqué qui pointe vers http://192.168.100.1/clonezilla/boot.ipxe. Approche B — Chaînage via dnsmasq (plus simple) : Configurer dnsmasq pour envoyer l'option option:bootfile-name avec l'URL HTTP directement. Mais iPXE doit d'abord être chargé, puis demander une deuxième IP. Voici comment :
Modifiez la section de boot dans /etc/dnsmasq.conf :sudo tee -a /etc/dnsmasq.conf « 'DNSMASQAPPEND'
# === Chaînage iPXE (double DHCP) ===
# Tag pour distinguer la première demande PXE (firmware standard) # de la seconde demande (déjà iPXE) dhcp-userclass=set:ipxe,iPXE
# BIOS Legacy dhcp-boot=tag:!ipxe,tag:bios-x86,undionly.kpxe dhcp-boot=tag:ipxe,tag:bios-x86,http://192.168.100.1/clonezilla/boot.ipxe
# UEFI x86_64 dhcp-boot=tag:!ipxe,tag:efi-x86_64,ipxe-snponly.efi dhcp-boot=tag:ipxe,tag:efi-x86_64,http://192.168.100.1/clonezilla/boot.ipxe DNSMASQAPPEND 📝 Le principe : lors de la première requête DHCP, le client n'est pas encore iPXE (tag:!ipxe), donc dnsmasq lui donne le firmware iPXE via TFTP. Lors de la seconde requête DHCP, iPXE s'identifie via son user-class (tag:ipxe), et dnsmasq lui donne l'URL HTTP du script boot.ipxe.
Relancez dnsmasq :sudo systemctl restart dnsmasqÉtape 4 — Téléchargement HTTP (Nginx) : iPXE exécute boot.ipxe, qui télécharge vmlinuz et initrd.img depuis http://192.168.100.1/clonezilla/live/ (beaucoup plus rapide que TFTP). Étape 5 — Boot Clonezilla : Le noyau démarre, monte le filesystem.squashfs, et Clonezilla s'exécute avec les paramètres spécifiés.
sudo tail -f /var/log/dnsmasq.logVous devriez voir les étapes DHCP, la détection de l'architecture (BIOS/UEFI), et l'envoi du bon fichier de boot.
sudo tail -f /var/log/nginx/access.logVous devriez voir les requêtes GET pour /clonezilla/boot.ipxe, /clonezilla/live/vmlinuz, /clonezilla/live/initrd.img.
Depuis une machine du réseau de clonage :# Tester le DHCP sudo dhclient -d -v ens1
# Tester TFTP (installer tftp-hpa) sudo apt install tftp-hpa tftp 192.168.100.1 -c get undionly.kpxe tftp 192.168.100.1 -c get ipxe-snponly.efi
# Tester HTTP curl http://192.168.100.1/clonezilla/boot.ipxe curl -I http://192.168.100.1/clonezilla/live/filesystem.squashfs9.4 Tableau de dépannage SymptômeCause probableSolutionLe client n'obtient pas d'IP DHCPdnsmasq n'écoute pas sur ens1Vérifier interface=ens1 et bind-interfacesPas de transfert TFTPMauvais tftp-root ou permissionschmod -R 755 /srv/tftp et vérifier les noms de fichiersiPXE charge mais ne trouve pas boot.ipxednsmasq ne fait pas le chaînage HTTPVérifier la configuration dhcp-userclass et les dhcp-bootNginx retourne 403Restriction allow/denyVérifier que le client est bien dans 192.168.100.0/24filesystem.squashfs introuvableMauvais nom de fichierVérifier ls /tmp/cz/live/ et adapterBoot UEFI échoueMauvais firmware EFIEssayer ipxe.efi au lieu de ipxe-snponly.efi selon le firmware de la carte réseauPas d'accès Internet après clonageNAT inactifsysctl net.ipv4.ip_forward doit renvoyer 1, vérifier nft list rulesetLes performances de clonage sont lentesRoutage via NATNormal si tout passe par le serveur ; Clonezilla utilise le réseau local
Flux réseau completinfoClient (BIOS/UEFI) → DHCP sur ens1 → dnsmasq fournit IP + firmware iPXE via TFTP → iPXE recharge DHCP (user-class iPXE) → dnsmasq répond avec URL HTTP http://192.168.100.1/clonezilla/boot.ipxe → Nginx sert boot.ipxe, vmlinuz, initrd.img, filesystem.squashfs → Clonezilla démarre → NAT via ens0 permet l'accès Internet aux machines clonées.Points critiqueswarning1) Le chaînage double-DHCP (user-class iPXE) est essentiel pour router du firmware PXE vers le script HTTP. 2) L'option client-arch 7/9 identifie UEFI, 0 identifie BIOS. 3) nftables doit masquerader ens0 et forwarder ens1→ens0. 4) Le filesystem.squashfs doit être accessible en HTTP pour que Clonezilla fonctionne.
Restreindre Nginx au réseau 192.168.100.0/24 uniquement (déjà fait via allow/deny) Désactiver dnsmasq quand vous ne clônez pas (sudo systemctl stop dnsmasq) Isoler physiquement le réseau de clonage si possible (switch dédié/VLAN) Sauvegarder vos images Clonezilla sur un disque séparé monté dans /srv/www/clonezilla/images/ Changer le mot de passe SSH du serveur et désactiver les services inutiles
Cette configuration vous donne un serveur de clonage autonome, capable de démarrer aussi bien les machines BIOS qu'UEFI via iPXE en IPv4, tout en permettant l'accès Internet aux machines clonées grâce au NAT. Le principal avantage d'iPXE est la vitesse de transfert (HTTP au lieu de TFTP) et la flexibilité du scripting de boot.