我正在尝试用dnsmasq托管DNS和DHCP服务。这是我的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地址吗?
发布于 2022-09-25 09:03:12
IPv4 DHCP服务器需要能够发送和接收发送到目的地255.255.255.255的广播数据包,这需要(据我所知)使用原始套接字。
请参阅ss -A raw -lpn查找DHCP服务器的原始套接字。因为它在原始IP协议级别工作,所以套接字将不特定于端口67: DHCP服务器必须在输出数据包上自己构建UDP报头,包括输入端口号。
对于传入的数据包,如果它以正常的方式侦听UDP端口67,内核将丢弃一些DHCP服务器希望作为“错误配置”接收的数据包--正是因为DHCP客户端可能还没有有效的网络配置!或者,客户端可能不知道它在关机时已插入另一个网络,并可能开始使用对新网络不正确的网络参数来验证其旧的DHCP租约--理想情况下,DHCP服务器需要能够听到这一点,并向这样的客户端发送一个DHCP,告诉它忘记旧地址并重新启动DHCP进程。
因此,DHCP服务器需要使用原始套接字侦听传入的UDP数据包,还需要接收正常网络驱动程序堆栈将拒绝的一些传入数据包。因此,ss -tulpn | grep LISTEN不会显示这样的套接字。实际上,内核并不知道DHCP服务器在监听什么,因为使用原始套接字相当于告诉内核“给我任何传入IP数据包的副本,我将搜索自己感兴趣的特定内容”。
https://unix.stackexchange.com/questions/718562
复制相似问题