Linux 主机上与桥接和 ipv6 相关的邻居表溢出

tim*_*tim 10 networking linux ipv6 arp

注意:我已经有了解决这个问题的方法(如下所述),所以这只是一个“想知道”的问题。

我有大约 50 台主机的高效设置,包括运行 xen 4 的刀片和提供 iSCSI 的 equallogics。所有的 xen dom0s 几乎都是纯 Debian 5。设置包括每个 dom0 上的几个网桥,以支持 xen 桥接网络。每个 dom0 上总共有 5 到 12 个网桥,每个网桥为一个 vlan 服务。所有主机都没有启用路由。

有一次,我们将其中一台机器移到了一个新的硬件上,包括一个 raid 控制器,因此我们安装了一个带有 xen 补丁的上游 3.0.22/x86_64 内核。所有其他机器运行 debian xen-dom0-kernel。

从那时起,我们在设置中的所有主机上每隔约 2 分钟就会发现以下错误:

[55888.881994] __ratelimit: 908 callbacks suppressed
[55888.882221] Neighbour table overflow.
[55888.882476] Neighbour table overflow.
[55888.882732] Neighbour table overflow.
[55888.883050] Neighbour table overflow.
[55888.883307] Neighbour table overflow.
[55888.883562] Neighbour table overflow.
[55888.883859] Neighbour table overflow.
[55888.884118] Neighbour table overflow.
[55888.884373] Neighbour table overflow.
[55888.884666] Neighbour table overflow.
Run Code Online (Sandbox Code Playgroud)

arp 表 (arp -n) 从未在每台机器上显示超过 20 个条目。我们尝试了明显的调整并提高了

/proc/sys/net/ipv4/neigh/default/gc_thresh*
Run Code Online (Sandbox Code Playgroud)

值。最终到 16384 个条目但没有效果。甚至大约 2 分钟的间隔都没有改变,这使我得出结论,这完全无关。tcpdump 显示任何接口上都没有不常见的 ipv4 流量。从 tcpdump 中唯一有趣的发现是 ipv6 数据包爆裂如下:

14:33:13.137668 IP6 fe80::216:3eff:fe1d:9d01 > ff02::1:ff1d:9d01: HBH ICMP6, multicast listener reportmax resp delay: 0 addr: ff02::1:ff1d:9d01, length 24
14:33:13.138061 IP6 fe80::216:3eff:fe1d:a8c1 > ff02::1:ff1d:a8c1: HBH ICMP6, multicast listener reportmax resp delay: 0 addr: ff02::1:ff1d:a8c1, length 24
14:33:13.138619 IP6 fe80::216:3eff:fe1d:bf81 > ff02::1:ff1d:bf81: HBH ICMP6, multicast listener reportmax resp delay: 0 addr: ff02::1:ff1d:bf81, length 24
14:33:13.138974 IP6 fe80::216:3eff:fe1d:eb41 > ff02::1:ff1d:eb41: HBH ICMP6, multicast listener reportmax resp delay: 0 addr: ff02::1:ff1d:eb41, length 24
Run Code Online (Sandbox Code Playgroud)

这让我想到这个问题可能与 ipv6 有关,因为我们在这个设置中没有 ipv6 服务。

唯一的另一个提示是主机升级与问题开始的巧合。我关闭了有问题的主机,错误消失了。然后我随后拆除了主机上的网桥,当我拆除(ifconfig down)一个特别的网桥时:

br-vlan2159 Link encap:Ethernet  HWaddr 00:26:b9:fb:16:2c  
          inet6 addr: fe80::226:b9ff:fefb:162c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:120 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:5286 (5.1 KiB)  TX bytes:726 (726.0 B)

eth0.2159 Link encap:Ethernet  HWaddr 00:26:b9:fb:16:2c  
          inet6 addr: fe80::226:b9ff:fefb:162c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1801 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:126228 (123.2 KiB)  TX bytes:1464 (1.4 KiB)

bridge name bridge id       STP enabled interfaces
...
br-vlan2158     8000.0026b9fb162c   no      eth0.2158
br-vlan2159     8000.0026b9fb162c   no      eth0.2159
Run Code Online (Sandbox Code Playgroud)

错误又消失了。正如你所看到的,网桥没有 ipv4 地址,它的唯一成员是eth0.2159,所以没有流量应该通过它。网桥和接口.2159 / .2157 / .2158除了它们所连接的 vlan 之外,在所有方面都相同,在拆除时没有任何影响。现在我通过 sysctl net.ipv6.conf.all.disable_ipv6在整个主机上禁用了 ipv6并重新启动。在此之后,即使启用了桥接br-vlan2159 也不会发生错误。

欢迎任何想法。

dba*_*tar 5

我相信您的问题是因为在net-next.

由于尝试重新散列表的错误,在桥初始化时禁用多播侦听。IGMP侦听从每一个转发HBH ICMPv6多址查询答复,这导致邻居表填满了停止桥ff02::从组播回复它应该邻居看(试ip -6 neigh show nud all)。

正确的解决方法是试图重新启用监听,如:echo 1 > /sys/class/net/eth0/bridge/multicast_snooping。另一种方法是使邻居表 gc 阈值大于广播域中的主机数。

补丁在这里


小智 3

ip route show cache table all当您遇到此错误时,返回了什么?

arp -n或者ip neigh show只会显示缓存中的某些条目。

ip route show cache table all将更加详细(并且将包括许多 v6 相关条目)。

我们尝试了明显的调整并提高了 /proc/sys/net/ipv4/neigh/default/gc_thresh*

你对 ipv6 也做了同样的事情吗?这为我们解决了问题

再见,

——克雷斯