连接排障 · Clash 技术博客

OpenClash IPv6 节点域名解析失败怎么办?

OpenClash 开启 IPv6 后,若节点域名解析失败且公网 IPv6 DNS 返回 198.18.x,可核对 OUTPUT 规则计数、升级至 v0.47.156,并按清单验证与回退。

  • OpenClash
  • IPv6
  • DNS 劫持
  • SmartDNS
  • 节点解析
本文目录

确认是不是这次 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 上游和运行模式。一次只动一项,并保留修改前后的查询结果;否则节点恢复后也无法判断是哪一步起作用。

准备回退材料

  1. 导出插件设置

    在配置文件管理中备份设置和当前配置,下载到路由器之外的设备保存。

  2. 保留原安装包

    保存当前版本对应的官方 IPK 或 APK,并记下系统使用 opkg 还是 apk。

  3. 记录触发开关

    抄下 IPv6、路由本机代理、本地 DNS 劫持、Fake-IP 与 SmartDNS IPv6 上游状态。

  4. 准备直连入口

    确认能通过 LAN 管理路由器;远程维护时不要在没有备用连接的情况下修改 DNS 和防火墙。

用指定服务器查询和规则计数定位

在路由器终端直接指定一个当前可达的公网 IPv6 DNS 查询真实域名。正常结果应是域名的公开 A 或 AAAA 记录;如果返回 198.18.0.0/16,并且执行前后对应的 IPv6 OUTPUT DNS Hijack 规则计数增加,查询就被错误送回了本地 Clash DNS。

OpenClash issue #5251 的复现使用 2400:3200::1。这个地址是否适合你的网络仍要先确认;若 IPv6 路由本身不可达,超时只能说明上游不可用,不能证明发生了劫持。查询域名也可换成你明确知道有公开记录的普通域名。

在路由器上指定实际可达的公网 IPv6 DNS
nslookup www.nic.ad.jp 2400:3200::1

按结果决定下一步

查询结果规则计数结论
返回 198.18.xIPv6 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

保留这组对照和计数变化,进入版本升级。

路由器本机访问公网 IPv6 DNS 的错误路径
  1. SmartDNS 等本机解析器向公网 IPv6 地址发送 53 端口查询
  2. OpenClash OUTPUT 规则旧版用 ::/0 误匹配所有 IPv6 DNS 目的地址
  3. 本地 Clash DNS被重定向的查询在 Fake-IP 模式下返回 198.18.x
  4. 代理节点域名错误结果使使用域名的节点无法完成拨号

修复把路由本机的 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 才会真正生效。启动失败时立即恢复已保存的原安装包和配置,不要继续叠加修改。

一次可回退的升级

  1. 核对系统包格式

    opkg 系统选择官方 IPK,apk 系统选择官方 APK,并确认下载来源是 v0.47.156 Release。

  2. 暂停额外改动

    保留原内核、订阅、运行模式和 DNS 设置,只升级 OpenClash 插件。

  3. 安装并重启服务

    完成安装后重启 OpenClash,等待防火墙与 DNS 规则重新生成。

  4. 先查日志再联网

    确认配置测试、内核启动和 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 下发 DNSLAN 设备是否绕过预期分流和 DNS 策略
恢复原包与配置升级后服务无法启动或 LAN 断网版本、DNS 监听、防火墙规则和真实访问

参考资料