![Linux 主机随机停止响应 ipv6 邻居请求](https://linux22.com/image/719405/Linux%20%E4%B8%BB%E6%9C%BA%E9%9A%8F%E6%9C%BA%E5%81%9C%E6%AD%A2%E5%93%8D%E5%BA%94%20ipv6%20%E9%82%BB%E5%B1%85%E8%AF%B7%E6%B1%82.png)
我已经束手无策了,所以如果能提供任何帮助我都会很感激。
我有一台 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_size
sysctl 参数提升到一个相对较大的值(例如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_thresh2
net.ipv6.neigh.default.gc_thresh3
https://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 的问题...