PXE – Загрузка по сети: сетевая загрузочная флешка

0
11590
Обложка статьи: PXE - Загрузка по сети: сетевая загрузочная флешка

Нужна сетевая установка ОС: DHCP раздаёт PXE, TFTP отдаёт загрузчик, машина стартует без флешки. В проде — отдельный VLAN, TFTP не в пользовательскую сеть. TFTP не шифрует трафик.

Что нужно заранее

  • Сервер в PXE-VLAN с адресом вроде 192.0.2.10.
  • DHCP (isc-dhcp, dnsmasq или DHCP на MikroTik) и TFTP. Linux-TFTP — tftpd-hpa.
  • Образ загрузчика (pxelinux / grub netboot / дистрибутивный netboot). Не раздавайте ISO целиком через TFTP — медленно и не для того протокол.

1. DHCP: куда идти за загрузчиком

Пример dnsmasq на Debian (один файл, DHCP+TFTP). Подставьте свою сеть.

interface=eth1
bind-interfaces
dhcp-range=192.0.2.100,192.0.2.200,12h
dhcp-option=3,192.0.2.1
dhcp-option=6,192.0.2.53
dhcp-boot=pxelinux.0
enable-tftp
tftp-root=/srv/tftp
sudo systemctl restart dnsmasq
ss -lnup | grep -E ':67|:69'

Ожидание: UDP/67 и UDP/69 на интерфейсе PXE, не на WAN. На отдельном isc-dhcp те же next-server и filename. На MikroTik — DHCP option 66/67 плюс TFTP из статьи про TFTP.

2. Файлы загрузчика

sudo mkdir -p /srv/tftp/pxelinux.cfg
# положите pxelinux.0, ldlinux.c32 и меню своей сборки в /srv/tftp
echo 'DEFAULT local
LABEL local
  LOCALBOOT 0' | sudo tee /srv/tftp/pxelinux.cfg/default

Дальше — меню дистрибутива (Debian installer, Rocky boot.ipxe). Пути и имена файлов берите из документации образа, не из статьи 2021 года.

3. Изолировать

Файрвол сервера: UDP/67,68,69 и порты HTTP, если ядро/initrd качаете по http, только из PXE-VLAN. Коммутатор: клиенты PXE не ходят в офисную VLAN без нужды. Не ставьте PXE на тот же DHCP, что раздаёт адреса гостям Wi‑Fi.

BIOS и UEFI

Старые компьютеры загружаются в режиме BIOS (pxelinux.0), новые — по UEFI, и им нужен другой загрузчик. Сервер должен выдавать файл в зависимости от типа клиента. Пример для dnsmasq:

dhcp-match=set:efi64,option:client-arch,7
dhcp-match=set:efi64,option:client-arch,9
dhcp-boot=tag:efi64,grubnetx64.efi.signed
dhcp-boot=tag:!efi64,pxelinux.0

Имена файлов зависят от дистрибутива (grubnetx64.efi.signed в Debian/Ubuntu, shimx64.efi в RHEL-семействе). При включённом Secure Boot загрузчик должен быть подписан, возьмите его из netboot-архива вашего дистрибутива.

Автоматическая установка

Чтобы машина ставилась без вопросов, укажите файл ответов в параметрах ядра:

Система Механизм
Debian preseed: auto url=http://192.0.2.10/preseed.cfg
RHEL, Rocky, РЕД ОС kickstart: inst.ks=http://192.0.2.10/ks.cfg
Ubuntu Server autoinstall (cloud-init): autoinstall ds=nocloud-net;s=http://192.0.2.10/

В файлах ответов не храните пароли в открытом виде: используйте хеши. Сами файлы раздавайте только внутри сегмента установки.

HTTP вместо TFTP для больших файлов

Ядро и образ initrd весят десятки мегабайт, а TFTP работает медленно. Современные загрузчики (iPXE, GRUB) умеют загружать их по HTTP: настройте TFTP только для первого загрузчика, остальное — через nginx. Это ускоряет установку и упрощает сетевой доступ: nginx.

Безопасность

  • Сеть PXE должна быть изолирована: любой, кто подключился к ней, может подсунуть свой DHCP и загрузить машину с чужого образа.
  • Оставляйте автоматическую установку включённой только на время массового развёртывания, потому что она может стереть диск машины.
  • Разделяйте DHCP установки и пользовательские сети. Сервер приведите в порядок: hardening Linux.

Как проверить

Тестовая ВМ в PXE-VLAN получает адрес, качает загрузчик, видит меню. ss -lnup на сервере не слушает 69/udp на публичном IP. С пользовательской сети TFTP не отвечает.

Источники

Оставьте свой ответ