折腾一上午才发现:原来是 mwan3 把我的 IPv6 悄悄丢进了黑洞——一次 OpenWrt IPv6 假连通排障实录

博客日志

折腾一上午才发现:原来是 mwan3 把我的 IPv6 悄悄丢进了黑洞——一次 OpenWrt IPv6 假连通排障实录

栏目:博客日志

摘要

WAN6、DHCPv6、Prefix Delegation 全部正常,OpenWrt 却始终无法访问公网 IPv6。本文记录一次真实的 OpenWrt IPv6 假连通故障排查过程,并解释为何 mwan3 残留策略路由会让 IPv6 流量掉进 blackhole。

折腾一上午才发现:原来是 mwan3 把我的 IPv6 悄悄丢进了黑洞

很多人判断 IPv6 是否正常,往往只看 WAN6 有没有拿到公网地址、Prefix Delegation(PD)是否成功下发,或者 AAAA 记录能否正常解析。但一次真实的排障经历说明:这些指标全部正常,并不代表 IPv6 真正可用。

这次故障发生在一台运行 eSir OpenWrt 的家庭网关上。运营商为中国电信,光猫桥接,OpenWrt 负责 PPPoE 拨号,下游连接华硕 AP 和多台终端设备。表面上看,整个 IPv6 配置没有任何异常,但公网 IPv6 访问始终失败。最终发现,真正的问题并不在运营商,也不在 DHCPv6,而是一个早已被遗忘的 mwan3 组件。

故障现象:所有指标正常,唯独无法访问 IPv6

最初发现问题的方式非常简单:

bash
ping6 ipv6.google.com

结果持续超时。

按常规思路检查后发现:

  • WAN6 已成功获取公网 IPv6 地址
  • DHCPv6 工作正常
  • Prefix Delegation 成功下发前缀
  • DNS 可以正常解析 AAAA 记录
  • traceroute6 已经能够进入运营商骨干网络

如果只看这些指标,大多数人都会认为 IPv6 已经完全恢复正常。

然而现实情况却是:IPv6 实际不可用。

为什么这类问题特别容易误判

很多用户对 IPv6 连通性的理解仍停留在“拿到地址就算成功”的阶段。

实际上,一个完整的 IPv6 通信过程至少涉及多个环节:

  1. 获取公网 IPv6 地址
  2. 获取 Prefix Delegation 前缀
  3. LAN 正确广播 IPv6 信息
  4. DNS 返回 AAAA 记录
  5. 路由表存在正确出口
  6. 策略路由不拦截流量
  7. 防火墙允许相关数据包通过

只要其中任意一个环节出现问题,都可能导致最终访问失败。

而本次故障最大的迷惑性在于:前面几个环节全部正常。

排查思路:从运营商一路怀疑到自己

在发现 ping6 完全不通后,首先怀疑的是运营商侧问题。

随后检查光猫桥接配置、PPPoE 拨号状态、IPv6 前缀获取情况,均未发现异常。

继续检查 OpenWrt 网络配置、DHCPv6 参数以及 DNS 设置,同样没有发现明显错误。

由于 traceroute6 已经能够看到运营商骨干网节点,因此网络似乎又不像完全中断。

这种“看起来正常、实际上不通”的状态,让排查过程变得异常困难。

真正的问题:mwan3 遗留策略路由

转折点来自对系统路由策略的进一步检查。

执行:

bash
ip -6 rule

发现系统中存在与 fwmark、blackhole、unreachable 相关的 IPv6 策略路由规则。

继续检查:

bash
ip6tables-save

发现大量 mwan3 自动生成的规则链。

最终确认系统中仍安装着:

text
mwan3
luci-app-mwan3

虽然当前网络环境已经不存在多 WAN 或负载均衡需求,但这些遗留规则仍然参与 IPv6 流量决策。

mwan3 到底是什么

mwan3 是 OpenWrt 中常见的多线路管理组件(Multi WAN Manager)。

它主要用于:

  • 双 WAN 接入
  • 多运营商出口
  • 负载均衡
  • 故障自动切换
  • 基于策略的流量分流

其核心机制是利用防火墙标记(fwmark)与策略路由(Policy Routing)控制不同流量走向不同出口。

当配置完整且维护得当时,mwan3 十分强大。

但如果曾经启用过多 WAN、测试过负载均衡,随后又修改网络结构,却没有同步清理相关配置,就可能留下失效规则。

对于 IPv6 而言,这些规则有时会把数据包导向 blackhole(黑洞路由)或 unreachable(不可达路由),导致流量在本机就被直接丢弃。

为什么 traceroute6 正常而 ping6 失败

这是本次故障最容易让人困惑的地方。

策略路由问题并不一定会影响所有类型的数据包。

不同协议、不同目的地址、不同标记状态下,流量可能匹配不同规则。

因此可能出现:

  • DNS 正常
  • traceroute6 正常
  • 部分 IPv6 网站可访问
  • ping6 全部失败

这种状态通常被称为“假连通”。

从用户视角来看,网络似乎已经恢复;但从实际业务角度看,IPv6 仍然处于异常状态。

最终解决方案

确认问题来源后,处理方式非常直接:

停止服务:

bash
/etc/init.d/mwan3 stop

关闭开机启动:

bash
/etc/init.d/mwan3 disable

重启网络:

bash
service network restart

随后再次验证:

bash
ping6 ipv6.google.com
ping6 240e:42:c000::1
curl -6 ip.sb

IPv6 连通性恢复正常。

排查 OpenWrt IPv6 时值得优先检查什么

如果遇到类似情况,可以按照以下顺序检查:

  1. `ip -6 addr` 查看地址是否正常获取
  2. `ip -6 route` 查看默认路由是否存在
  3. `ip -6 rule` 查看是否存在异常策略路由
  4. 检查 mwan3 是否仍在运行
  5. 检查防火墙自定义规则
  6. 使用 `curl -6 ip.sb` 验证实际出口
  7. 使用多个目标地址交叉验证

相比单纯查看 WAN6 状态,这些检查更容易发现隐藏问题。

写在最后

这次故障最大的启示是:IPv6 是否正常,不能只看地址是否获取成功。

WAN6 有地址,不代表 IPv6 正常;PD 下发成功,不代表 IPv6 正常;DNS 能解析 AAAA 记录,也不代表 IPv6 真正可用。

真正的 IPv6 连通性依赖地址获取、路由表、防火墙、策略路由以及出口路径共同工作。

对于长期折腾 OpenWrt 的用户来说,最危险的往往不是当前配置,而是那些早已忘记、却仍然在后台发挥作用的历史配置。mwan3 本身并不是问题,但当网络结构已经发生变化时,残留的策略路由规则很可能成为排查过程中最容易被忽略的“隐形故障源”。

OpenWrt IPv6 假连通排障:mwan3 策略路由导致 IPv6 黑洞