ipxe
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| ipxe [2026/08/28 15:13] – [5.1 Fichier de configuration principal] rene | ipxe [2026/09/02 16:41] (Version actuelle) – supprimée rene | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====== Serveur iPXE - Clonezilla sur Debian 13 ====== | ||
| - | |||
| - | ===== Pourquoi un serveur iPXE - Clonezilla ===== | ||
| - | |||
| - | |||
| - | L' | ||
| - | |||
| - | |||
| - | ===== Architecture cible ===== | ||
| - | |||
| - | Internet <-> [eno1 / ext] Debian 13 Serveur Clonezilla [enp2s0 / lan] <-> Switch <-> Postes clients (BIOS/UEFI) | ||
| - | | ||
| - | NAT/ | ||
| - | Nginx (HTTP fichiers Clonezilla) | ||
| - | |||
| - | |||
| - | ===== 1. Prérequis système ===== | ||
| - | |||
| - | ==== 1.1 Interfaces réseau ==== | ||
| - | |||
| - | Identifier les deux interfaces : | ||
| - | |||
| - | '' | ||
| - | |||
| - | On suppose dans cette page que : | ||
| - | * eno1 : interface externe (Internet), déjà configurée par DHCP ou IP statique | ||
| - | * enp2s0 : interface interne (réseau de clonage), IP statique 192.168.100.1/ | ||
| - | |||
| - | ==== 1.2 Configuration de l' | ||
| - | |||
| - | Créer/ | ||
| - | |||
| - | ''/ | ||
| - | |||
| - | auto enp2s0 | ||
| - | iface enp2s0 inet static | ||
| - | address 192.168.100.1/ | ||
| - | dns-nameservers 8.8.8.8 1.1.1.1 | ||
| - | |||
| - | Puis activer : | ||
| - | sudo ifdown enp2s0 2>/ | ||
| - | |||
| - | ⚠️ Ne définissez pas de passerelle par défaut sur enp2s0 si eno1 fournit déjà la route par défaut. Retirez la ligne gateway ci-dessus dans ce cas. | ||
| - | |||
| - | |||
| - | ===== 2. Installation des paquets ===== | ||
| - | |||
| - | sudo apt update | ||
| - | sudo apt install -y nginx dnsmasq ipxe-qemu pxelinux syslinux-common wget rsync unzip nftables | ||
| - | |||
| - | Le résultat peut-être celui-là | ||
| - | |||
| - | wget est déjà la version la plus récente (1.25.0-2). | ||
| - | rsync est déjà la version la plus récente (3.4.1+ds1-5+deb13u4). | ||
| - | rsync passé en « installé manuellement ». | ||
| - | unzip est déjà la version la plus récente (6.0-29+deb13u1). | ||
| - | unzip passé en « installé manuellement ». | ||
| - | nftables est déjà la version la plus récente (1.1.3-1). | ||
| - | Installation de : | ||
| - | dnsmasq | ||
| - | Installation de dépendances : | ||
| - | nginx-common | ||
| - | Paquets suggérés : | ||
| - | resolvconf | ||
| - | |||
| - | |||
| - | ===== 3. Préparation des fichiers Clonezilla ===== | ||
| - | |||
| - | ==== 3.1 Téléchargement de Clonezilla Live ==== | ||
| - | | ||
| - | A partir de https:// | ||
| - | |||
| - | cd /tmp | ||
| - | sudo unzip clonezilla-live-3.3.3-15-amd64.zip -d /tmp/cz | ||
| - | |||
| - | ==== 3.2 Extraction des fichiers de démarrage ==== | ||
| - | |||
| - | Clonezilla Live utilise une architecture classique de live-boot : noyau Linux, initramfs, et filesystem.squashfs. | ||
| - | |||
| - | sudo mkdir -p / | ||
| - | sudo mkdir -p / | ||
| - | | ||
| - | # Copier les fichiers du système de fichiers live (squashfs + vmlinuz + initrd) | ||
| - | sudo cp / | ||
| - | sudo cp / | ||
| - | sudo cp / | ||
| - | | ||
| - | # Copier aussi les fichiers pour TFTP (si besoin de PXELINUX en fallback) | ||
| - | sudo cp / | ||
| - | sudo cp / | ||
| - | | ||
| - | Arborescence cible | ||
| - | |||
| - | / | ||
| - | ├── live/ | ||
| - | │ | ||
| - | │ | ||
| - | │ | ||
| - | └── boot.ipxe | ||
| - | | ||
| - | /srv/tftp/ | ||
| - | ├── undionly.kpxe | ||
| - | ├── ipxe.efi | ||
| - | └── boot.ipxe | ||
| - | |||
| - | Copier les firmwares iPXE vers le répertoire TFTP : | ||
| - | |||
| - | # Créer le répertoire TFTP si nécessaire | ||
| - | sudo mkdir -p / | ||
| - | | ||
| - | # Télécharger les binaires iPXE depuis le site officiel | ||
| - | cd / | ||
| - | | ||
| - | # Pour BIOS (Legacy) | ||
| - | sudo wget http:// | ||
| - | | ||
| - | # Pour UEFI x86-64 | ||
| - | sudo wget http:// | ||
| - | | ||
| - | | ||
| - | sudo cp / | ||
| - | sudo cp / | ||
| - | |||
| - | ===== 4. Création du script iPXE ===== | ||
| - | |||
| - | Le script iPXE est le cœur de la chaîne de boot. Il télécharge le noyau et l' | ||
| - | |||
| - | sudo tee / | ||
| - | #!ipxe | ||
| - | | ||
| - | echo ============================================ | ||
| - | echo | ||
| - | echo | ||
| - | echo ============================================ | ||
| - | echo | ||
| - | | ||
| - | set server_ip 192.168.100.1 | ||
| - | set http_base http:// | ||
| - | | ||
| - | kernel ${http_base}/ | ||
| - | initrd ${http_base}/ | ||
| - | boot | ||
| - | IPXEEOF | ||
| - | |||
| - | Explication des paramètres du noyau | ||
| - | |||
| - | Paramètre | ||
| - | boot=live | ||
| - | username=user | ||
| - | union=overlay | ||
| - | config components quiet Charge les composants de config, mode silencieux | ||
| - | ocs_prerun=" | ||
| - | ocs_live_run=" | ||
| - | keyboard-layouts=fr | ||
| - | locales=fr_FR.UTF-8 | ||
| - | ip=dhcp | ||
| - | vga=791 | ||
| - | |||
| - | |||
| - | Copier le script également en TFTP (au cas où) : | ||
| - | |||
| - | sudo cp / | ||
| - | |||
| - | |||
| - | 💡 Si vous souhaitez automatiser le clonage sans menu interactif, remplacez ocs_live_run par exemple : | ||
| - | ocs_live_run=" | ||
| - | |||
| - | (à adapter selon votre image et vos disques cibles) | ||
| - | |||
| - | |||
| - | ===== 5. Configuration de dnsmasq (DHCP + TFTP + Proxy-DNS) ===== | ||
| - | |||
| - | dnsmasq gère à la fois le DHCP, le TFTP et la redirection vers iPXE en fonction du type de client (BIOS ou UEFI). | ||
| - | |||
| - | ==== 5.1 Fichier de configuration principal ==== | ||
| - | |||
| - | sudo mv / | ||
| - | |||
| - | sudo tee / | ||
| - | | ||
| - | | ||
| - | # ===================================================== | ||
| - | # dnsmasq - Serveur Clonezilla (DHCP + TFTP + DNS proxy) | ||
| - | # ===================================================== | ||
| - | | ||
| - | # --- Écoute uniquement sur l' | ||
| - | interface=enp2s0 | ||
| - | bind-interfaces | ||
| - | | ||
| - | # --- Plage DHCP --- | ||
| - | dhcp-range=192.168.100.100, | ||
| - | dhcp-option=option: | ||
| - | dhcp-option=option: | ||
| - | | ||
| - | # --- TFTP --- | ||
| - | enable-tftp | ||
| - | tftp-root=/ | ||
| - | | ||
| - | # --- Redirection selon le type de boot client --- | ||
| - | | ||
| - | # Option 43 (Vendor Class) pour identifier les clients PXE | ||
| - | dhcp-match=set: | ||
| - | dhcp-match=set: | ||
| - | dhcp-match=set: | ||
| - | | ||
| - | # BIOS Legacy → charger undionly.kpxe | ||
| - | dhcp-boot=tag: | ||
| - | | ||
| - | # UEFI x86_64 → charger ipxe-snponly.efi | ||
| - | dhcp-boot=tag: | ||
| - | | ||
| - | # --- 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=/ | ||
| - | DNSMASQEOF | ||
| - | | ||
| - | ==== 5.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>/ | ||
| - | sudo systemctl disable systemd-resolved 2>/ | ||
| - | | ||
| - | # Alternative: | ||
| - | # Editez / | ||
| - | # Puis: sudo systemctl restart systemd-resolved | ||
| - | |||
| - | ==== 5.3 Redémarrage de dnsmasq ==== | ||
| - | |||
| - | sudo systemctl enable dnsmasq | ||
| - | sudo systemctl restart dnsmasq | ||
| - | sudo systemctl status dnsmasq | ||
| - | |||
| - | Vérifiez que le DHCP et le TFTP écoutent : | ||
| - | ss -ulnp | grep -E ' | ||
| - | ss -tlnp | grep -E ' | ||
| - | | ||
| - | |||
| - | ===== 6. Configuration de Nginx ===== | ||
| - | |||
| - | |||
| - | ==== 6.1 Création du bloc serveur ==== | ||
| - | |||
| - | |||
| - | sudo tee / | ||
| - | server { | ||
| - | listen 80; | ||
| - | listen [::]:80; | ||
| - | | ||
| - | server_name 192.168.100.1; | ||
| - | | ||
| - | # Servir uniquement sur l' | ||
| - | # Pour limiter l' | ||
| - | allow 192.168.100.0/ | ||
| - | deny all; | ||
| - | | ||
| - | root /srv/www; | ||
| - | | ||
| - | location / | ||
| - | 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/ | ||
| - | application/ | ||
| - | application/ | ||
| - | application/ | ||
| - | text/plain ipxe; | ||
| - | } | ||
| - | } | ||
| - | | ||
| - | # Page d' | ||
| - | location / { | ||
| - | try_files $uri $uri/ =404; | ||
| - | } | ||
| - | } | ||
| - | NGINXEOF | ||
| - | | ||
| - | ==== 6.2 Activation du site ==== | ||
| - | |||
| - | |||
| - | sudo rm -f / | ||
| - | sudo ln -sf / | ||
| - | |||
| - | # Vérifier la syntaxe | ||
| - | sudo nginx -t | ||
| - | |||
| - | # Redémarrer | ||
| - | sudo systemctl restart nginx | ||
| - | sudo systemctl enable nginx | ||
| - | |||
| - | ==== 6.3 Test de l' | ||
| - | |||
| - | Depuis une machine du réseau 192.168.100.0/ | ||
| - | curl http:// | ||
| - | curl -I http:// | ||
| - | |||
| - | Vous devez voir 200 OK et le contenu du script/de la liste. | ||
| - | |||
| - | ===== 7. Configuration du routage et du NAT ===== | ||
| - | |||
| - | |||
| - | 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 enp2s0 (lan) et eno1 (wan). | ||
| - | |||
| - | ==== 7.1 Activation du forwarding IPv4 ==== | ||
| - | |||
| - | |||
| - | sudo tee -a / | ||
| - | net.ipv4.ip_forward = 1 | ||
| - | EOF | ||
| - | |||
| - | sudo sysctl -p / | ||
| - | |||
| - | ==== 7.2 Règles NAT avec nftables ==== | ||
| - | |||
| - | Sur Debian 13, nftables remplace iptables : | ||
| - | sudo tee / | ||
| - | # | ||
| - | | ||
| - | flush ruleset | ||
| - | | ||
| - | table ip nat { | ||
| - | chain postrouting { | ||
| - | type nat hook postrouting priority srcnat; policy accept; | ||
| - | | ||
| - | # Masquerade : tout le trafic sortant par eno1 (internet) | ||
| - | oifname " | ||
| - | } | ||
| - | } | ||
| - | | ||
| - | table ip filter { | ||
| - | chain forward { | ||
| - | type filter hook forward priority filter; policy drop; | ||
| - | | ||
| - | # Autoriser le trafic établi à revenir | ||
| - | ct state established, | ||
| - | | ||
| - | # Autoriser le trafic du LAN de clonage vers internet | ||
| - | iifname " | ||
| - | | ||
| - | # Bloquer le trafic d' | ||
| - | iifname " | ||
| - | } | ||
| - | } | ||
| - | NFTCONF | ||
| - | |||
| - | |||
| - | sudo chmod +x / | ||
| - | 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 / | ||
| - | 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, | ||
| - | |||
| - | |||
| - | ===== 8. Chaîne de boot détaillée ===== | ||
| - | |||
| - | 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 enp2s0. dnsmasq répond avec une IP dans la plage 192.168.100.100-200 et indique le fichier de boot correspondant à l' | ||
| - | |||
| - | - 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, | ||
| - | |||
| - | ⚠️** 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:// | ||
| - | |||
| - | **Approche B** — Chaînage via dnsmasq (plus simple) : | ||
| - | Configurer dnsmasq pour envoyer l' | ||
| - | |||
| - | ==== 8.1 Configuration dnsmasq avec double DHCP (chain loading iPXE) ==== | ||
| - | |||
| - | |||
| - | Modifiez la section de boot dans / | ||
| - | |||
| - | sudo tee -a / | ||
| - | | ||
| - | # === 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: | ||
| - | | ||
| - | # BIOS Legacy | ||
| - | dhcp-boot=tag: | ||
| - | dhcp-boot=tag: | ||
| - | | ||
| - | # UEFI x86_64 | ||
| - | dhcp-boot=tag: | ||
| - | dhcp-boot=tag: | ||
| - | DNSMASQAPPEND | ||
| - | |||
| - | 📝 Le principe : lors de la première requête DHCP, le client n'est pas encore iPXE (tag: | ||
| - | |||
| - | 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:// | ||
| - | |||
| - | **Étape 5** — Boot Clonezilla : | ||
| - | Le noyau démarre, monte le filesystem.squashfs, | ||
| - | |||
| - | ===== 9. Vérifications et dépannage ===== | ||
| - | |||
| - | |||
| - | ==== 9.1 Journal dnsmasq ==== | ||
| - | |||
| - | |||
| - | sudo tail -f / | ||
| - | |||
| - | Vous devriez voir les étapes DHCP, la détection de l' | ||
| - | |||
| - | ==== 9.2 Journal Nginx ==== | ||
| - | |||
| - | |||
| - | sudo tail -f / | ||
| - | |||
| - | Vous devriez voir les requêtes GET pour / | ||
| - | |||
| - | ==== 9.3 Tests manuels ==== | ||
| - | |||
| - | |||
| - | Depuis une machine du réseau de clonage : | ||
| - | # Tester le DHCP | ||
| - | sudo dhclient -d -v enp2s0 | ||
| - | |||
| - | # 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:// | ||
| - | curl -I http:// | ||
| - | | ||
| - | ==== 9.4 Tableau de dépannage ==== | ||
| - | |||
| - | Symptôme | ||
| - | Le client n' | ||
| - | Pas de transfert TFTP Mauvais tftp-root ou permissions | ||
| - | iPXE charge mais ne trouve pas boot.ipxe | ||
| - | Nginx retourne 403 | ||
| - | filesystem.squashfs introuvable | ||
| - | Boot UEFI échoue | ||
| - | Pas d' | ||
| - | Les performances de clonage sont lentes | ||
| - | |||
| - | ===== 10. Récapitulatif du flux réseau ===== | ||
| - | |||
| - | |||
| - | **Flux réseau complet | ||
| - | |||
| - | Client (BIOS/UEFI) → DHCP sur enp2s0 → dnsmasq fournit IP + firmware iPXE via TFTP → iPXE recharge DHCP (user-class iPXE) → dnsmasq répond avec URL HTTP http:// | ||
| - | |||
| - | **Points critiques | ||
| - | |||
| - | - Le chaînage double-DHCP (user-class iPXE) est essentiel pour router du firmware PXE vers le script HTTP. | ||
| - | - L' | ||
| - | |||
| - | ===== 11. Sécurité et bonnes pratiques ===== | ||
| - | |||
| - | |||
| - | * Restreindre Nginx au réseau 192.168.100.0/ | ||
| - | * 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é/ | ||
| - | * Sauvegarder vos images Clonezilla sur un disque séparé monté dans / | ||
| - | * 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' | ||
| - | |||
ipxe.1787930022.txt.gz · Dernière modification : de rene
