dhcpd 与此 MAC 地址不匹配

dhcpd 与此 MAC 地址不匹配

在我的小网络上,我有一个简单的设备,它显然仅使用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");
}

相关内容