请教一个 singbox 的问题

singbox 版本为:sing-box-1.12.0-alpha.20
平台:window 11 裸跑 singbox 内核
关于 DNS 配置模块中,server 配置有 domain_resolver 这个参数,还有 detour 参数,这个 detour 参数,官方文档中说在拨号字段中才需要,以下是我的 DNS 配置片段:

"servers": [
      {
        "tag": "dns-aliyun",
        "type": "https",
        "server": "dns.alidns.com",
        "domain_resolver": "dns-resolver-aliyun"
      },
      {
        "type": "udp",
        "tag": "dns-resolver-aliyun",
        "server": "223.5.5.5"
      },
      {
        "type": "https",
        "tag": "dns-google",
        "server": "dns.google",
        "domain_resolver": "dns-resolver-google",
        "detour": "♻️ 自动选择"
      },
      {
        "type": "udp",
        "tag": "dns-resolver-google",
        "server": "8.8.8.8",
        "detour": "♻️ 自动选择"
      },
      {
        "type": "fakeip",
        "tag": "fakeip",
        "inet4_range": "198.18.0.0/15"
      }
    ],

如上配置是可以正常使用 singbox 的,但是去掉 "detour": "♻️ 自动选择" 配置之后,就无法访问 Google 网站,但是,如果我在 "tag": "dns-aliyun" 的DNS服务器配置中加上 detour: "直连" (这个“直连”在我 outbounds 中配置的 tag,类型为 direct),启动 singbox 服务,提示:dns/https[dns-aliyun]: detour to an empty direct outbound makes no sense,导致服务启动失败,看了官方文档,也是没弄清楚这个 domain_resolverdetour 具体怎么使用。在我的 outbounds 中配置了默认的 domain_resolver

    "default_domain_resolver": {
      "server": "dns-resolver-aliyun"
    },

希望理解的大佬帮忙看看。

3 Likes

以下是个人理解,不一定对:

  1. detour 不是 DNS 配置需要的字段,是 Outbound 的
  2. domain_resolver 是当你DNS里"server"是【域名格式】时,你需要用哪个【ip格式的DNS】去解析这个【域名格式的DNS】
1 Like

感谢回答,我感觉不好说,如果真的是 “detour” 不是 DNS 中的字段,为什么我删除了 DNS 中的"detour": ":recycling_symbol: 自动选择"导致我无法访问 Google?

可能和你DNS规则有关,可以参考个简单的Demo:

"dns": {
    "servers": [
        {
            "tag": "google",
            "address": "udp://8.8.8.8"
        },
        {
            "tag": "local",
            "address": "223.5.5.5",
            "detour": "direct"
        }
    ],
    "rules": [
        {
            "outbound": "any",
            "server": "local"
        },
        {
            "clash_mode": "Direct",
            "server": "local"
        },
        {
            "clash_mode": "Global",
            "server": "google"
        },
        {
            "rule_set": "geosite-geolocation-cn",
            "server": "local"
        }
    ]
},

default_domain_resolver错了,你可以改成

    "default_domain_resolver": "dns-resolver-aliyun",

因为dns-resolver-aliyun不是一个server而是一个serverstag

detour看起来并没有用错,可以提供dns rule再排查下

感谢回答,你给出的是简写,当只有一个属性的时候,可以那样,但是这个简写也是对应“server”,如下截图:


这个问题是在 19 和 20 版本出现的,所以我看了 18 的代码,对比了下,如图:

也就是说,在 outbounds 中设置的那个 type 为 direct 的实例为空,我看代码判断逻辑是“directDialer.IsEmpty()”,才出这个问题,所以,{
“type”: “direct”,
“tag”: “direct-out”
}, 这个 outbound 实例为空,结合UI如下:

这里面是所有的 outbound 实例,其中确实没有那个直连的outbound,所以我也不知道了。是配置问题,还是代码问题了。

楼主解决了吗?我也发现了这个问题

我手机也最近用1.12beta版,发现这个问题,看官方issue貌似 detour: "直连" 应该没错,但是报错,不知是不是bug,看以后会不会解决。
我的理解,“type”: “udp”,的不需要"detour",默认就是 直连。“domain_resolver”“https”,的需要出口进行解析域名,所以得要"detour": “:recycling_symbol: 自动选择”。
我试了,如果有"default_domain_resolver",前面可以不要"domain_resolver",但是"detour"得有,也可以上网。或者前面有,后面可以去掉"default_domain_resolver",不影响,两个选一个。均测试通过。

版本更新之后,从 19 版本开始,detour 默认是直连的话,不用显示去写 detour:“direct”,如果显式写了,反而是错的。以下是官方的说明:

detour
用于连接到 DNS 服务器的出站的标签。
如果为空,将使用默认出站。

而 DNS 默认的出站方式也由原来的 any 改成了 domain_resolver或者default_domain_resolver,基于此,对于直连的 DNS 出站方式,成了一种

迁移文档指出:

这里这个“废弃的outbound” 就是之前的

{
      "outbound": "any",
      "server": "local"
}

对于之前的 DNS 路由规则来说,但凡所有的 outbound 类型请求,即,所有的节点服务器出站,是由 local 出站,更新之后,这种方式舍弃,所以,为了指定节点服务器的出站方式,需要在 route 中去定义 default_domain_resolver 或者 对每一个出站节点服务器定义 domain_resolver。