在我的小网络上,我有一个简单的设备,它显然仅使用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 地址?
答案1
我找到了这个问题的答案,我想发布它。事实证明,这与模式的匹配方式无关。实际上,
class "user" {
match if substring(hardware, 1, 3) = 00:01:02;
log(info, "matched to a 3com";
}
这是在硬件上匹配的正确语法。
然而,事实却让我得出了错误的结论。在审查了有关 bootp 和 dhcp 的多个 RFC 后,很明显,有问题的设备缺乏强制性 DHCP 类型选项,从RFC 1541第 3 部分,使其成为仅 bootp 客户端。因此,修复来自于我没想到会需要的东西。该range
语句包含修饰符dynamic-bootp
,表明 IP 范围适用于 dhcp 或 bootp 客户端。但是,我还需要allow dynamic bootp clients;
在池中如下:
pool {
allow dynamic bootp clients;
allow members of "controller";
# never more than 1 on the network at a time
range dynamic-bootp 192.168.1.240;
log(info, "Allocated to a pwr user");
}
我本以为这个修饰符就足够了,但事实并非如此。我需要两者来完成任务。
我希望这对某人有帮助。
答案2
在比较之前,您需要将数据转换为“硬件”,并考虑其指示类型的第一个元素。尝试类似的方法:
class "controller" {
# binary-to-ascii deletes leading zeroes and makes everything lowercase!
match if binary-to-ascii(16,8,":",substring(hardware, 0, 4)) = "1:0:a0:45";
log(info, "found a controller");
}
但如果只有一台设备,为什么不直接使用固定地址:
host controller-hostname {
hardware ethernet 00:a0:45:95:ce:14;
fixed-address 192.168.1.240;
}
将“dynamic-bootp”添加到池中:
pool {
allow members of "controller";
# never more than 1 on the network at a time
range dynamic-bootp 192.168.1.240;
log(info, "Allocated to a pwr user");
}