我可以配置 ISC DHCP 向每个客户端发出相同的固定地址吗?

我可以配置 ISC DHCP 向每个客户端发出相同的固定地址吗?

我有几个设备,它们通常位于单独的网络中(或者可能甚至没有连接到网络),并且它们使用 DHCP 获取 IP 地址。现在我想在每个设备上运行一些脚本,例如,更新它们的固件。

我想将它们一次连接到我的电脑并运行更新脚本,为此我需要设备的 IP 地址。一个有吸引力的解决方案是让我的脚本始终使用相同的 IP,并将我的 DHCP 服务器配置为只向它收到的每个 DHCPDISCOVER 请求提供相同的 IP 地址。

在伪 dhcpd.conf 中,我想说的是:

host device-to-update {
    hardware ethernet *;
    fixed-address 192.168.1.100;
}

我对类进行了一些尝试,但还没有找到使用固定地址的方法。手册页不祥地写道:

请注意,只有 dhcp-client-identifier 选项和硬件地址可用于匹配主机声明

...所以我怀疑这是不可能的。目前我的解决方法是管理一个具有较短租期的 1 个地址池,这种方法虽然有效,但也有其他缺点。

这是在带有 isc-dhcp-server 的 Ubuntu 14.4 上。

答案1

另一种方法是使用 dnsmasq,使用具有非常短的租用时间的小范围 IP 地址,然后再选择一个dhcp-script选项。

每次新设备连接时都会触发该脚本,并将分配给新设备的 IP 地址作为参数。

论点如下:

  • 操作(添加、旧、删除,在重新启动时映射到新的、现有的租约,发布 iirc)
  • MAC地址
  • 分配的 IP 地址

手册页条目:

–dhcp 脚本=

每当创建新的 DHCP 租约、销毁旧的 DHCP 租约或完成 TFTP 文件传输时,都会运行此选项指定的可执行文件。必须是绝对路径名,不进行 PATH 搜索。该过程的参数是“add”、“old”或“del”、主机的 MAC 地址(或 IPv6 的 DUID)、IP 地址和主机名(如果已知)。“add”表示已创建租约,“del”表示已销毁租约,“old”是 dnsmasq 启动时对现有租约的通知或对现有租约的 MAC 地址或主机名的更改(此外,如果设置了 --leasefile-ro,则为租约长度或到期时间和客户端 ID,如果设置了 --script-on-renewal,则为租约到期时间)。如果 MAC 地址来自以太网以外的网络类型,则会在前面添加网络类型,例如令牌环的“06-01:23:45:67:89:ab”。即使 dnsmasq 配置为将 UID 更改为非特权用户,该进程仍以 root 身份运行(假设 dnsmasq 最初以 root 身份运行)。

这可用于启动设备固件上传。

这种方法还意味着您应该能够同时操作多个设备,因为它们都可以由 DHCP 服务器分配不同的 IP 地址,但固件脚本知道在任何给定时间要连接哪个设备。

答案2

我使用以下规则解决了这个问题:

subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.100;
}

host device-to-update {
    host-identifier option dhcp-message-type 3;
    fixed-address 192.168.1.100;
}

尽管什么手册页表示,该host-identifier指令确实可以匹配有限数量的 DHCPv4 变量之一。我的规则规定在处理任何具有 DHCPv4 消息类型 3 的消息时使用固定地址,即 DHCPREQUEST,它涵盖所有新地址租约。

供参考,完整的DHCPv4 消息类型列表是:

 1 = DHCPDISCOVER
 2 = DHCPOFFER
 3 = DHCPREQUEST
 4 = DHCPDECLINE
 5 = DHCPACK
 6 = DHCPNAK
 7 = DHCPRELEASE
 8 = DHCPINFORM
 9 = DHCPFORCERENEW
10 = DHCPLEASEQUERY
11 = DHCPLEASEUNASIGNED
12 = DHCPLEASEUNKNOWN
13 = DHCPLEASEACTIVE

相关内容