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),搜索ipv6、route、wg0相关关键词,看有没有内核自动删除路由的日志信息,能帮你定位具体原因。
备注:内容来源于stack exchange,提问作者R.. GitHub STOP HELPING ICE




