环境
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 字段能完整保留。
环境
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 字段能完整保留。