Linux 未发送 arp 请求

Linux 未发送 arp 请求

我们有一个通过 Linux 网关连接到互联网的本地网络。局域网内大约有 50 个工作站。我们最近开始发现一个问题,即网关偶尔会停止响应几秒钟。经过调查,我们注意到,有时当网关无法 ping 某个工作站时,它甚至不会尝试向该工作站发送 ARP 请求。

举例来说,我们从网关 ping 192.168.5.37:

PING 192.168.5.37 (192.168.5.37) 56(84) bytes of data.
From 192.168.5.1 icmp_seq=1 Destination Host Unreachable
From 192.168.5.1 icmp_seq=2 Destination Host Unreachable
From 192.168.5.1 icmp_seq=3 Destination Host Unreachable
From 192.168.5.1 icmp_seq=5 Destination Host Unreachable
From 192.168.5.1 icmp_seq=6 Destination Host Unreachable
From 192.168.5.1 icmp_seq=7 Destination Host Unreachable
64 bytes from 192.168.5.37: icmp_seq=8 ttl=128 time=438 ms
64 bytes from 192.168.5.37: icmp_seq=9 ttl=128 time=0.240 ms
64 bytes from 192.168.5.37: icmp_seq=10 ttl=128 time=0.238 ms

与此同时,tcpdump 在另一个控制台上运行:

sudo tcpdump -nli eth0 host 192.168.5.37
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
14:12:26.944842 IP 192.168.5.37.6112 > 255.255.255.255.6112: UDP, length 16
14:12:31.951145 IP 192.168.5.37.6112 > 255.255.255.255.6112: UDP, length 16
14:12:36.958632 IP 192.168.5.37.6112 > 255.255.255.255.6112: UDP, length 16
14:12:39.914620 arp who-has 192.168.5.37 tell 192.168.5.1
14:12:39.914775 arp reply 192.168.5.37 is-at 00:0b:6a:86:53:14
14:12:39.914781 IP 192.168.5.1 > 192.168.5.37: ICMP echo request, id 50734, seq 8, length 64
14:12:39.914955 IP 192.168.5.37 > 192.168.5.1: ICMP echo reply, id 50734, seq 8, length 64
14:12:40.480035 IP 192.168.5.1 > 192.168.5.37: ICMP echo request, id 50734, seq 9, length 64
14:12:40.480264 IP 192.168.5.37 > 192.168.5.1: ICMP echo reply, id 50734, seq 9, length 64
14:12:41.480037 IP 192.168.5.1 > 192.168.5.37: ICMP echo request, id 50734, seq 10, length 64
14:12:41.480265 IP 192.168.5.37 > 192.168.5.1: ICMP echo reply, id 50734, seq 10, length 64

我怀疑内核 ARP 缓存出了问题。默认情况下,gc_thresh1 为 512,而局域网中的主机数量要少 10 倍(ip nei|wc -l大约 50 个)。

问题是什么?我们该如何解决?

答案1

检查网络中网关的重复 IP,这是您遇到的最常见问题。

答案2

似乎我已经找到问题的根源。路由器通过 eth0 连接到 LAN。此外,在同一接口上,它有多个 VLAN 子接口(其中一个用于访问互联网)。在 eth0 上,配置了一个整形器来限制 LAN 用户的流量速率。似乎 Linux 流量整形代码可以看到 eth0 上的所有流量(包括子接口),并且以某种方式干扰了 eth0 上的 arp 请求。

将 LAN 连接移至子接口并以不整形 arp 数据包的方式对其进行配置后,问题消失了。

相关内容