我正在尝试使用dnsmasq
.这是我的 dnsmasq.conf
# DHCP
dhcp-authoritative
bind-interfaces
dhcp-range=192.168.122.2,192.168.122.99,12h
dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases
dhcp-host=0a:0a:0a:0a:0a:01,192.168.122.100 # node.local
# DNS
no-hosts # ignore etc hosts
address=/node.local/192.168.122.100
ptr-record=100.122.168.192.in-addr.arpa.,"node.local"
当我查看正在侦听的端口时:sudo ss -tulpn | grep LISTEN
我只看到正在侦听的 :53 DNS 端口。端口 67 未被监听,因此 DHCP 服务似乎没有运行。
DHCP 是否正在运行?如果是这样,如果我只监听端口 53 而不是默认的 DHCP 端口,客户端是否能够获取 IP 地址?
答案1
IPv4 DHCP 服务器需要能够发送和接收寻址到目标 255.255.255.255 的广播数据包,这需要(据我所知)使用原始套接字。
请参阅ss -A raw -lpn
查找 DHCP 服务器的原始套接字。由于它在原始 IP 协议级别工作,因此套接字不会特定于端口 67:DHCP 服务器必须在传出数据包上自行构建 UDP 标头,包括输入端口号。
对于传入数据包,如果它以正常方式侦听 UDP 端口 67,内核会丢弃 DHCP 服务器想要接收的一些数据包,并将其视为“配置错误”——正是因为 DHCP 客户端可能还没有有效的网络配置!或者客户端可能不知道自己在关机时已插入不同的网络,并且可能开始尝试使用对于新网络不正确的网络参数来验证其旧的 DHCP 租约 - 理想情况下 DHCP 服务器需要能够听到并向此类客户端发送 DHCP NAK,告诉其忘记旧地址并重新启动 DHCP 进程。
因此,DHCP 服务器需要使用原始套接字侦听传入的 UDP 数据包,并接受普通网络驱动程序堆栈会拒绝的一些传入数据包。因此,ss -tulpn | grep LISTEN
不会显示这样的套接字。实际上,内核并不真正知道什么DHCP 服务器正在侦听,因为使用原始套接字相当于告诉内核“给我任何传入 IP 数据包的副本,我将自己搜索我感兴趣的特定内容。”