Мой 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 ответ1

0

Оказывается, мне нужно было сделать три вещи. Вот некоторые фрагменты из окончательного файла /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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .