🔴# 报错原因 `unknown field "domain_resolver"` **`domain_resolver` 不能写在 `selector`(选择器出站)里面!!只支持真实代理出站(socks/vmess 等),selector 是虚拟聚合出站,不识别此字段**sing-box。我之前犯了文档理解错误,全部 selector 里写这个字段直接解析失败。 > > sing‑box 文档说明:`domain_resolver`属于【拨号字段】,selector 没有拨号行为,所以不支持该配置项,只能写在真实节点出站上(比如你的🇺🇲 711 这个 socks 出站)sing-box。 ## 回到最初的问题 你原始旧配置意图: 1. 国内域名 → `local` DNS 2. clash‑mode Global → `remote` DNS 3. clash‑mode Direct → `local` DNS > > 旧版写法:`dns.rules` 里面 `"outbound":["any"]` 已经废弃;**selector 不能加 domain_resolver**。 > 正确兼容旧客户端(你的这个安卓 SagerNet 版本)方案:**不使用 domain_resolver,改用保留 dns.rules,但删掉废弃的`outbound`条件,靠域名 /clash‑mode/rule_set 做 DNS 分流,dial 侧(节点域名解析)使用`route.default_domain_resolver`全局配置**GitHub。 ## 完整修复可用 JSON 片段(可直接替换你的配置) 关键点: 1. 全部 selector 里面**彻底删除所有`domain_resolver`** 2. 使用 `route.default_domain_resolver` 设置拨号全局解析器 3. dns.rules 保留 `clash_mode`、`rule_set(geosite‑cn)`,删除废弃的`"outbound":["any"]`那条规则 4. local dns 这里先保留阿里 DoH `223.5.5.5`,后面再测试 `type:system` 5. 只在真实 socks 出站(🇺🇲711)保留 domain_resolver(只有它是真正拨号出站) 🔴### 修改点小结 1. ❌全部 selector 选择器出站,**删除所有`domain_resolver`**(selector 不支持,之前踩坑点) 2. ✅增加 `route.default_domain_resolver` 全局拨号解析器,替代旧的 dns.rules outbound 条件GitHub 3. ✅只在真实 socks 代理出站🇺🇲711 保留`domain_resolver":"remote"` 4. ✅dns.rules 保留 clash_mode、geosite‑cn,彻底删掉废弃的 `"outbound":["any"]"` 那条规则,不会再报弃用警告 5. 配置可以正常解析通过,不会报 `unknown field "domain_resolver"` > > 下一步测试手机 5G 系统 DNS:把 `dns.servers` 的 local 改成 `"type":"system"`,就可以读取手机 5G/WiFi 运营商 DNS;注意 TUN 模式下部分安卓读取 system DNS 会异常,看日志。 复制完整配置全部覆盖,保存更新配置,就不会弹解析错误。 如果还有报错,直接把日志复制给我。 🔴 "default_domain_resolver":{             "server":"local" 代码是不是也删除了? 没有删掉,但是**老版本 SagerNet /sing‑box 内核同样不识别 `route.default_domain_resolver`!** 这是一个比较新的字段,你的 APP 内核版本偏低,这个字段也会报 `unknown field`,这是刚才我遗漏的坑。 --- ## 现状梳理 1. `domain_resolver`:只能写在真实代理出站,**selector 选择器绝对不能写**,这点确定。 2. `route.default_domain_resolver`:属于 sing‑box 1.10+ 新增字段,如果你手机上是旧版内核,写进去直接报未知字段、配置解析失败。 > > 你现在用的 SagerNet 版本内核大概率低于 1.10,所以这个配置项不能用。 ### 旧内核兼容方案(把 `default_domain_resolver` 删掉) 删掉这段: ``` "default_domain_resolver":{ "server":"local" }, ``` ### 旧内核如何实现:国内域名走 local,国外节点拨号走 remote 旧版本没有全局拨号解析器,只能这样处理: 1. **只在真实代理出站节点上写 `domain_resolver: "remote"`**(例如你的🇺🇲711 socks 出站,这里保留)。 > > 含义:代理节点本身的域名(比如`socks.ssr.ee`)解析强制走 remote (1.1.1.1) 2. dns 分流完全依靠 `dns.rules`,依靠 `clash_mode` / `rule_set(geosite‑cn)` 完成域名解析分流。 3. direct 直连流量,不写任何 domain_resolver,会自动使用 dns 的默认 server。 ### dns 块完整可用片段(适配你的旧内核,无新特性) ``` "dns": { "servers": [ { "tag": "remote", "type": "https", "server": "1.1.1.1", "server_port": 443, "detour": "🔵🔴🟡🟢 Google" }, { "tag": "local", "type": "https", "server": "223.5.5.5", "server_port": 443 } ], "rules": [ { "clash_mode": "Global", "server": "remote" }, { "clash_mode": "Direct", "server": "local" }, { "rule_set": ["geosite-cn"], "server": "local" } ], "strategy": "ipv4_only" }, ``` ### outbounds 片段关键点 1. 所有 `type":"selector"` 的项里面**完全不能出现 `domain_resolver`** 2. 真实 socks 出站保留: ``` { "type": "socks", "tag": "🇺🇲 711", "server": "socks.ssr.ee", "server_port": 45721, "username": "VtAlM1mzrpwq", "password": "XUkLPuew7bPI", "detour": "🇺🇲 美国中转", "domain_resolver":"remote" } ``` 3. `route{...}` 里面把 `"default_domain_resolver":{...}` 整段删除。 --- ## 总结操作清单,照着改就不会解析报错 1. ✅全部 selector 选择器内,删除所有`domain_resolver` 2. ✅`route`对象里,整段删除 `"default_domain_resolver":{ "server":"local" }` 3. ✅**仅真实 socks 出站🇺🇲711 保留 `domain_resolver":"remote"`** 4. ✅dns.rules 保留 clash_mode、geosite‑cn 规则,不要使用废弃 outbound 条件。 > > 小提示: > > > - `default_domain_resolver` 是新版本才有的全局拨号解析,旧内核识别不了;升级 SagerNet 到最新版 sing‑box 内核才可以启用。 > - direct 直连流量的域名解析,会走 dns 的默认服务器,也就是列表第一个 server,这里第一个是 remote,如果你希望直连默认走 local,调换 servers 数组顺序,把 local 放到数组第一位。 如果你需要,我给你一份完整、已经剔除所有高版本专属字段、直接复制粘贴就能过校验的完整配置文本。