dhcpd не обрабатывает трансляцию DHCPDISCOVER
Мой DHCP-сервер обрабатывает две подсети. Первая подсеть это все host
-> fixed-address
наборы для известного оборудования. Вторая подсеть имеет пул, настроенный для обработки виртуальных машин в vCenter.
Теперь, если я сделал это правильно, dhcpd сопоставляет первые три октета обычного назначенного vCenter MAC-адреса и назначает адрес из подсети для виртуальных хостов, верно?
К сожалению, все, что я получаю, это
Nov 15 12:42:44 dhcpserv dhcpd: DHCPDISCOVER from 00:50:56:aa:bb:cc via eth0: network XXX.YYY.22/23: no free leases
Итак, я знаю, что мой сервер dhcpd получает DHCPDISCOVER. Я знаю, что ищу правильные три октета. (Знаю ли я это?)
Я не могу понять, почему мой DHCP-сервер не обслуживает IP-адрес из второй подсети. Что мне не хватает?
1 ответ
Оказывается, мне нужно было сделать три вещи. Вот некоторые кадры из финала /etc/dhcpd.conf
файл:
class "virtual-hosts"
{
match if substring(binary-to-ascii(16,8,":",hardware),2,7) = "0:50:56";
log(info, "Hit for class virtual-hosts");
}
subnet XXX.YYY.22.0 netmask 255.255.254.0
{
}
subnet XXX.YYY.24.0 netmask 255.255.255.0
{
option routers XXX.YYY.24.254;
option domain-name-servers XXX.YYY.22.168, XXX.YYY.22.169;
option ntp-servers XXX.YYY.22.168,XXX.YYY.22.169;
default-lease-time 86400; # 1 day
max-lease-time 604800; # 7 days
use-host-decl-names on;
allow unknown-clients;
option domain-name "example.com sub1.example.com sub2.example.com";
next-server XXX.YYY.22.159;
filename "pxelinux.0";
pool
{
allow members of "virtual-hosts";
get-lease-hostnames true;
one-lease-per-client true;
ping-check true;
range XXX.YYY.24.11 XXX.YYY.24.60;
}
}
Во-первых, посмотрите на это уродливое совпадение строк в class
заявление. Двоичное значение hardware
Первый элемент - это тип оборудования, а второй - адрес. я должен бежать hardware
через binary-to-ascii
превратить его в строку для поиска, а затем сопоставить подстроку. substring
матч начинается в 2, чтобы избежать 1:
тот binary-to-string
пишет для типа оборудования. И, substring
совпадение всего 7 символов, потому что binary-to-string
использует только одну цифру для двоичных значений меньше 16.
Во-вторых, я должен объявить allow unknown-clients;
где-то до того, как dhcpd попытается сопоставить неуказанный аппаратный адрес. В противном случае я должен явно определить полный MAC-адрес в host{}
заявление. Но я не хочу allow unknown-clients;
в самом бассейне, потому что это ограничено...
В-третьих, декларация allow members of "virtual-hosts";
в заявлении пула.
Итак, решение сводится к точному разбору binary-to-text
и позволяя неизвестным клиентам в subnet
заявление, просто чтобы ограничить их в pool
суб-заявление.