Skip to content

[Bug] 自定义 DNS 覆写不会替换订阅中的 proxy-server-nameserver,导致保留不可用节点解析 DNS #5205

Description

@felinae98

Verify Steps

  • Tracker 我已经在 Issue Tracker 中找过我要提出的问题
  • Branch 我知道 OpenClash 的 Dev 分支切换开关位于插件设置-版本更新中,或者我会手动下载并安装 Dev 分支的 OpenClash
  • Latest 我已经使用最新 Dev 版本/当前 dev 分支源码确认过,问题依旧存在
  • Relevant 我知道 OpenClash 与 内核(Core)、控制面板(Dashboard)、在线订阅转换(Subconverter)等项目之间无直接关系,仅相互调用
  • Definite 这确实是 OpenClash 出现的问题
  • Contributors 我有能力协助 OpenClash 开发并解决此问题
  • Meaningless 我提交的是无意义的催促更新或修复请求

OpenClash Version

v0.47.110

Bug on Environment

iStoreOS / OpenWrt 22.03

OpenWrt Version

iStoreOS 22.03.7 2024120615

Bug on Platform

Linux-amd64(x86-64)

Describe the Bug

当订阅配置中自带 dns.proxy-server-nameserver,且该项包含不可用的本机 DNS(例如 udp://127.0.0.1:1053,但本机没有监听 1053)时,Mihomo 会持续使用该 DNS 解析代理节点域名,导致节点拨号失败并反复刷日志:

[DNS] resolve <node-domain> A from udp://127.0.0.1:1053
dial <proxy-group> ... error: <node-domain>:<port> connect error: dns resolve failed: all DNS requests failed, first error: read udp 127.0.0.1:<random>->127.0.0.1:1053: read: connection refused

进一步看 OpenClash 的自定义 DNS 覆写逻辑,nameserver / fallback / default-nameserver 在启用自定义 DNS 时是替换原配置,但 proxy-server-nameserver 是追加合并,因此订阅中原有的坏项不会被清掉:

# nameserver: replace
Value['dns']['nameserver'] = namedns_config['nameserver'].uniq

# proxy-server-nameserver: append
(Value['dns']['proxy-server-nameserver'] ||= []).concat(proxydns['proxy-server-nameserver']).uniq!

这会导致一个比较隐蔽的问题:用户在 LuCI 里配置了自定义 DNS / 节点域名解析服务器后,预期 OpenClash 接管 DNS 配置,但运行配置里仍然保留订阅自带的不可用 proxy-server-nameserver

我搜索过几个相关 issue,但看起来不是同一个问题:

本 issue 关注的是:普通 DNS 覆写中 proxy-server-nameservernameserver 的覆盖语义不一致,导致订阅中的错误节点解析 DNS 被保留。

To Reproduce

  1. 导入一个订阅配置,配置内包含:
dns:
  enable: true
  nameserver:
    - 119.29.29.29
    - 223.5.5.5
  proxy-server-nameserver:
    - udp://127.0.0.1:1053
  1. 路由器本机没有任何进程监听 UDP 1053。
  2. 在 LuCI 中进入 服务 -> OpenClash -> 覆写设置 -> DNS 设置,启用自定义上游 DNS,并配置可用的节点域名解析 DNS,例如 223.5.5.5 / 119.29.29.29
  3. 重启 OpenClash。
  4. 查看 服务 -> OpenClash -> 插件设置 -> 调试日志 -> 生成,或查看运行配置。

OpenClash Log

DNS劫持: Dnsmasq 转发
Dnsmasq转发设置: 127.0.0.1#7874

依赖检查:
dnsmasq-full: 已安装
ruby/ruby-yaml/ruby-psych: 已安装
kmod-tun: 已安装

端口占用:
udp :::7874 7537/clash
# no udp 1053 listener

运行配置:
dns:
  enable: true
  listen: 0.0.0.0:7874
  nameserver:
    - 119.29.29.29
    - 223.5.5.5
  proxy-server-nameserver:
    - udp://127.0.0.1:1053

最近运行日志:
[DNS] resolve <node-domain> A from udp://127.0.0.1:1053
dial <proxy-group> ... error: <node-domain>:<port> connect error: dns resolve failed: all DNS requests failed, first error: read udp 127.0.0.1:<random>->127.0.0.1:1053: read: connection refused

OpenClash Config

Relevant sanitized config:

dns:
  enable: true
  ipv6: false
  listen: 0.0.0.0:7874
  nameserver:
    - 119.29.29.29
    - 223.5.5.5
  proxy-server-nameserver:
    - udp://127.0.0.1:1053
  enhanced-mode: fake-ip

Expected Behavior

启用自定义 DNS 且用户设置了“节点域名解析服务器 / Proxy-server-nameserver”时,OpenClash 应该像处理 nameserver / fallback / default-nameserver 一样,替换订阅中原有的 proxy-server-nameserver,而不是追加保留旧值。

或者至少提供一个明确选项:是否清空订阅原有的 proxy-server-nameserver 后再写入用户配置。

期望生成的运行配置类似:

dns:
  proxy-server-nameserver:
    - 223.5.5.5
    - 119.29.29.29

不再保留订阅中的 udp://127.0.0.1:1053

Additional Context

这个问题会直接影响节点域名解析。Mihomo 的 proxy-server-nameserver 是用于解析代理节点服务器域名的 DNS,发生在代理节点拨号之前;如果该 DNS 指向不存在的本机端口,所有使用域名 server 的节点都可能连接失败。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions