我有几个设备,它们通常位于单独的网络中(或者可能甚至没有连接到网络),并且它们使用 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