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