Linux 主机随机停止响应 ipv6 邻居请求

Linux 主机随机停止响应 ipv6 邻居请求

我已经束手无策了,所以如果能提供任何帮助我都会很感激。

我有一台 IPv6 主机 (Linux 4.15.1-gentoo SMP x86_64),它会随机停止发送邻居广告。运行 tcpdump 会显示大量邻居请求,但对这些请求几乎没有任何反应。偶尔,主机仍会发送 NA,但只有在忽略了几十个 NS 请求之后才会发送。显然,这会完全破坏 IPv6 连接。

我不知道这是否相关,但 IPv6 是在桥接接口上配置的(该桥接上也运行着几个 lxc 容器)。该桥接是典型的 brctl 桥接,STP 关闭。

IPv6 是静态配置的(主机和网关)。

手动用未经请求的邻居广告充斥网络(例如使用ndsend来自vzctl)可以稍微缓解问题,但这显然不是一个解决方案。

更奇怪的是,通过 procfs ( ) 禁用并重新启用接口上的 ipv6/proc/sys/net/ipv6/conf/br0/disable_ipv6并重新配置它 (ip -6 addr add等) 可以暂时“解决”问题。但一两天后又会出现这种情况。

为了完整起见,主机上运行着一个 nftables 防火墙,但它明确允许所有 icmpv6 流量(通过ip6 nexthdr ipv6-icmp accept任何地方)。当问题出现时禁用防火墙不会改变任何事情。

那么,问题是:我该怎么做才能查明潜在的问题?

更新:对我来说,这个问题在几次内核更新后就消失了,但有报告称在更高版本的内核中也存在类似的问题,特别是在路由表较大和/或邻居数量较多的情况下。据报道,这里的一个可能的罪魁祸首是内核中对 ipv6 路由/邻居缓存大小的限制较小。如果您遇到类似的问题,请尝试将net.ipv6.route.max_sizesysctl 参数提升到一个相对较大的值(例如1048576),例如通过运行sysctl -w net.ipv6.route.max_size=1048576和/或编辑/etc/sysctl.conf。您还可能希望提高net.ipv6.route.gc_thresh以避免过于频繁地运行垃圾收集器。此外,如果邻居缓存中有特别多的记录,请检查和 net.ipv6.neigh.default.gc_thresh1。 请参阅net.ipv6.neigh.default.gc_thresh2net.ipv6.neigh.default.gc_thresh3https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt所有这些选项的作用是什么。

答案1

我刚刚发现 Linux VLAN 感知桥中的 multicast_snooping 中有一个错误。它不会影响路由器广告,但即使启用了 multicast_flooding,它也会阻止邻居发现。发生的情况是,在系统启动时,它会执行 dad,并且 dad 将保留在多播转发数据库中。但这会在 200 或 300 秒后过期。此后,任何邻居发现多播数据包都将被丢弃到该端口。这只发生在邻居发现中,而不是路由器广告中。您可以通过执行以下操作来见证它:

bridge mdb show

如果它显示条目,则表示 multicast_snooping 已打开。您可能会/将会遇到该错误。就我而言,我设置的系统中约有 80% 开始仅阻止邻居发现多播。任何其他多播都会被淹没或被正确监听。

目前的解决方案是关闭multicast_snooping:

echo 0 > /sys/net/devicename/bridge/multicast_snooping

有时间我会做一个测试设置。这个 bug 已经困扰我两年了,直到紧急维护期间我才有时间完全掌握了这个问题。

答案2

我在使用 4.16.2-gentoo 内核时也遇到了同样的问题。但就我而言,这个问题与内核完全无关。

有问题的盒子充当 ipv6 VPN 网关,连接稳定。即使它后面的子网路由器也完全正常,只是路由子网本身不断丢失连接。

TL;DR;
防火墙是我的罪魁祸首。ipv6反渗透过滤器设置过滤了我的子网路由器的邻居请求。

通过启用登录功能发现了这一点/etc/firewalld/firewalld.conf

LogDenied=all

其结果如下(MAC 和 SRC 被缩短并混淆):

kernel: rpfilter_DROP: IN=enp6s0.100 OUT= MAC=XX:…:XX SRC=fe80:…:beaf DST=ff02:0000:0000:0000:0000:0001:ff00:0001 LEN=72 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0

我刚刚禁用了 ipv6 rpfilter,直到我能找出发生这种情况的原因。设置非常简单,对我来说一切都很好,但也许是接口是 vlan 的问题...

相关内容