You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Linux下IPv6路由莫名消失的原因排查及禁用动态删除机制的方法咨询

Linux下IPv6路由莫名消失的原因排查及禁用动态删除机制的方法咨询

这种手动配置的静态路由莫名消失的情况确实挺闹心的,尤其是没做任何操作就发生的时候。结合你用WireGuard+IPv6的场景,我来梳理下可能的内核层面原因和对应的解决办法:

一、可能的触发原因及对应解决措施

1. 内核*邻居不可达检测(Neighbor Unreachability Detection, NUD)*自动清理路由

IPv6内核默认会对路由关联的邻居节点进行状态监控,如果判定邻居不可达,可能会自动调整甚至删除相关路由——哪怕是你手动添加的静态路由。

解决办法:
添加或修改路由时,明确指定nud permanent参数,强制内核将这条路由的邻居状态标记为永久有效,禁止自动修改:

# 添加路由时直接指定
ip -6 route add 2001:db8::/64 dev wg0 proto static nud permanent
# 如果已经添加过路由,用change命令修改
ip -6 route change 2001:db8::/64 dev wg0 nud permanent

2. WireGuard链路状态被判定为Down

如果WireGuard隧道长时间没有流量,内核可能会把接口标记为Down状态,进而清理关联的路由。虽然你说两端都是路由器,但如果偶尔出现长时间断流,也可能触发这个问题。

解决办法:
在WireGuard配置文件中添加PersistentKeepalive参数,让两端定期发送心跳包维持链路状态:

# 在WireGuard的Peer段添加
[Peer]
PublicKey = ...
Endpoint = ...
PersistentKeepalive = 25  # 每25秒发送一次心跳,可根据实际调整

配置完成后重启WireGuard服务生效。

3. 内核误将静态路由识别为动态路由

如果添加路由时没有明确指定proto static,内核可能会把它归类为其他类型(比如proto kernel),这类路由有被动态清理的风险。

解决办法:
添加路由时明确指定proto static,标记为纯静态路由:

ip -6 route add ::/0 dev wg0 proto static nud permanent

ip -6 route show命令查看路由条目,确认开头有proto static标识即可。

4. ICMPv6重定向导致路由被修改

内核默认会接受ICMPv6重定向报文,并根据报文内容自动调整路由表。如果网络中存在恶意或误发的重定向报文,可能会导致你的静态路由被覆盖或删除。

解决办法:
禁用ICMPv6重定向功能,通过sysctl参数持久化配置:

# 临时生效
sysctl -w net.ipv6.conf.all.accept_redirects=0
sysctl -w net.ipv6.conf.default.accept_redirects=0
sysctl -w net.ipv6.conf.wg0.accept_redirects=0

# 持久化,写入/etc/sysctl.d/99-ipv6-static-routes.conf文件
echo "net.ipv6.conf.all.accept_redirects = 0" >> /etc/sysctl.d/99-ipv6-static-routes.conf
echo "net.ipv6.conf.default.accept_redirects = 0" >> /etc/sysctl.d/99-ipv6-static-routes.conf
echo "net.ipv6.conf.wg0.accept_redirects = 0" >> /etc/sysctl.d/99-ipv6-static-routes.conf
# 加载配置
sysctl --system

二、额外排查建议

  • ip -6 route show table all查看所有路由表的条目,确认路由是真的被删除了,还是被移动到了其他路由表中。
  • 检查系统日志(比如dmesg/var/log/messages),搜索ipv6routewg0相关关键词,看有没有内核自动删除路由的日志信息,能帮你定位具体原因。

备注:内容来源于stack exchange,提问作者R.. GitHub STOP HELPING ICE

火山引擎 最新活动