sing-box节点配置怎么写?5类协议、URI转换与启动排错
简答:拿到节点链接后,不要直接把整条 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.bakWindows 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。
| 协议 | 通常需要的字段 | 容易写错的地方 |
|---|---|---|
| VLESS | server、server_port、uuid | flow、TLS、Reality、transport 必须按节点参数添加 |
| VMess | server、server_port、uuid、security | alter_id 为 0 表示 AEAD;旧链接的非零值属于旧协议写法 |
| Trojan | server、server_port、password、tls | 密码、SNI 和传输层必须与服务端一致 |
| Shadowsocks | server、server_port、method、password | 加密方法不能凭经验猜,按节点提供的 method 填写 |
| Hysteria2 | server、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.com | server | 域名或 IP 原样记录 |
:443 | server_port | 端口必须是数字 |
security=tls | tls.enabled: true | 若没有 TLS,不要强行开启 |
type=ws | transport.type: ws | 不能与 Vision flow 混用 |
host= | transport.headers.Host | Host 不一定等于 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。
- 复制原始 URI,先去掉节点名称等展示信息。
- 对 Base64、百分号编码和特殊字符进行解码,但保留一份未解码原文。
- 把每个参数填入对应 JSON 字段,不确定的字段标为“需核实”,不要用默认值替代。
- 删除不适用于该组合的字段,例如 VLESS Vision 模板中的 WebSocket,或 WS 模板中的 Vision flow。
- 保存后执行
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 ListenmacOS 或 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 和路由。按以下顺序,每次只改一个变量:
- 先查 JSON:执行
sing-box format -w -c config.json。出现invalid character,通常检查引号、逗号、括号和 URL 编码后的特殊字符。 - 再查字段:执行
sing-box check -c config.json。出现unknown field,通常是字段拼写、版本差异或把其他客户端字段直接复制过来;出现missing required field,说明协议必填参数缺失。 - 再查 tag:如果出现
tag not found或找不到 outbound,逐字核对route.final、URLTest 的outbounds和规则中的出口名称。tag 区分大小写。 - 再查域名:节点服务器是域名时,检查
dns.servers、domain_resolver和route.default_domain_resolver。官方迁移文档将旧的domain_strategy迁移到新的解析器写法;不要把旧示例直接当作当前配置。 - 再查 TLS:证书或握手失败时,核对
tls.server_name、Reality 公钥、short ID、传输类型和路径。不要为了绕过未知错误长期保留insecure: true;只有在明确知道证书情况时才临时测试。 - 最后查网络:
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 可能涉及迁移,按当前安装版本的官方文档核对。