本文目录
确认是不是这次 IPv6 DNS 劫持
本文处理的是一个条件明确的 OpenClash 故障:启用 IPv6、路由本机代理、本地 DNS 劫持和 Fake-IP 后,路由器上的 SmartDNS 等解析器访问公网 IPv6 DNS,却收到 198.18.x 地址;随后使用域名作为服务器地址的代理节点无法连接。
普通终端打不开网页、LAN 设备拿不到 IPv6、订阅下载失败或 DNS 端口被 AdGuard Home 占用,并不能直接证明是同一问题。先确认故障发生在路由器本机发往公网 IPv6 DNS 的查询,不要一看到 IPv6 就关闭全网功能。
只有同时满足这些条件才继续
- OpenClash 版本低于已收录修复的 v0.47.156,或升级后尚未重启服务
- 系统使用 fw4/nftables 或 legacy ip6tables,并开启路由本机代理
- 本地 DNS 劫持和 Fake-IP 已启用,路由器本机还有 SmartDNS 等解析器
- 该解析器配置了公网 IPv6 DNS 上游,节点服务器地址使用域名
动设置前保存可回退版本
先在 OpenClash 里备份插件设置和当前配置,再保存当前可安装的 IPK 或 APK。记录插件版本、内核版本、运行模式、IPv6、路由本机代理、本地 DNS 劫持和 SmartDNS 上游;这样即使升级或调整后网络更差,也能回到原状态。
测试期间不要同时改订阅、规则、DNS 上游和运行模式。一次只动一项,并保留修改前后的查询结果;否则节点恢复后也无法判断是哪一步起作用。
准备回退材料
导出插件设置
在配置文件管理中备份设置和当前配置,下载到路由器之外的设备保存。
保留原安装包
保存当前版本对应的官方 IPK 或 APK,并记下系统使用 opkg 还是 apk。
记录触发开关
抄下 IPv6、路由本机代理、本地 DNS 劫持、Fake-IP 与 SmartDNS IPv6 上游状态。
准备直连入口
确认能通过 LAN 管理路由器;远程维护时不要在没有备用连接的情况下修改 DNS 和防火墙。
用指定服务器查询和规则计数定位
在路由器终端直接指定一个当前可达的公网 IPv6 DNS 查询真实域名。正常结果应是域名的公开 A 或 AAAA 记录;如果返回 198.18.0.0/16,并且执行前后对应的 IPv6 OUTPUT DNS Hijack 规则计数增加,查询就被错误送回了本地 Clash DNS。
OpenClash issue #5251 的复现使用 2400:3200::1。这个地址是否适合你的网络仍要先确认;若 IPv6 路由本身不可达,超时只能说明上游不可用,不能证明发生了劫持。查询域名也可换成你明确知道有公开记录的普通域名。
nslookup www.nic.ad.jp 2400:3200::1按结果决定下一步
| 查询结果 | 规则计数 | 结论 |
|---|---|---|
| 返回 198.18.x | IPv6 OUTPUT 计数增加 | 符合已确认的路由本机 IPv6 DNS 劫持 |
| 返回真实 A 或 AAAA | 计数不增加 | 该路径正常,转查订阅中的节点解析 DNS |
| 查询超时 | 计数不增加 | 先检查 IPv6 路由和所选 DNS 是否可达 |
| LAN 设备异常但路由器查询正常 | 无对应变化 | 转查 RA、DHCPv6、RDNSS 或浏览器安全 DNS |
只有 SmartDNS 查询异常,Mihomo 上游正常
核对进程身份与路径;Mihomo 通常以被排除的 GID 运行,而其他本机解析器可能命中 OUTPUT 规则。
所有 DNS 都返回 connection refused
检查本地监听端口和上游配置,不要套用本文的 IPv6 规则修复。
指定 IPv4 DNS 正常,指定 IPv6 DNS 返回 198.18.x
保留这组对照和计数变化,进入版本升级。
- SmartDNS 等本机解析器向公网 IPv6 地址发送 53 端口查询
- OpenClash OUTPUT 规则旧版用 ::/0 误匹配所有 IPv6 DNS 目的地址
- 本地 Clash DNS被重定向的查询在 Fake-IP 模式下返回 198.18.x
- 代理节点域名错误结果使使用域名的节点无法完成拨号
修复把路由本机的 IPv6 DNS 劫持范围从所有地址收窄到回环地址 ::1;LAN 设备的 DNS 接管规则没有被这次修改移除。
为什么公网 IPv6 DNS 会被当成本地查询
旧规则原本只应接管路由器本机发往回环地址的 DNS,却把 IPv6 目的范围写成 ::/0。这个范围包含全部 IPv6 地址,所以 SmartDNS 访问公网 IPv6 DNS 的 TCP 或 UDP 53 端口时,也会被重定向到本地 DNS。
问题不是 PR #5209 新增了 ::/0。该提交分开识别 IPv4 与 IPv6 规则后,让原本被提前跳过的旧分支稳定执行,才使缺陷从 v0.47.117 起更容易暴露。PR #5252 把 nftables 两处和 legacy ip6tables 四处都改为 ::1,并保留 LAN 侧 DNS 接管。
升级到包含修复的 v0.47.156
OpenClash v0.47.156 是当前能由官方发布记录确认包含 #5252 的稳定版。先使用官方 Release 的系统对应安装包,按 opkg 或 apk 的实际包管理器升级;不要把开发分支文件、IPK 和 APK 混用,也不要在升级时顺手更换内核和配置。
安装完成后必须重启 OpenClash。旧的 ::/0 规则可能仍留在运行态,只有重新生成防火墙规则后,源码中的 ::1 才会真正生效。启动失败时立即恢复已保存的原安装包和配置,不要继续叠加修改。
一次可回退的升级
核对系统包格式
opkg 系统选择官方 IPK,apk 系统选择官方 APK,并确认下载来源是 v0.47.156 Release。
暂停额外改动
保留原内核、订阅、运行模式和 DNS 设置,只升级 OpenClash 插件。
安装并重启服务
完成安装后重启 OpenClash,等待防火墙与 DNS 规则重新生成。
先查日志再联网
确认配置测试、内核启动和 DNS 监听成功;失败时恢复原包与备份。
重启后做三组验证
用升级前同一台路由器、同一个域名和同一个公网 IPv6 DNS 再查一次。修复生效后应返回真实 A 或 AAAA,公网查询不再增加 IPv6 OUTPUT DNS Hijack 计数;向本机回环 ::1 发出的查询仍可被 OpenClash 接管。
DNS 对照通过后再测试原来使用域名的节点,观察解析、拨号和真实网页请求。只看延迟数字不够;至少确认一个节点连接记录和一个实际页面都恢复。
修复验收清单
- OpenClash 显示 v0.47.156,服务已在安装后重新启动
- 指定公网 IPv6 DNS 返回真实 A 或 AAAA,不再返回 198.18.x
- 公网 IPv6 DNS 查询不再增加路由本机 IPv6 劫持规则计数
- 查询 ::1 时本地 DNS 接管仍正常,LAN 设备解析没有被破坏
- 原节点完成域名解析、拨号和一次真实访问
暂时不能升级时怎么规避和回退
暂时无法升级时,可先从 SmartDNS 移除公网 IPv6 DNS 上游,改用已经验证可达的 IPv4 上游;也可以临时关闭路由本机代理或本地 DNS 劫持中的一个触发项。每种方式都会改变路由器自身流量或 DNS 接管,必须逐项测试,不能当成长期修复。
如果升级后异常扩大,关闭系统代理和 TUN 依赖,恢复原插件包与设置备份,重启 OpenClash,再用升级前的 IPv4/IPv6 查询对照确认回到原状态。
公网 IPv6 DNS 已返回真实结果但节点仍失败时,转查 proxy-server-nameserver、订阅内容、TLS 和节点服务器,不再继续改 OUTPUT 规则。
临时方案的影响
| 操作 | 适合情况 | 必须复查 |
|---|---|---|
| SmartDNS 改用可达的 IPv4 上游 | 无法立即升级但需要恢复节点解析 | 本地域名、缓存和节点域名都能正常解析 |
| 暂时关闭路由本机代理 | 只有路由器自身 DNS 受影响 | 路由器更新、订阅与插件下载的出站路径 |
| 暂时关闭本地 DNS 劫持 | 可接受终端按 DHCP 下发 DNS | LAN 设备是否绕过预期分流和 DNS 策略 |
| 恢复原包与配置 | 升级后服务无法启动或 LAN 断网 | 版本、DNS 监听、防火墙规则和真实访问 |
