HIYOO嗨游加速器

sing-box节点配置怎么写?5类协议、URI转换与启动排错

更新于 2026-11-14 · mhiyoo.buzz

简答:拿到节点链接后,不要直接把整条 URI 或 Clash YAML 粘进 sing-box。先拆出协议、服务器、端口、认证、TLS、SNI 和传输层参数,写成单个 outbound,再补 DNS、mixed 或 TUN,最后执行 format 和 check。

定义:sing-box 节点配置,就是把服务商提供的协议、服务器、端口、认证、TLS 与传输参数,按 JSON 结构写入 outbounds,并通过 tag 连接入站、分组和路由。

先复制这份最小配置:只替换 4 个占位符

拿到节点链接却不知道怎么写成 JSON,通常不是先缺少复杂规则,而是节点字段、DNS 解析和 tag 引用没有对应好。本文是第三方使用指南,核对日期为 2026-11-14;sing-box 使用 JSON 配置文件,官方结构包含 dns、inbounds、outbounds 和 route 等部分,详见sing-box 配置文档。

最快做法:先保存一个单节点配置,只替换服务器地址、端口、UUID 和 SNI。下面示例使用 VLESS+TLS,不包含 WebSocket、Reality 或 Vision;这些字段必须等服务商明确提供后再加入。

{
  "dns": {
    "servers": [
      {
        "type": "local",
        "tag": "local"
      }
    ]
  },
  "inbounds": [
    {
      "type": "mixed",
      "tag": "mixed-in",
      "listen": "127.0.0.1",
      "listen_port": 2080
    }
  ],
  "outbounds": [
    {
      "type": "vless",
      "tag": "proxy-1",
      "server": "替换为服务器地址",
      "server_port": 443,
      "uuid": "替换为UUID",
      "tls": {
        "enabled": true,
        "server_name": "替换为SNI"
      },
      "domain_resolver": "local"
    },
    {
      "type": "direct",
      "tag": "direct"
    }
  ],
  "route": {
    "default_domain_resolver": "local",
    "final": "proxy-1"
  }
}

domain_resolver 和 route.default_domain_resolver 用于处理节点服务器是域名的情况。官方 Dial Fields 文档说明,域名服务器地址在多种场景下需要显式指定解析器;只有配置单个 DNS server 时,部分场景可以省略,但为了减少版本差异,本文示例保留两处设置,参考Dial Fields与Migration。

覆盖配置前先备份。Linux 或 macOS 执行:

cp config.json config.json.bak

Windows PowerShell 执行:

Copy-Item .\config.json .\config.json.bak

检查命令如下:

sing-box format -w -c config.json
sing-box check -c config.json
sing-box run -c config.json

官方配置页明确列出了 check 和 format -w -c 的用法。预期结果是格式化和检查没有 JSON、字段或必填项错误;如果提示找不到命令,先确认可执行文件路径。创建 TUN、修改路由或监听低位端口时,按系统要求使用管理员权限;权限错误不等于节点参数错误。

检查项正常判定失败时先看什么
JSON 格式format 能完成且文件仍可打开引号、逗号、大括号是否成对
配置结构check 没有 unknown field 或 missing required field字段名和内核文档是否匹配
本地代理应用指向 127.0.0.1:2080 后日志出现 proxy-1端口占用、入站地址和 route.final

5类常用节点协议:字段怎么对应

官方 Outbound 文档将 VLESS、VMess、Trojan、Shadowsocks 和 Hysteria2 列为可用出站类型;每个出站都要有正确的 type、唯一 tag 以及协议要求的字段,详见Outbound。

协议通常需要的字段容易写错的地方
VLESSserver、server_port、uuidflow、TLS、Reality、transport 必须按节点参数添加
VMessserver、server_port、uuid、securityalter_id 为 0 表示 AEAD;旧链接的非零值属于旧协议写法
Trojanserver、server_port、password、tls密码、SNI 和传输层必须与服务端一致
Shadowsocksserver、server_port、method、password加密方法不能凭经验猜,按节点提供的 method 填写
Hysteria2server、server_port、password、tls带混淆时,obfs 必须是对象而不是普通字符串

VLESS+Vision+Reality:不要再叠加 WebSocket

{
  "type": "vless",
  "tag": "vless-reality",
  "server": "node.example.com",
  "server_port": 443,
  "uuid": "替换为UUID",
  "flow": "xtls-rprx-vision",
  "tls": {
    "enabled": true,
    "server_name": "替换为SNI",
    "utls": {
      "enabled": true,
      "fingerprint": "chrome"
    },
    "reality": {
      "enabled": true,
      "public_key": "替换为公钥",
      "short_id": "替换为short_id"
    }
  },
  "domain_resolver": "local"
}

这个模板用于服务端明确提供 VLESS Vision、Reality、public key 和 short ID 的情况。它不包含 transport。不要把 flow: xtls-rprx-vision 与 WebSocket 传输同时照抄;如果节点是 WS+TLS,应改用下面的独立模板。官方 VLESS 文档列出 xtls-rprx-vision 为可用 flow;TLS 文档给出了 utls 和 reality 的字段结构,参考VLESS与TLS。

VLESS+WS+TLS:删除 flow 和 reality

{
  "type": "vless",
  "tag": "vless-ws",
  "server": "node.example.com",
  "server_port": 443,
  "uuid": "替换为UUID",
  "tls": {
    "enabled": true,
    "server_name": "替换为SNI"
  },
  "transport": {
    "type": "ws",
    "path": "/替换为路径",
    "headers": {
      "Host": "替换为Host"
    }
  },
  "domain_resolver": "local"
}

如果服务商没有提供 path 或 Host,不要自行猜测。TLS 的 server_name 用于证书校验和虚拟主机握手;它不一定等于 server,应按节点参数填写。

其余四类的最小字段示例

{
  "type": "vmess",
  "tag": "vmess-1",
  "server": "node.example.com",
  "server_port": 443,
  "uuid": "替换为UUID",
  "security": "auto",
  "alter_id": 0,
  "tls": {
    "enabled": true,
    "server_name": "替换为SNI"
  },
  "domain_resolver": "local"
}
{
  "type": "trojan",
  "tag": "trojan-1",
  "server": "node.example.com",
  "server_port": 443,
  "password": "替换为密码",
  "tls": {
    "enabled": true,
    "server_name": "替换为SNI"
  },
  "domain_resolver": "local"
}
{
  "type": "shadowsocks",
  "tag": "ss-1",
  "server": "node.example.com",
  "server_port": 443,
  "method": "替换为加密方法",
  "password": "替换为密码",
  "domain_resolver": "local"
}
{
  "type": "hysteria2",
  "tag": "hy2-1",
  "server": "node.example.com",
  "server_port": 443,
  "password": "替换为密码",
  "tls": {
    "enabled": true,
    "server_name": "替换为SNI"
  },
  "domain_resolver": "local"
}

Hysteria2 只有在服务端明确启用混淆时才加入 obfs,结构如下:

"obfs": {
  "type": "salamander",
  "password": "替换为混淆密码"
}

官方 Hysteria2 文档说明 obfs.type 可使用 salamander 或 gecko,而 obfs.password 是混淆密码;未提供混淆参数时应删除整个 obfs 对象,参考Hysteria2。VMess 的 alter_id 为 0 时使用 AEAD;非零值属于旧协议兼容场景,不要从旧链接机械照搬,参考VMess。Trojan 的密码、TLS 和可选传输结构见Trojan;Shadowsocks 客户端至少要对应填写服务器、端口、method 和 password,参考Shadowsocks。

从节点 URI 转成 outbound:逐段核对,不直接粘贴

URI 只是参数的另一种编码形式,不能直接当作 sing-box JSON。先脱敏保存原始链接,再按协议拆出字段。下面用一条虚构的 VLESS URI 说明映射关系:

vless://[email protected]:443?security=tls&type=ws&host=cdn.example.com&path=%2Fedge&sni=cdn.example.com#demo
URI 部分sing-box 字段核对重点
vless://type: vless先确认协议类型
UUID@uuid不要把 URL 编码后的字符漏掉
node.example.comserver域名或 IP 原样记录
:443server_port端口必须是数字
security=tlstls.enabled: true若没有 TLS,不要强行开启
type=wstransport.type: ws不能与 Vision flow 混用
host=transport.headers.HostHost 不一定等于 server
path=transport.path先 URL 解码,再核对斜杠
sni=tls.server_name不要默认填成 server

按上表转换后的核心部分如下:

{
  "type": "vless",
  "tag": "vless-ws",
  "server": "node.example.com",
  "server_port": 443,
  "uuid": "11111111-1111-1111-1111-111111111111",
  "tls": {
    "enabled": true,
    "server_name": "cdn.example.com"
  },
  "transport": {
    "type": "ws",
    "path": "/edge",
    "headers": {
      "Host": "cdn.example.com"
    }
  },
  "domain_resolver": "local"
}

如果 URI 是 Reality 形式,常见参数需要分别核对:sni 对应 tls.server_name,pbk 对应 tls.reality.public_key,sid 对应 tls.reality.short_id,并根据节点要求加入 utls。如果 URI 是 Hysteria2 形式,密码、SNI、混淆类型和混淆密码必须分别核对,不能把整段 query 当成一个 password。

  1. 复制原始 URI,先去掉节点名称等展示信息。
  2. 对 Base64、百分号编码和特殊字符进行解码,但保留一份未解码原文。
  3. 把每个参数填入对应 JSON 字段,不确定的字段标为“需核实”,不要用默认值替代。
  4. 删除不适用于该组合的字段,例如 VLESS Vision 模板中的 WebSocket,或 WS 模板中的 Vision flow。
  5. 保存后执行 sing-box format -w -c config.json 和 sing-box check -c config.json。

mixed、TUN、分组和路由:按三种场景逐步扩展

场景一:只给浏览器使用。保留 mixed 入站即可。官方文档说明 mixed 同时提供 SOCKS、SOCKS4、SOCKS4a、SOCKS5 和 HTTP 服务;把应用代理指向 127.0.0.1:2080,日志中应出现对应节点 tag,参考Mixed。

若端口被占用,Windows PowerShell 执行:

Get-NetTCPConnection -LocalPort 2080 -State Listen

macOS 或 Linux 执行:

lsof -nP -iTCP:2080 -sTCP:LISTEN

确认 PID 后再停止占用程序或改成未使用端口。撤销方法是恢复 config.json.bak,不要直接结束不认识的系统进程。

场景二:需要接管更多应用流量。在单节点和 mixed 已经正常后,再尝试 TUN。下面是精简示例:

{
  "type": "tun",
  "tag": "tun-in",
  "interface_name": "singtun0",
  "address": [
    "172.18.0.1/30",
    "fdfe:dcba:9876::1/126"
  ],
  "auto_route": true,
  "strict_route": true,
  "dns_mode": "hijack",
  "dns_address": [
    "172.18.0.2"
  ]
}

官方 Tun 文档说明 TUN 只支持部分平台,auto_route 会设置默认路由,strict_route 会加强路由约束;Linux 上通常还要结合 auto_redirect,并注意管理员权限。Windows、macOS、Linux 的图形客户端和命令行客户端支持情况可能不同,遇到字段错误应按已安装内核对应文档核对,参考Tun。TUN 断网时先恢复备份、删除 TUN 入站,只用 mixed 重测。

场景三:多个节点自动选择。先确保所有节点 tag 已定义,再添加 URLTest:

{
  "type": "urltest",
  "tag": "auto",
  "outbounds": [
    "proxy-1",
    "proxy-2"
  ],
  "url": "https://www.gstatic.com/generate_204",
  "interval": "3m",
  "tolerance": 50
}

然后把路由默认出口改为:

"route": {
  "default_domain_resolver": "local",
  "final": "auto"
}

URLTest 的 outbounds 必须是已有 outbound tag 的列表;官方文档给出的默认测试地址、间隔和容差可作为参考,详见URLTest。route.rules 用于按域名、IP、端口或入站匹配,rule_set 用于加载规则集,final 是没有规则命中时的默认出口,参考Route与Route Rule。

启动失败怎么定位:按报错层级回退

排障时不要同时修改协议、DNS、TUN 和路由。按以下顺序,每次只改一个变量:

  1. 先查 JSON:执行 sing-box format -w -c config.json。出现 invalid character,通常检查引号、逗号、括号和 URL 编码后的特殊字符。
  2. 再查字段:执行 sing-box check -c config.json。出现 unknown field,通常是字段拼写、版本差异或把其他客户端字段直接复制过来;出现 missing required field,说明协议必填参数缺失。
  3. 再查 tag:如果出现 tag not found 或找不到 outbound,逐字核对 route.final、URLTest 的 outbounds 和规则中的出口名称。tag 区分大小写。
  4. 再查域名:节点服务器是域名时,检查 dns.servers、domain_resolver 和 route.default_domain_resolver。官方迁移文档将旧的 domain_strategy 迁移到新的解析器写法;不要把旧示例直接当作当前配置。
  5. 再查 TLS:证书或握手失败时,核对 tls.server_name、Reality 公钥、short ID、传输类型和路径。不要为了绕过未知错误长期保留 insecure: true;只有在明确知道证书情况时才临时测试。
  6. 最后查网络:connection refused 表示目标端口拒绝连接,i/o timeout 表示当前路径内等待超时,二者都不能单独证明节点永久不可用。先记录节点 tag、目标域名、端口和启动日志,再更换一个变量复测。

可复现的通过标准是:check 无结构错误;mixed 端口能被应用连接;日志出现预期节点 tag;DNS 查询没有持续失败;浏览器或测试工具能通过 127.0.0.1:2080 建立请求。确认后再开启 TUN 或复杂规则。当前官方文档还列出不同版本的字段变更,具体已安装版本应通过 sing-box version 核对,不能仅凭网上配置判断兼容性。

常见问题

sing-box 可以直接导入 Clash YAML 吗?

不能把 Clash YAML 当作 sing-box JSON 直接使用。需要先识别配置格式,再把节点参数转换到 outbounds;转换后执行 format 和 check,不能只修改文件扩展名。

VLESS 的 Vision 和 WebSocket 可以一起写吗?

不要直接一起写。本文将 VLESS+Vision+Reality 与 VLESS+WS+TLS 拆成两个模板:前者使用 flow、Reality 和 uTLS,不写 transport;后者使用 transport.type 为 ws,不写 Vision flow。最终以服务端实际参数为准。

Reality 配置需要哪些字段?

在服务端明确使用 Reality 的前提下,客户端通常需要 tls.reality.enabled、public_key 和 short_id,并按节点要求设置 tls.server_name;如果服务端要求 TLS 指纹,还要核对 utls。没有提供的字段不要自行填。

Hysteria2 的 obfs 怎么写?

只有节点明确启用混淆时才加入对象,例如 type 为 salamander 或 gecko,并填写对应 password;未提供混淆类型或密码时,删除整个 obfs 对象,不要保留空占位值。

开启 TUN 后断网怎么办?

先停止 sing-box,使用 config.json.bak 恢复配置,删除 TUN 入站,只保留单节点和 mixed。确认 mixed 能连接后,再逐项添加 TUN 的 auto_route、strict_route 和 DNS 设置,并观察权限、系统路由和日志变化。

出现 domain_resolver 相关提示怎么办?

检查 dns.servers 是否有可用 DNS tag,并在节点 outbound 中加入 domain_resolver,或在 route 中加入 default_domain_resolver。旧配置中的 domain_strategy 可能涉及迁移,按当前安装版本的官方文档核对。

相关阅读

参考资料

  1. Introduction - sing-box
  2. VLESS - sing-box
  3. TLS - sing-box
  4. Hysteria2 - sing-box
  5. VMess - sing-box
  6. Trojan - sing-box
  7. Shadowsocks - sing-box
  8. Dial Fields - sing-box
  9. Migration - sing-box
  10. Mixed - sing-box
  11. Tun - sing-box
  12. URLTest - sing-box