我计划在我们的产品上添加一个新功能来支持 LAN。由于安装将由相对非技术人员完成(用于船舶),我认为自动检测我们是否需要提供 DHCP 服务器会很有用,这取决于网络上是否已有 DHCP 服务器。有没有官方方法可以检查网络上是否已有 DHCP 服务器(或多个)?
我们在产品上使用嵌入式 Linux。
答案1
fedora 似乎在 repos“dhcp_probe”中有以下软件包
描述:dhcp_probe 尝试在直接连接的以太网网络上发现 DHCP 和 BootP 服务器。网络管理员可以使用此工具来查找未经授权的 DHCP 和 BootP 服务器。
看起来man dhcp_probe
对于 DHCP 发现策略有一些很好的指示,可能值得一看,即使你决定自己制作数据包。
数据包类型
没有一个请求数据包能够激起所有可能的 BootP 和 DHCP 服务器的响应。有些服务器可能只响应 BootP 或 DHCP,但不会同时响应两者。有些服务器可能配置为只响应一小部分已知客户端。有些 DHCP 服务器只向一小部分已知客户端提供租约,但可能愿意(负面地)响应请求在错误的 IP 地址上续订租约的未知客户端。因此,dhcp_probe 实际上发送的不是一个,而是五个不同类型的请求数据包,希望激起更多未知服务器的响应。
$ rpm -qil dhcp_probe
Name : dhcp_probe
Version : 1.3.0
Release : 8.fc15
Architecture: x86_64
Install Date: Mon 30 Apr 2012 12:20:46 AM BST
Group : System Environment/Daemons
Size : 133600
License : GPLv2+ and MIT
Signature : RSA/SHA256, Thu 28 Jul 2011 11:45:40 AM BST, Key ID 067f00b6a82ba4b7
Source RPM : dhcp_probe-1.3.0-8.fc15.src.rpm
Build Date : Tue 08 Feb 2011 01:58:57 PM GMT
Build Host : x86-18.phx2.fedoraproject.org
Relocations : (not relocatable)
Packager : Fedora Project
Vendor : Fedora Project
URL : http://www.net.princeton.edu/software/dhcp_probe/
Summary : Tool for discover DHCP and BootP servers
Description :
dhcp_probe attempts to discover DHCP and BootP servers on a directly-attached
Ethernet network. A network administrator can use this tool to locate
unauthorized DHCP and BootP servers.
/etc/dhcp_probe.cf
/etc/rc.d/init.d/dhcp_probe
/usr/sbin/dhcp_probe
/usr/share/doc/dhcp_probe-1.3.0
/usr/share/doc/dhcp_probe-1.3.0/AUTHORS
/usr/share/doc/dhcp_probe-1.3.0/COPYING
/usr/share/doc/dhcp_probe-1.3.0/COPYING.GPL
/usr/share/doc/dhcp_probe-1.3.0/COPYING.LIB
/usr/share/doc/dhcp_probe-1.3.0/NEWS
/usr/share/doc/dhcp_probe-1.3.0/README
/usr/share/doc/dhcp_probe-1.3.0/TODO
/usr/share/man/man5/dhcp_probe.cf.5.gz
/usr/share/man/man8/dhcp_probe.8.gz
答案2
我们不要将“官方”一词与“普遍接受的方法”的概念混淆。
一种普遍接受的方法是发出 DHCPDiscover 数据包并寻求响应。
答案3
如果您安装了“dhcpcd”,您可以使用“-T”标志来获取“测试”模式,该模式仅回应设置,但实际上并不设置 IP 地址和网关。
dhcpcd -T
输出:
emily ~ # dhcpcd -T wlan0
dhcpcd[6205]: version 5.2.12 starting
dhcpcd[6205]: wlan0: broadcasting for a lease
dhcpcd[6205]: wlan0: offered 192.168.2.194 from 192.168.2.1
interface=wlan0
pid=6205
reason=TEST
skip_hooks=lookup-hostname
new_broadcast_address=192.168.2.255
new_dhcp_lease_time=86400
new_dhcp_message_type=2
new_dhcp_server_identifier=192.168.2.1
new_domain_name_servers='192.168.2.1 193.189.160.13 193.189.160.23'
new_ip_address=192.168.2.194
new_network_number=192.168.2.0
new_routers=192.168.2.1
new_subnet_cidr=24
new_subnet_mask=255.255.255.0
答案4
发送 DHCP 请求并等待是否收到 DHCP 提供。
更粗暴的方法 - 设置 NIC,使其通过 DHCP 接收 IP 地址,然后在一段时间后检查它是否收到 APIPA 地址。如果它收到 APIPA 地址,则不太可能存在连接到相关网络的现有 DHCP 服务器。