wonfen:Clash Verge Rev 扩展配置里的 dns/hosts 自 v2.5.5 起整段替换,订阅扩展会覆盖全局 nameserver-policy

在 Clash Verge Rev issue #8080(v2.5.5+ DNS 合并整段替换,导致订阅扩展覆盖全局 nameserver-policy)下,wonfen 说明目前就是这样设计的:这是 v2.5.5 起有意做的改动(提交 6a85d034,起因 issue #7993)——扩展配置里写出的 dns 字段和 hosts 现在会整体替换原来的值,以前是逐条合并,订阅里自己不想要的 nameserver-policy 旧条目怎么都删不掉。 副作用是该规则对每一层扩展都生效:订阅扩展配置只要写了 nameserver-policy,全局扩展配置里的那份就会被整个换掉。他承认当时 changelog 只写了「旧条目仍被保留」,没说清全局扩展与订阅扩展之间也不再叠加,这一点没有交代到位。 他判断提问者的断连大概率也与此有关:geosite:cn 策略失效后,GEOIP,CN 解析该域名走的是 Cloudflare / Google 的 DoH,拿到的不是 CN 的 IP,于是落到 MATCH(日志里的 match Match/),流量改走代理,之后代理链超时才是连接直接断掉的原因。 两个改法选其一:把全局扩展配置里要保留的条目(如 geosite:cn)也写进订阅扩展配置的 nameserver-policy;或把全局条目留在全局扩展配置、订阅专属条目挪到订阅扩展脚本里逐条追加(订阅扩展脚本最后执行,不会被覆盖),并给出 main(config) 追加示例。合并规则已补进文档《扩展配置与脚本》的「扩展配置的合并规则」一节,FAQ 里「无法访问公司内网域名」也加了提示;该行为暂时不打算改回逐条合并,否则订阅扩展就删不掉全局扩展里的条目。仓库最新发布为 9 月 26 日 04:11Z 的 v2.5.6,这一说明在其之后发出。

作者原文

目前就是这样设计的,参考这个issue https://github.com/clash-verge-rev/clash-verge-rev/issues/7980

这是 v2.5.5 起有意做的改动(6a85d034,起因是 #7993):扩展配置里写出的 dns 字段和 hosts,现在会整体替换原来的值。目的是让大家能在扩展配置里去掉订阅自带、自己不想要的 nameserver-policy 条目。以前是逐条合并,订阅里的旧条目怎么都删不掉。

副作用是这条规则对每一层扩展都生效:订阅扩展配置只要写了 nameserver-policy,全局扩展配置里的那份就会被整个换掉。当时 changelog 只写了"旧条目仍被保留",没说清全局扩展和订阅扩展之间也不再叠加,这点是我们没交代到位。

你遇到的断连大概率也跟它有关。geosite:cn 的策略没了以后,GEOIP,CN 解析这个域名走的是 Cloudflare / Google 的 DoH,拿到的不是 CN 的 IP,就落到了 MATCH(日志里的 match Match/),流量改走了代理。之后代理链超时,才是连接直接断掉的原因。

两个改法选一个就行:

把全局扩展配置里要保留的条目(比如 geosite:cn)也写进订阅扩展配置的 nameserver-policy。
全局的条目留在全局扩展配置里,订阅专属的条目挪到订阅扩展脚本里逐条追加。订阅扩展脚本是最后执行的,不会被覆盖:

function main(config) {
config.dns = config.dns || {};
config.dns["nameserver-policy"] = config.dns["nameserver-policy"] || {};
config.dns["nameserver-policy"]["+.example.com"] = "https://1.1.1.1/dns-query";
return config;
}
合并规则已经补到文档扩展配置与脚本的「扩展配置的合并规则」一节,FAQ 里「无法访问公司内网域名」也加了提示。这个行为暂时不打算改回逐条合并,不然订阅扩展就删不掉全局扩展里的条目了。