在我的小网络上,我有一个简单的设备,它显然只使用bootp
(而不是 bootp 的 dhcp 扩展)来获取其地址。我的 dhcpd.conf 文件看起来像这样
class "user" {
match if substring(hardware, 1, 3) = 00:01:02;
log(info, "matched to a 3com";
}
class "controller" {
# tried matching based on two different styles I've seen on the net
#match if substring(hardware, 1, 3) = 00:a0:45;
match if (binary-to-ascii(16, 8, ":", substring(hardware, 0, 4)) = "1:00:a0:45");
log(info, "found a controller");
}
subnet 192.168.0.0 netmask 255.255.0.0 {
pool {
allow members of "user";
range 192.168.0.20 192.168.0.99;
log(info, "A user just attached");
}
pool {
allow members of "controller";
# never more than 1 on the network at a time
range 192.168.1.240;
log(info, "Allocated to a pwr user");
}
}
dhcp 服务器根本不匹配它应该匹配的池。从日志
BOOTREQUEST from 00:a0:45:95:ce:14 via eth1: BOOTP from dynamic client and no dynamic leases
该设备在这两个类别中均被拒绝。使用 tcpdump 和 wireshark 比较来自笔记本电脑和控制器设备的数据包转储(我暂时为 HP 笔记本电脑创建了一个类,将该类添加到用于“控制器”的池中,并将范围扩大 2 个地址),这似乎是唯一的不同之处在于控制器设备实际上是一个 bootp 数据包(即它缺少标识 dhcp 类型的强制选项 53),并且仅携带选项 255。笔记本电脑是通过dhcpd
不使用binary-to-ascii
转换来匹配的。此外,奇怪的是,控制器客户端 IP 标头使用首先分配的 IP 地址 192.168.1.240,但在数据包的 bootp 部分中,该ciaddr
字段为 0。如果它认为它有一个有效的租约,它不应该反映这一点在ciaddr
?
为什么 dhcpd 无法匹配此设备的 MAC 地址?
我已经找到了这个问题的答案,我想发布它。事实证明,这与模式的匹配方式无关。实际上,
这是在硬件上匹配的正确语法。
然而,这是一个事实导致我得出错误结论的案例。在查看了几个关于 bootp 和 dhcp 的 RFC 之后,很明显,有问题的设备缺少RFC 1541第 3 节中的强制 DHCP 类型选项,使其成为仅 bootp 的客户端。因此,修复来自我没想到需要的东西。该
range
语句包括dynamic-bootp
说明 IP 范围用于 dhcp 或 bootp 客户端的修饰符。但是,我还需要allow dynamic bootp clients;
在池中如下:我原以为这个修饰符就足够了,但事实并非如此。我需要两者来完成任务。
我希望这对某人有所帮助。
您需要在比较之前转换“硬件”中的数据,并考虑其第一个指示类型的元素。尝试类似:
但如果只是一台设备,为什么不直接使用固定地址:
将“dynamic-bootp”添加到池中: