Skip to content

切换/更新订阅后,ClashMac 生成的 work/config.json 会丢失高级 DNS 字段,导致内网域名解析失败 #327

Description

@sunruimx-missbear

环境
ClashMac:27.1.1 build 207
Core:Mihomo v1.19.27
模式:Rule 模式,TUN 开启
配置类型:远程 Clash YAML 订阅
问题描述
我的远程订阅 YAML 里已经包含有效的 DNS 配置,例如:
dns:
proxy-server-nameserver:
- ...
nameserver-policy:
"+.example-internal.com":
- 172.x.x.x
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.example-internal.com"

这份 YAML 本身是合法的。直接用 Mihomo core 执行配置校验可以通过。
但是 ClashMac 在“更新远程订阅”或“切换 profile”后,会重新生成:
~/Library/Application Support/ClashMac/work/config.json

生成后的运行时配置会丢失部分 DNS 字段,例如:
dns.proxy-server-nameserver
dns.nameserver-policy
dns.fake-ip-filter
dns.fake-ip-range
有时 mixed-port 也会变成 0 或缺失
结果是:内网域名虽然命中了 DIRECT 规则,但 DNS 没有走 nameserver-policy 指定的内网 DNS,而是走了公共 DNS,导致解析不到 IP。
日志类似:
[TCP] dial DIRECT (match DomainSuffix/example-internal.com)
198.18.0.1:xxxxx --> host.example-internal.com:443
error: dns resolve failed: couldn't find ip

期望行为
当源订阅 YAML 中包含合法的 Mihomo DNS 字段时,ClashMac 在以下操作后应保留这些字段:
更新远程订阅
切换 profile
重启核心 / 冷启动核心
也就是说,最终传给 Mihomo 的 work/config.json 应该完整保留源 YAML 中的关键 DNS 配置。
实际行为
源 YAML 中有这些 DNS 字段,但 ClashMac 生成的 work/config.json 中没有。
我本地复现到的情况是:
Subscription-Node-Sys.yaml 中存在 dns.nameserver-policy
执行 profile switch 后,work/config.json 中 dns.nameserver-policy 变成缺失
dns.fake-ip-filter、dns.fake-ip-range、dns.proxy-server-nameserver 也会缺失
内网域名随后解析失败

复现步骤
导入一份远程 Clash YAML 订阅,里面包含:
dns:
nameserver-policy:
"+.example-internal.com":
- 内网 DNS
fake-ip-filter:
- "*.example-internal.com"
proxy-server-nameserver:
- ...
确认源 YAML 中这些字段存在。

在 ClashMac 中更新订阅,或切换到该 profile。

查看生成后的运行时配置:
~/Library/Application Support/ClashMac/work/config.json

可以看到 dns.nameserver-policy、dns.fake-ip-filter 等字段丢失。

访问内网域名时,规则命中 DIRECT,但 DNS 解析失败。

排查结论
我确认过几点:
源 YAML 是合法的,Mihomo core 直接校验可以通过。
问题不是规则没命中,日志显示内网域名确实匹配到了 DIRECT。
问题发生在 DNS 解析阶段,因为运行时配置缺少 nameserver-policy。
手动把缺失的 DNS 字段补回 work/config.json 后,再重新加载配置,内网域名立即恢复正常解析。
因此问题更像是 ClashMac 的 profile 生成/合并逻辑丢字段,而不是 Mihomo core 本身的问题。

疑似根因
ClashMac 似乎不是直接把源 YAML 交给 Mihomo core,而是先把 profile 解析/合并成:
work/config.json
在这个转换过程中,可能使用了 App 自身的 DNS 设置覆盖源 YAML,或者使用了字段白名单,导致部分 Mihomo 支持的高级 DNS 字段没有被保留下来。
尤其是在 profile switch / 远程订阅更新这类“冷生成”路径下,更容易复现。
临时规避方案
我目前只能在每次更新订阅或切换 profile 后,手动把这些字段补回 work/config.json:
dns.nameserver-policy
dns.fake-ip-filter
dns.fake-ip-range
dns.proxy-server-nameserver
mixed-port

然后重新加载配置、清理 DNS 缓存,内网访问就会恢复。
希望作者可以检查一下 ClashMac 生成 work/config.json 的逻辑,确保源 YAML 中合法的 Mihomo DNS 字段能完整保留。

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