Переключение DHCP с помощью PXE
Я пытаюсь настроить аварийное переключение DHCP с разрешенной загрузкой PXE с одного из DHCP-серверов. В соответствии со спецификацией DHCP я настроил отдельные пулы для «обычного» DHCP и для загрузки PXE. Моя конфигурация аварийного переключения работает нормально, но конфигурация DHCP, которая должна отвечать на запросы PXE, больше не работает.
Предыстория: недавно я обновился до AlmaLinux 9 (с CentOS 7), на котором работает ISC DHCP 4.4. В старой конфигурации у меня не было переключения DHCP, и я разрешил загрузку PXE из всего пула. Из-за истории аппаратных сбоев на нашем сайте я хочу настроить переключение DHCP.
Для целей этой конфигурации давайте назовем систему, которая должна отвечать на запросы PXE, «основным» DHCP-сервером. Вот фрагмент/etc/dhcp/dhcpd/conf
с этого сервера. Обратите внимание: я создал отдельный пул только для обработки запросов PXE/BOOTP. (Прошу прощения за дидактический тон комментариев. Они предназначены для меня, поскольку я занимаюсь своими делами системного администратора.)
authoritative; # Send out acknowledgements to DHCP client queries.
failover peer "dhcp-failover" {
primary; # declare this to be the primary server
address 10.4.7.9;
port 647;
peer address 10.4.7.210;
peer port 647;
# How many seconds to wait before we assume that the other has failed.
max-response-delay 30;
# How many BNDUPD messages to send before receiving BNDACK.
max-unacked-updates 10;
# How many seconds to wait before disabling load balancing.
load balance max seconds 3;
# Maximum Client Lead Time = How long a lease may be renewed
# without contacting the other DHCP peer.
mclt 1800;
# The split between primary and secondary. 128 means a
# 50% split between peers; 255 means the primary handles
# everything until it fails.
split 128;
}
# This is the primary DHCP server. Respond to BOOTP requests.
allow booting;
allow bootp;
option domain-name "company.example.com";
option time-offset -18000; # Eastern Standard Time
# Is this a DHCP query (as opposed to a BOOTP query)?
class "dhcp" {
match if exists dhcp-message-type;
}
class "pxe" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
}
subnet 10.4.0.0 netmask 255.255.0.0 {
default-lease-time 86400; # one day (in seconds)
option subnet-mask 255.255.0.0;
option broadcast-address 10.4.255.255;
option routers 10.4.0.1;
option domain-name-servers 10.4.7.7, 10.4.7.29;
option domain-name "company.example.com";
option time-offset -18000; # Eastern Standard Time
option ntp-servers 10.4.7.105, 10.4.7.7, 10.4.7.29;
pool {
failover peer "dhcp-failover";
deny dynamic bootp clients;
deny members of "pxe";
range 10.4.45.1 10.4.45.250; # DHCP pool on private network
}
# A separate pool for BOOTP services.
pool {
range dynamic-bootp 10.4.45.251 10.4.45.255; # DHCP pool on private network
allow dynamic bootp clients;
deny members of "dhcp";
allow members of "pxe";
next-server 10.4.7.9; # On which system the bootp filename is located.
if substring (option vendor-class-identifier, 0, 9) = "PXEClient" {
if substring(option vendor-class-identifier,15,5) = "00007" {
log(info,"UEFI PXE Boot - private network");
filename "pxelinux/grubx64.efi"; # The file to load for EFI systems.
}
else {
log(info,"BIOS PXE Boot - private network");
filename "pxelinux.0"; # The file to load via bootp for BIOS systems.
}
}
}
}
Это из/etc/dhcp/dhcpd.conf
на резервном/вторичном/не PXE-сервере:
authoritative; # Send out acknowledgements to DHCP client queries.
failover peer "dhcp-failover" {
secondary; # declare this to be the secondary server
address 10.4.7.210;
port 647;
peer address 10.4.7.9;
peer port 647;
# How many seconds to wait before we assume that the other has failed.
max-response-delay 30;
# How many BNDUPD messages to send before receiving BNDACK.
max-unacked-updates 10;
# How many seconds to wait before disabling load balancing.
load balance max seconds 3;
}
# Make sure that this failover DHCP server does _not_
# respond to bootp.
deny bootp;
option domain-name "company.example.com";
option time-offset -18000; # Eastern Standard Time
# Is this a DHCP query (as opposed to a BOOTP query)?
class "dhcp" {
match if exists dhcp-message-type;
}
class "pxe" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
}
subnet 10.4.0.0 netmask 255.255.0.0 {
default-lease-time 86400; # one day (in seconds)
option subnet-mask 255.255.0.0;
option broadcast-address 10.4.255.255;
option routers 10.4.0.1;
option domain-name-servers 10.4.7.7, 10.4.7.29;
option domain-name "company.example.com";
option time-offset -18000; # Eastern Standard Time
option ntp-servers 10.4.7.105, 10.4.7.7, 10.4.7.29;
# Note that there are a few IP addresses in the range of the primary
# server that are not included here. This is for BOOTP, which is
# not handled by the secondary server.
pool {
failover peer "dhcp-failover";
deny dynamic bootp clients;
deny members of "pxe";
range 10.4.45.1 10.4.45.250; # DHCP pool on private network
}
}
Я знаю, что переусердствовал с классами «dhcp» и «pxe». Я добавил их, пытаясь решить проблему. Они не имели никакого эффекта, кроме введенияpeer holds all free leases
сообщения журнала ниже.
Вот что я вижу в логах «основного» сервера. Обратите внимание, что это MAC-адрес тестовой системы, которую я настроил для загрузки через PXE, прежде чем она «сдастся» и вместо этого загрузится с диска.
Sep 8 14:20:46 dhcpd dhcpd[17922]: DHCPDISCOVER from 52:54:00:31:f2:7f via enp7s0: peer holds all free leases
Sep 8 14:20:49 dhcpd dhcpd[17922]: DHCPDISCOVER from 52:54:00:31:f2:7f via enp7s0: peer holds all free leases
Sep 8 14:20:57 dhcpd dhcpd[17922]: DHCPDISCOVER from 52:54:00:31:f2:7f via enp7s0: peer holds all free leases
Sep 8 14:21:13 dhcpd dhcpd[17922]: DHCPDISCOVER from 52:54:00:31:f2:7f via enp7s0: peer holds all free leases
Это из журнала на "вторичном" сервере. Это соответствует примерно одной минутной задержке с момента первой загрузки клиента, когда он пытается найти PXE-сервер, до момента, когда он переключается с загрузки из ОС и получает адрес DHCP обычным способом.
Sep 8 14:20:46 dhcpdsec dhcpd[67768]: DHCPDISCOVER from 52:54:00:31:f2:7f via enp7s0: peer holds all free leases
Sep 8 14:20:46 dhcpdsec dhcpd[67768]: bind update on 10.4.45.183 from dhcp-failover rejected: incoming update is less critical than outgoing update
Sep 8 14:20:49 dhcpdsec dhcpd[67768]: DHCPDISCOVER from 52:54:00:31:f2:7f via enp7s0: peer holds all free leases
Sep 8 14:20:57 dhcpdsec dhcpd[67768]: DHCPDISCOVER from 52:54:00:31:f2:7f via enp7s0: peer holds all free leases
Sep 8 14:21:13 dhcpdsec dhcpd[67768]: DHCPDISCOVER from 52:54:00:31:f2:7f via enp7s0: peer holds all free leases
Sep 8 14:22:03 dhcpdsec dhcpd[67768]: DHCPREQUEST for 10.4.45.183 from 52:54:00:31:f2:7f via enp7s0
Sep 8 14:22:04 dhcpdsec dhcpd[67768]: DHCPACK on 10.4.45.183 to 52:54:00:31:f2:7f via enp7s0
Покопавшись в предыдущих тестах, я подтвердил, что значениеsubstring (option vendor-class-identifier, 0, 9)
действительноPXEClient
.
Я уже пытался остановить демон dhcpd на обеих машинах и вручную отредактировать записи для52:54:00:31:f2:7f
в/var/lib/dhcpd/dhcpd.leases
. Без изменений.
Есть идеи?
Изменить: мне пришло в голову, что это может помочь опубликовать мою предыдущую конфигурацию DHCP без переключения при отказе. Загрузка PXE прошла нормально:
subnet 10.4.0.0 netmask 255.255.0.0 {
range dynamic-bootp 10.4.45.1 10.4.45.254; # DCHP pool on private network
default-lease-time 86400; # one day (in seconds)
option subnet-mask 255.255.0.0;
option broadcast-address 10.4.255.255;
option routers 10.4.0.1;
option domain-name-servers 10.4.7.7, 10.4.7.29;
option domain-name "nevis.columbia.edu";
option time-offset -18000; # Eastern Standard Time
option ntp-servers 10.4.7.105, 10.4.7.7, 10.4.7.29;
next-server 10.4.7.9; # On which system the bootp filename is located.
if substring (option vendor-class-identifier, 0, 9) = "PXEClient" {
if substring(option vendor-class-identifier,15,5) = "00007" {
log(info,"UEFI PXE Boot - private network");
filename "pxelinux/grubx64.efi"; # The file to load for EFI systems.
}
else {
log(info,"BIOS PXE Boot - private network");
filename "pxelinux.0"; # The file to load via bootp for BIOS systems.
}
}
}
1 ответ
Я нашел ответ после долгих экспериментов: оказывается, порядок операторов контроля доступа в пуле имеет значение.
Вот повторение определений классов из моего исходного поста:
class "dhcp" {
match if exists dhcp-message-type;
}
class "pxe" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
}
Вот определение, которое работает на моем основном DHCP-сервере. Основное различие между этой конфигурацией и конфигурацией из моего исходного поста заключается в том, что порядокrange
заявления по сравнению с любымallow
илиdeny
утверждения, и что я определяю"pxe"
сначала бассейн. Исходные строки аварийного переключения не изменяются.
subnet 10.4.0.0 netmask 255.255.0.0 {
default-lease-time 86400; # one day (in seconds)
option subnet-mask 255.255.0.0;
option broadcast-address 10.4.255.255;
option routers 10.4.0.1;
option domain-name-servers 10.4.7.7, 10.4.7.29;
option domain-name "company.example.com";
option time-offset -18000; # Eastern Standard Time
option ntp-servers 10.4.7.105, 10.4.7.7, 10.4.7.29;
# A separate pool for PXE services.
pool {
range dynamic-bootp 10.4.45.251 10.4.45.255; # DHCP pool on private network
allow dynamic bootp clients;
allow members of "pxe";
next-server 10.4.7.9; # On which system the bootp filename is located.
if substring (option vendor-class-identifier, 0, 9) = "PXEClient" {
if option architecture-type = 00:07 {
filename "uefi/grubx64.efi"; # The file to load for EFI systems.
}
else {
filename "pxelinux/pxelinux.0"; # The file to load via bootp for BIOS systems.
}
}
}
# The "regular" DHCP pool.
pool {
failover peer "dhcp-failover";
range 10.4.45.1 10.4.45.250; # DHCP pool on private network
deny dynamic bootp clients;
deny members of "pxe";
}
}
Вот исправленныеsubnet
строки в конфигурации моего вторичного DHCP-сервера, хотя эти изменения, вероятно, не имеют значения:
subnet 10.4.0.0 netmask 255.255.0.0 {
default-lease-time 86400; # one day (in seconds)
option subnet-mask 255.255.0.0;
option broadcast-address 10.4.255.255;
option routers 10.4.0.1;
option domain-name-servers 10.4.7.7, 10.4.7.29;
option domain-name "company.example.com";
option time-offset -18000; # Eastern Standard Time
option ntp-servers 10.4.7.105, 10.4.7.7, 10.4.7.29;
# Note that there are a few IP addresses in the range of the primary
# server that are not included here. This is for PXE, which is
# not handled by the secondary server.
pool {
failover peer "dhcp-failover";
deny dynamic bootp clients;
range 10.4.45.1 10.4.45.250; # DCHP pool on private network
}
}
Теперь у меня есть настройка как с переключением DHCP, так и с загрузкой PXE для установки/восстановления ОС, которая поддерживает системы BIOS и EFI. Я надеюсь, что кто-то найдет приведенные выше строки полезными!