12 Januar 2026

Foreman in IPv6-lastigen und IPv6-only Umgebungen

Foreman ist eindeutig in einer IPv4-Welt verwurzelt. Das sieht man überall. Es scheint, als ob es Ihnen keinen Host ohne IPv4 geben möchte, aber ohne IPv6 ist es in Ordnung. Aber das muss nicht so sein, also begeben wir uns gemeinsam auf eine Reise, um Foreman und die Dinge um ihn herum in die Gegenwart zu bringen.

Hintergrund

Wir beginnen mit einer typischen Foreman-Installation, die zum Bootstrappen neuer Systeminstallationen verwendet wird. Dieser Foreman verwendet einen ISC-DHCP-Server und einen TFTP-Server, um Systeme mit Boot-Informationen zu versorgen. Er verwendet einen Foreman-Proxy, um diese DHCP- und TFTP-Server zu konfigurieren.

Der DHCP-Server speichert Leases für jedes System. Für jede MAC-Adresse speichert der DHCP-Server den Hostnamen, die IPv4-Adresse und die Boot-Datei, die auf ein Standard-PXELinux verweist. Die Leases werden von Foreman bei jeder Änderung seines internen Zustands eingerichtet.

Der TFTP-Server speichert alle für das Booten erforderlichen Dateien. Der TFTP-Server stellt die statischen PXELinux-Binärdateien bereit. Er speichert auch PXELinux-Konfigurationsdateien für jede MAC-Adresse separat. Diese Konfigurationen teilen jedem System mit, ob es ein Installationsprogramm oder das System auf dem lokalen Speicher booten soll. Foreman ändert diese Konfigurationsdateien ständig, abhängig vom internen Zustand.

Das bedeutet, dass wir viele Orte haben, an denen wir Daten speichern müssen. Nicht nur Foreman speichert alle Informationen in seiner eigenen Datenbank, sondern auch der DHCP- und TFTP-Server müssen Informationen für den normalen Betrieb des Gesamtsystems speichern. Wir können diese Informationen wiederherstellen, wenn sie verloren gehen, aber dieser Prozess ist manuell.

Booten über iPXE und IPv6

qemu verwendet iPXE als Standard-PXE-Loader. libvirt verwendet beispielsweise qemu. iPXE ist leistungsstark und verfügt über eine eigene Skriptsprache. Außerdem implementiert es IPv6 in einem nützlichen Zustand.

iPXE unterstützt Skripte. Foreman verwendet dies im iPXE Intermediate Script, das auf der Registerkarte „Betriebssystem“ als „PXE Loader“ angezeigt wird. Dieses Skript versucht den dhcp iPXE-Befehl auf vielen Netzwerkgeräten, der dann sowohl die IPv4- als auch die IPv6-Konfiguration ausprobiert. Wenn iPXE eine Konfiguration findet, fragt es Foreman nach der nächsten Bootloader-Phase, die ebenfalls ein Skript ist, das entweder ein Installationsprogramm oder das installierte System ausführt.

iPXE unterstützt IPv6 in einem nützlichen Zustand. iPXE kann IPv6 Router Advertisements empfangen und verwendet diese, um seine eigene Hostadresse und sein Gateway festzulegen. Außerdem verwendet es das Flag „other information“, um den DHCPv6-Client auf Anfrage zu aktivieren. Anschließend fragt es über DHCPv6 nach zusätzlichen Konfigurationen, wie z. B. der Boot-Datei. Die Boot-Datei verweist auf den Loader der nächsten Phase und ist somit ein kritischer Informationsteil.

dnsmasq kann sowohl Router Advertisements als auch zustandslose DHCPv6 bereitstellen.

Listing: dnsmasq config to enable Router Advertisements, stateless DHCPv6 and iPXE bootstrap

dhcp-range=2001:db8::,ra-stateless
dhcp-option=option6:bootfile-url,http://foreman.example.com/unattended/iPXE?bootstrap=1

Booten über UEFI und IPv6

Wenn Sie ein aktuelles iPXE haben, ist das Ganze einfach. Aber jetzt kommt UEFI ins Spiel. UEFI benötigt ebenfalls einen Netzwerk-Stack und qemu stellt iPXE dafür bereit. Aber iPXE bietet nur Netzwerkzugriff, UEFI selbst übernimmt die Kommunikation. Aber UEFI wäre nicht UEFI, wenn es die Dinge vernünftig angehen würde. Das bedeutet, dass zumindest die Referenzimplementierung EDK2 keine Router Advertisements unterstützt, sondern nur zustandsbehaftetes DHCPv6.

Aber das Fehlen der iPXE-Kernfunktionalität bedeutet auch, dass wir eine wichtige Funktion verlieren, die wir oben genutzt haben, die Skriptsprache. Selbst wenn DHCPv6 Adressen bereitstellt, kann dieses Setup jetzt nur noch UEFI-Binärdateien laden.

Aber wir haben immer noch ein vollständiges iPXE für EFI, nur als eigenständige Binärdatei. Wir können diese Binärdatei über TFTP laden und dann dieselbe Boot-Kette wie ohne UEFI wiederverwenden. Beachten Sie jedoch, dass dies viel langsamer ist, da UEFI Minuten braucht, um über IPv4 zu booten.

Listing: dnsmasq config to enable stateful DHCPv6 and TFTP chain loading

dhcp-range=2001:db8::1,2001:db8::ffff
dhcp-option=option6:dns-server,[2001:db8::]
dhcp-option=tag:pxe-amd64,option6:bootfile-url,tftp://2001:db8::/ipxe-amd64.efi
dhcp-vendorclass=set:pxe-amd64,enterprise:343,PXEClient:Arch:00007:UNDI:003001
enable-tftp
tftp-root=/usr/lib/ipxe/

 

Bugs

Natürlich haben wir Fehler gefunden, aber für alle haben wir Workarounds.

Foreman und IPv6-only

Foreman mag es nicht wirklich, wenn das IPv4-Netzwerk leer ist. Wenn Sie versuchen, das IPv4-Netzwerk in der Schnittstellenkonfiguration zu deaktivieren, fügt es einfach eines wieder hinzu. Ich habe dafür noch keinen Fehlerbericht geschrieben.

Ein Workaround, den ich gefunden habe, ist:

  • Erstellen Sie ein Subnetz mit dem IPv4-Link-Local-Bereich 169.254.0.0/16.
  • Weisen Sie dieses Netzwerk der Schnittstelle zu.

Die Netzwerkinformationen verschwinden dann und nur das IPv6-Netzwerk bleibt übrig.

iPXE stellt falsche Parameter für Preseed bereit

Das Template-Snippet „preseed_kernel_options“ fügt der Befehlszeile für Preseed (aka Debian) hinzu: netcfg/get_ipaddress=${netX/ip}. Dies verwendet interne iPXE-Variablen, die leer sind, wenn kein DHCPv4 vorhanden ist. Gemeldet als Issue #38536.

Listing: workaround for „Preseed default iPXE“ template

--- a/app/views/unattended/provisioning_templates/iPXE/preseed_default_ipxe.erb
+++ b/app/views/unattended/provisioning_templates/iPXE/preseed_default_ipxe.erb
@@ -36,7 +36,7 @@ ping --count 1 ${netX/dns} || echo Ping to DNS failed or ping command not availa
 <% kernel = boot_files_uris[0] -%>
 <% initrd = boot_files_uris[1] -%>
 
-kernel <%= kernel %> initrd=initrd.img interface=auto url=<%= url %> ramdisk_size=10800 root=/dev/rd/0 rw auto <%= snippet("preseed_kernel_options", variables: {ipxe_net: true}).strip %>
+kernel <%= Kernel %> initrd=initrd.img interface=auto url=<%= url %> ramdisk_size=10800 root=/dev/rd/0 rw auto  <%= snippet("preseed_kernel_options").strip %>
 
 initrd <%= initrd %>
 

Fazit

Es bedarf noch etwas Arbeit, aber Foreman kann sowohl in IPv6-lastigen als auch in IPv6-only-Umgebungen arbeiten. Die gesamte Kommunikation zwischen verwalteten Systemen und Foreman, einschließlich Support-Services, verwendet IPv6, wenn dies so konfiguriert ist.

Wir haben auch mehrere Dienste entfernt, die Daten speichern, wie z. B. den ISC-DHCP-Server und den TFTP-Server. Der Ersatz ist größtenteils zustandslos.

Kategorien: Automatisierung credativ® Inside HowTos
Tags: Debian DevOps Foreman

Array

über den Autor

Bastian


Beitrag teilen: