Linux DHCP 服务器对免费 ARP 的奇怪回答导致 DHCP 失败

Linux DHCP 服务器对免费 ARP 的奇怪回答导致 DHCP 失败

这是我最近在一台配置相当繁重的 Linux 服务器上遇到的一个问题。这台机器运行 Samba 作为 Active Directory 域控制器、邮件服务器、Web 服务器、两台虚拟机(使用 KVM/QEMU,并通过用 brctl 设置的虚拟桥将其中一个虚拟化以太网接口连接到机器的一个真实以太网接口)和其他一些服务。在私有 VLAN 上,它还运行一个 DHCP 服务器。这台服务器一直运行良好,但最近它开始无法让 Apple 设备接入。但一个简单的 WiFi 接入点(配置为通过 DHCP 动态接收其 IP)也无法接收 IP。

设备尝试获取 IP 地址的无限循环如下(通过 捕获tcpdump -e)。这2c:30:33:2b:68:d0是远程框的 MAC 地址,74:d0:2b:99:52:bc是 Linux 服务器。在每个数据包之后,我都写下了我对这个数据包的解释:

15:48:33.350358 2c:30:33:2b:68:d0 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 345: 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 2c:30:33:2b:68:d0, length 303
(DHCPDISCOVER from 2c:30:33:2b:68:d0)

15:48:34.351523 74:d0:2b:99:52:bc > 2c:30:33:2b:68:d0, ethertype IPv4 (0x0800), length 345: 172.17.9.1.67 > 172.17.9.7.68: BOOTP/DHCP, Reply, length 303
(DHCPOFFER on 172.17.9.7 to 2c:30:33:2b:68:d0 via eth0.9)

15:48:34.366366 2c:30:33:2b:68:d0 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 357: 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 2c:30:33:2b:68:d0, length 315
(DHCPREQUEST for 172.17.9.7 (172.17.9.1) from 2c:30:33:2b:68:d0 via eth0.9)

15:48:34.492289 74:d0:2b:99:52:bc > 2c:30:33:2b:68:d0, ethertype IPv4 (0x0800), length 345: 172.17.9.1.67 > 172.17.9.7.68: BOOTP/DHCP, Reply, length 303
(DHCPACK on 172.17.9.7 to 2c:30:33:2b:68:d0 via eth0.9)

15:48:34.492707 2c:30:33:2b:68:d0 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 172.17.9.7 tell 172.17.9.7, length 46
(gratuitous ARP of the newly registered box)

15:48:34.492761 74:d0:2b:99:52:bc > 2c:30:33:2b:68:d0, ethertype ARP (0x0806), length 42: Reply 172.17.9.7 is-at 74:d0:2b:99:52:bc, length 28
(this is the packet, that I don't understand)

15:48:34.526375 2c:30:33:2b:68:d0 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 346: 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, unknown (0x00), length 304
(DHCPDECLINE of 172.17.9.7 from 2c:30:33:2b:68:d0 via eth0.9, the box abandones the IP address 172.17.9.7, because it seems in use)

DHCP 客户端不发送上述免费 ARP,可以正常注册。因此,我假设问题出在 Linux 服务器对免费 ARP 的响应上,即它回答说该地址属于 Linux 机器。

我已经确认 DHCP 服务器应该提供的 IP 地址未注册到 Linux 服务器上。所以老实说,我不知道为什么要发送该数据包。

所有尝试使用 /proc/sys/net/ipv4/conf/eth0.9/arp_accept、/proc/sys/net/ipv4/conf/eth0.9/arp_announce 等的尝试都失败了。甚至尝试过滤掉坏的 ARP 数据包也arptables没有成功。而且在接口上完全关闭 ARP 也没有达到预期的效果。

知道为什么会创建这个奇怪的数据包吗?我可以在哪里进一步查看?

相关内容