dhcpd 不处理广播 DHCPDISCOVER

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子语句中。

相关内容