====== Serveur iPXE + Clonezilla sur Debian 13 avec Apache pour deux cartes réseau ====== Servant les images Clonezilla via Apache, avec support BIOS et UEFI sur IPv4, et accès Internet pour les postes clonés. [[https://khimananda.com/blog/pxe-boot-for-automated-os-installs|khimananda]] Cette documentation a été élaborée avec l'aide de Lumo, l'assistant d'intelligence artificielle développé par Proton (https://lumo.proton.me). Mais malheureusement pour l'instant ça ne fonctionne pas :( Les postes clients UEFI se connectent mais bouclent à la recherche de.... :( ReunigKozh ===== Pourquoi un serveur iPXE - Clonezilla au Centre des Abeilles ===== L'opération de solidarité numérique débutée en 2009 par le Centre des Abeilles avec l'aide technique de Linux Quimper se traduit aujourd'hui par le don d'une vingtaine d'ordinateurs par semaine. Configurer ces ordinateurs avec Clonezilla peut se faire avec une ou plusieurs clés usb Clonezilla. Ces manipulations deviennent fastidieuses surtout lorsqu'il faut mettre à jour ces différentes clés. Un serveur DRBL - Clonezilla est d'une utilisation complexe puisqu'il faut intervenir aussi bien sur le serveur que sur le poste client pour le déploiement des systèmes sur les postes clients. Par contre un serveur iPxe couplé à Clonezilla à l'avantage de laisser à chaque poste client le choix de l'image système à cloner, par exemple Debian BIOS ou UEFI sans intervenir sur le serveur lui-même. =====Architecture réseau cible ===== ip a * **eno1** : interface vers Internet (DHCP ou IP statique fournie par votre FAI/routeur). Cette interface ne doit **pas** servir de DHCP/PXE aux clients de clonage. * **enp2s0** : interface vers le réseau local de clonage (ex. `192.168.100.1/24`). C’est sur ce réseau que dnsmasq servira DHCP + TFTP + proxyDHCP pour le PXE. * **Apache** : sert les fichiers Clonezilla (kernel, initrd, squashfs) en HTTP. * **iPXE** : chargeur intermédiaire qui permet de booter Clonezilla via HTTP (plus rapide et fiable que TFTP pour les gros fichiers). [[https://khimananda.com/blog/pxe-boot-for-automated-os-installs|khimananda]] ====1. Préparation du système ==== === 1.1. Installer les paquets nécessaires === sudo apt update sudo apt install -y dnsmasq tftpd-hpa syslinux-common grub-efi-amd64-signed shim-signed ipxe * dnsmasq : DHCP + DNS + TFTP + proxyDHCP. * tftpd-hpa : serveur TFTP (optionnel si vous utilisez uniquement iPXE via HTTP, mais utile pour les premiers chargeurs). * syslinux-common : fournit pxelinux.0, undionly.kpxe, etc. * grub-efi-amd64-signed + shim-signed : pour le boot UEFI sécurisé. * apache2 : serveur HTTP pour Clonezilla. * ipxe : chargeurs iPXE (undionly.kpxe, ipxe.efi). [[https://khimananda.com/blog/pxe-boot-for-automated-os-installs|khimananda]] === 1.2. Désactiver le DHCP du routeur sur le réseau de clonage (pas concerné) === Si votre routeur/switch gère déjà le DHCP sur le réseau 192.168.100.0/24, soit vous le désactivez, soit vous configurez dnsmasq en **proxyDHCP** (recommandé pour coexister avec un DHCP existant). [stackharbor](https://stackharbor.com/fr/base-de-connaissances/dnsmasq-small-network/) ====2. Configuration des interfaces réseau ==== === 2.1. Interface externe **eno1** === Configurez ''eno1'' (DHCP). sudo nano /etc/network/interfaces auto eno1 iface eno1 inet dhcp === 2.2. Interface de clonage ''enp2s0'' === Attribuez une IP statique sur le réseau de clonage : sudo nano /etc/network/interfaces Pas de gateway ici : la gateway par défaut reste sur eno1 auto enp2s0 iface enp2s0 inet static address 192.168.100.1 netmask 255.255.255.0 Redémarrez le réseau : sudo systemctl restart networking # ou sudo nmcli connection up Vérifiez que la route par défaut passe bien par **eno1** : La ligne "default via ..." doit pointer vers la gateway de eno1 ip route show comme ci-dessous default via 192.168.1.254 dev eno1 proto dhcp src 192.168.1.168 metric 1003 192.168.1.0/24 dev eno1 proto dhcp scope link src 192.168.1.168 metric 1003 192.168.100.0/24 dev enp2s0 proto kernel scope link src 192.168.100.1 linkdown Si nécessaire, ajustez les métriques pour prioriser **eno1** : [[https://www.reddit.com/r/debian/comments/1qu1jox/using_2_nics_with_2_networks/|reddit]] Dans sudo nano /etc/network/interfaces ajoutez : iface eno1 inet dhcp metric 100 iface enp2s0 inet static address 192.168.100.1 netmask 255.255.255.0 metric 200 ====3. Configuration de dnsmasq pour PXE (BIOS + UEFI) ==== === 3.1. Créer un fichier de configuration dédié === sudo nano /etc/dnsmasq.d/pxe-clonezilla.conf **Contenu (exemple pour un réseau `192.168.100.0/24`) :** # Interface dédiée au réseau de clonage interface=enp2s0 bind-interfaces # Désactiver le DNS si inutile (optionnel) # no-resolv # DHCP sur le réseau de clonage dhcp-range=enp2s0,192.168.100.100,192.168.100.200,12h dhcp-option=enp2s0,3,192.168.100.1 # passerelle (le serveur lui-même) dhcp-option=enp2s0,6,192.168.100.1 # DNS (le serveur, qui forward vers Internet) dhcp-option=enp2s0,15,clonezilla.local # domaine local # Activer TFTP enable-tftp tftp-root=/srv/tftp # Détection architecture client (BIOS vs UEFI) dhcp-match=set:bios,option:client-arch,0 # BIOS/PCAT dhcp-match=set:efi64,option:client-arch,7 # UEFI x86_64 dhcp-match=set:efi32,option:client-arch,6 # UEFI x86 (rare) # Boot BIOS : iPXE undionly.kpxe dhcp-boot=tag:bios,undionly.kpxe # Boot UEFI x64 : iPXE ipxe.efi (ou shim + grub si Secure Boot) dhcp-boot=tag:efi64,ipxe.efi # Optionnel : proxyDHCP si un autre serveur DHCP existe déjà # dhcp-range=enp2s0,proxy > **Remarque** : Si vous utilisez un DHCP existant sur ce réseau, remplacez la section `dhcp-range` par `dhcp-range=enp2s0,proxy` et assurez-vous que votre DHCP principal ne définit **pas** les options 66/67 (next-server/filename). [[https://stackharbor.com/fr/base-de-connaissances/dnsmasq-small-network/|stackharbor]] === 3.2. Copier les chargeurs de boot dans `/srv/tftp` === sudo mkdir -p /srv/tftp # iPXE pour BIOS sudo cp /usr/lib/ipxe/undionly.kpxe /srv/tftp/ # iPXE pour UEFI x64 sudo cp /usr/lib/ipxe/ipxe.efi /srv/tftp/ # **Optionnel** : pour Secure Boot, utilisez shim + grub sudo cp /usr/lib/shim/shimx64.efi.signed /srv/tftp/bootx64.efi sudo cp /usr/lib/grub/x86_64-efi-signed/grubx64.efi /srv/tftp/grubx64.efi 3.3. Redémarrer dnsmasq J'ai été obligé de redémarrer le serveur pour ne plus avoir d'erreur avec la commandes ci-dessous sudo systemctl restart dnsmasq sudo systemctl enable dnsmasq Vérifiez les logs : sudo journalctl -u dnsmasq -f ====4. Configuration d’Apache pour servir Clonezilla ==== === 4.1. Télécharger Clonezilla Live === Récupérez l’ISO Clonezilla Live stable depuis le site officiel : [[https://clonezilla.org/downloads.php|Clonezilla]] cd /tmp wget https://clonezilla.org/downloads/download.php?dist=debian&select=stable&version=20240801-noble&iso=clonezilla-live-20240801-noble-amd64.iso -O clonezilla-live.iso > Remplacez l’URL par la dernière version disponible. === 4.2. Extraire les fichiers nécessaires === sudo mkdir -p /var/www/html/clonezilla sudo mount -o loop clonezilla-live.iso /mnt sudo cp -r /mnt/live /var/www/html/clonezilla/ sudo umount /mnt Les fichiers importants sont dans /var/www/html/clonezilla/live/ * **vmlinuz** (ou linux) * **initrd.img** (ou initrd.gz) * **filesystem.squashfs** === 4.3. Activer le module headers d’Apache (optionnel, pour les grands fichiers) === sudo a2enmod headers sudo systemctl restart apache2 Vérifiez l’accès HTTP : curl -I http://192.168.100.1/clonezilla/live/vmlinuz ====5. Configuration du menu iPXE ==== ==== 5.1. Créer le fichier `menu.ipxe` ==== sudo nano /var/www/html/clonezilla/menu.ipxe **Contenu :** #!ipxe # Menu principal menu Clonezilla Server item --gap -- ------------------------- item clonezilla_live Clonezilla Live (sauvegarde/restauration) item local Boot local choose --timeout 5000 selected || set selected clonezilla_live goto ${selected} :clonezilla_live echo Chargement de Clonezilla Live... kernel http://192.168.100.1/clonezilla/live/vmlinuz \ boot=live \ union=overlay \ config \ components \ quiet \ noswap \ edd=on \ nomodeset \ locales=fr_FR.UTF-8 \ keyboard-layouts=fr \ ocs_live_run="ocs-live-general" \ ocs_live_extra_param="" \ ocs_live_batch="no" \ ocs_lang="fr_FR.UTF-8" \ vga=788 \ ip=dhcp \ live-media-path=/clonezilla/live/ \ initrd=initrd.img initrd http://192.168.100.1/clonezilla/live/initrd.img boot :local echo Boot local... sanboot --no-describe || chain hd0 || chain fd0 || chain cdrom > **Important** : Ajustez `live-media-path` si nécessaire. Clonezilla Live peut aussi être configuré pour monter le squashfs via HTTP avec `live-media=HTTP`.[[https://khimananda.com/blog/pxe-boot-for-automated-os-installs|khimananda]] ==== 5.2. Faire pointer iPXE vers ce menu ==== Les chargeurs `undionly.kpxe` et `ipxe.efi` doivent charger `menu.ipxe` via HTTP. Pour cela, créez un fichier de configuration iPXE dans `/srv/tftp` : **Pour BIOS (`undionly.kpxe`) :** sudo nano /srv/tftp/pxelinux.cfg/default Mais avec iPXE, il est plus simple d’utiliser un script `.ipxe` chargé directement. Une approche courante est de modifier le comportement de dnsmasq pour qu’il serve un fichier `.ipxe` via TFTP, qui lui-même charge le menu HTTP. **Alternative simple** : créer `/srv/tftp/boot.ipxe` : sudo nano /srv/tftp/boot.ipxe #!ipxe chain http://192.168.100.1/clonezilla/menu.ipxe Puis modifier dnsmasq pour servir ce fichier : # Dans /etc/dnsmasq.d/pxe-clonezilla.conf dhcp-boot=tag:bios,boot.ipxe dhcp-boot=tag:efi64,boot.ipxe Et redémarrer dnsmasq. =====6. Activer le routage et le NAT pour l’accès Internet des clients ===== Pour que les postes clonés puissent accéder à Internet via `eno1` : ==== 6.1. Activer l’IP forwarding ==== sudo nano /etc/sysctl.conf Ajoutez ou décommentez : net.ipv4.ip_forward=1 Appliquez : sudo sysctl -p ==== 6.2. Configurer iptables/nftables pour le NAT ==== **Avec iptables :** sudo iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE sudo iptables -A FORWARD -i enp2s0 -o eno1 -j ACCEPT sudo iptables -A FORWARD -i eno1 -o enp2s0 -m state --state RELATED,ESTABLISHED -j ACCEPT **Pour rendre persistant (Debian 13 utilise nftables par défaut, mais iptables-legacy fonctionne) :** sudo apt install -y iptables-persistent sudo netfilter-persistent save Ou avec nftables : sudo nano /etc/nftables.conf table ip nat { chain postrouting { type nat hook postrouting priority 100; oifname "eno1" masquerade } } table ip filter { chain forward { type filter hook forward priority 0; iifname "enp2s0" oifname "eno1" accept iifname "eno1" oifname "enp2s0" ct state related,established accept } } sudo systemctl restart nftables =====7. Tests et validation ===== ==== 7.1. Vérifier le DHCP ==== Sur un client, lancez : sudo dhclient -v enp2s0 ip addr show enp2s0 cat /etc/resolv.conf Le client doit obtenir une IP dans `192.168.100.100-200`, avec `192.168.100.1` comme gateway et DNS. ==== 7.2. Tester le PXE ==== * Démarrez un poste client en PXE (BIOS ou UEFI). * Il doit charger iPXE, puis afficher le menu Clonezilla. * Sélectionnez Clonezilla Live et vérifiez que le kernel/initrd se chargent via HTTP. ==== 7.3. Vérifier l’accès Internet depuis un client cloné ==== Une fois Clonezilla démarré, ouvrez un terminal et testez : ping -c 3 8.8.8.8 ping -c 3 debian.org ====8. Notes et optimisations ==== * **Secure Boot** : Si vos clients ont Secure Boot activé, utilisez `shimx64.efi` + `grubx64.efi` signés, puis chainload vers iPXE ou directement vers le kernel Clonezilla. [ipxe](https://ipxe.org/secboot) * **Performance** : Servir Clonezilla via HTTP (iPXE) est nettement plus rapide que TFTP pour les gros fichiers. [khimananda](https://khimananda.com/blog/pxe-boot-for-automated-os-installs) * **Sécurité** : Restreignez l’accès Apache au réseau de clonage si nécessaire avec `` dans `/etc/apache2/sites-available/000-default.conf`. * **Logs** : Surveillez `/var/log/syslog` ou `journalctl -u dnsmasq` pour déboguer les problèmes de PXE. ## Résumé des fichiers clés | Fichier | Chemin | Rôle | | Configuration dnsmasq | `/etc/dnsmasq.d/pxe-clonezilla.conf` | DHCP + TFTP + PXE | | Chargeur BIOS | `/srv/tftp/undionly.kpxe` | iPXE pour BIOS | | Chargeur UEFI | `/srv/tftp/ipxe.efi` | iPXE pour UEFI | | Script iPXE | `/srv/tftp/boot.ipxe` | Chainload vers menu HTTP | | Menu iPXE | `/var/www/html/clonezilla/menu.ipxe` | Menu de boot Clonezilla | | Kernel Clonezilla | `/var/www/html/clonezilla/live/vmlinuz` | Noyau Clonezilla | | Initrd Clonezilla | `/var/www/html/clonezilla/live/initrd.img` | RAM disk Clonezilla | | Squashfs | `/var/www/html/clonezilla/live/filesystem.squashfs` | Système Clonezilla | Cette configuration est robuste, supporte BIOS et UEFI, et permet aux postes clonés d’accéder à Internet via le NAT du serveur. [khimananda](https://khimananda.com/blog/pxe-boot-for-automated-os-installs)