NOTE 03 sing-box / 配置结构

Karing参考sing-box配置时如何理解outbounds、selector与route.final

JSON能够读取,却提示某个出站引用不存在,这说明语法检查与结构检查并不相同。一个拼写不一致的标签,就可能让选择器或路由找不到目标。沿着引用的方向核对,通常能更快定位结构问题。

技术工作台上显示代码的笔记本电脑
技术工作台上显示代码的笔记本电脑。场景摄影仅作主题配图。

outbounds是对象列表,tag是引用名称

outbounds定义出站对象。具体代理出站描述一种连接方式,selector则组织可供选择的出站;两者不能简单视为同一个节点。tag为对象提供引用标识,名称应唯一,并在使用它的地方保持一致。

这属于sing-box的通用结构说明,不是Karing某一版本的完整导入规范。即使应用使用相关技术,也不能因此认定所有原生配置字段都会原样执行。先阅读配置格式与兼容性说明,再对照运行版本文档与迁移说明。

选择器引用已有出站

选择器的成员列表保存出站tag,不会仅凭一个名称自动创建节点。默认选项也应属于可选成员。urltest是根据探测选择出站的另一类机制,其参数和行为需查对应版本;它与手动selector的职责不同。

sing-box JSON 示例结构示意 / 非完整配置
{
  "outbounds": [
    { "type": "direct", "tag": "demo-direct" },
    {
      "type": "selector",
      "tag": "demo-select",
      "outbounds": ["demo-direct"],
      "default": "demo-direct"
    }
  ],
  "route": { "final": "demo-select" }
}

示例只演示引用关系,没有代理服务器与真实凭据,也不是可直接套用的完整运行配置。这里route.final引用demo-select,选择器再引用demo-direct。实际项目中的标签可自行命名,本文名称不是Karing内置标签。

route、规则动作与final分别承担什么

route.rules组织路由规则;规则如何选择出站,应按对应版本的规则动作语法配置。route.final指定默认出站的tag,不能填写一个尚未定义的对象名。默认行为和字段可能随版本调整,不应凭空假设。

遇到选择器没有预期成员,可以先按节点来源与组引用检查法判断是节点未定义、被更新删除,还是引用写错。JSON逗号和括号正确,只能说明文本能被解析,不能保证名称引用和运行语义有效。

用一张引用清单检查配置

  1. 在副本中列出全部outbound tag,检查重复与不可见空格。
  2. 逐个核对selector成员及default是否存在,避免自引用或循环引用。
  3. 从route.final及规则动作回查出站,确认标签逐字对应。
  4. 核对当前版本字段是否仍有效,留意废弃字段和迁移提示。
  5. 结构检查通过后,再检查解析日志和实际连接行为。

记录错误时只保留字段、脱敏标签和错误类型,不公开服务器凭据。不要覆盖唯一有效配置,也不要把旧版本完整文件直接视为新版本的兼容模板。关于同一目标如何命中规则,继续阅读规则匹配优先顺序;本篇的重点是对象存在与引用有效。