我有一个dnsmasq
在网络命名空间 X 上运行的实例,并且我从网络命名空间 Y 中运行dhclient
(或任何其他 dhcp 客户端)以获取给定接口上的 IP 地址。这两个网络命名空间位于同一个openvswitch
网桥上,它们通过该网桥进行通信。
我发现dnsmasq
回复需要很长时间,大约需要 10 到 30 秒,即使tcpdump
显示所有 DHCP 数据包都被及时传送到目标命名空间。
为什么要花这么长时间?有没有办法减少这种延迟?
以下是 /var/log/syslog 中的一个示例,其中 11 秒后分配了 IP 地址:
Apr 4 14:31:27 localhost dhclient: Listening on LPF/_0.ping/ae:ca:22:bc:3c:7b
Apr 4 14:31:27 localhost dhclient: Sending on LPF/_0.ping/ae:ca:22:bc:3c:7b
Apr 4 14:31:27 localhost dhclient: Sending on Socket/fallback
Apr 4 14:31:27 localhost dhclient: DHCPREQUEST on _0.ping to 255.255.255.255 port 67
Apr 4 14:31:33 localhost dhclient: DHCPREQUEST on _0.ping to 255.255.255.255 port 67
Apr 4 14:31:48 localhost dhclient: DHCPDISCOVER on _0.ping to 255.255.255.255 port 67 interval 3
Apr 4 14:31:48 localhost dnsmasq-dhcp[11719]: DHCPDISCOVER(_0.dhcp) 192.168.31.110 ae:ca:22:bc:3c:7b
Apr 4 14:31:48 localhost dnsmasq-dhcp[11719]: DHCPOFFER(_0.dhcp) 192.168.31.110 ae:ca:22:bc:3c:7b
Apr 4 14:31:48 localhost dhclient: DHCPREQUEST on _0.ping to 255.255.255.255 port 67
Apr 4 14:31:48 localhost dhclient: DHCPOFFER from 192.168.31.1
Apr 4 14:31:48 localhost dnsmasq-dhcp[11719]: DHCPREQUEST(_0.dhcp) 192.168.31.110 ae:ca:22:bc:3c:7b
Apr 4 14:31:48 localhost dnsmasq-dhcp[11719]: DHCPACK(_0.dhcp) 192.168.31.110 ae:ca:22:bc:3c:7b mymachine
Apr 4 14:31:48 localhost dnsmasq-dhcp[11719]: not giving name mymachine to the DHCP lease of 192.168.31.110 because the name exists in /etc/hosts with address 127.0.0.1
Apr 4 14:31:48 localhost dhclient: DHCPACK from 192.168.31.1
Apr 4 14:31:48 localhost dhclient: ntp-servers: expecting at least 4 bytes; got 0
Apr 4 14:31:48 localhost dhclient: bound to 192.168.31.110 -- renewal in 33935 seconds.
dnsmasq
使用以下命令启动实例:
dnsmasq --dhcp-range=set:tag0,192.168.31.100,192.168.31.150,24h -l /tmp/dnsmasq-leasefile.dhcp.dhcp --dhcp-option=tag:tag0,option:router,192.168.31.2 --dhcp-option=tag:tag0,option:dns-server,9.9.9.9 --dhcp-option=tag:tag0,42
编辑
好的,我又运行了几次,我觉得我发现了其中的规律。DHCP 客户端首先发送两个 DHCP 请求,但都没有得到答复。一旦发送 DHCP 发现,dnsmasq
就会回复。首先尝试 DHCP 请求的原因dhclient
是它看到了同一接口的先前租约,并尝试请求出现在那里的 IP 地址。一旦我删除此类文件,就会立即生成/var/lib/dhcp/dhclient.leases
响应。我看到两个选项:dnsmasq
- 我告诉
dhclient
不要使用它的租赁文件(不确定如何使用),但这并不是很理想...... - 我指示
dnsmasq
响应未遵循发现消息的请求。我该怎么做?
答案1
答案是使用--dhcp-authoritative
dnsmasq 中的选项。问题是我每次都要重新启动 dnsmasq 服务器,因此它没有租约文件,但 dhclient 有自己的租约文件。由于无法在其自己的租约文件中验证请求的 IP 地址,dnsmasq 会等待,直到发出 dhcp discover 消息。