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