核心结论
sing-box 配置是一个 JSON 文件:log 管日志,dns 管域名解析,inbounds 定义流量从哪里进来(TUN 或本地端口),outbounds 定义流量从哪里出去(节点、直连、分组),route 用规则决定每条连接交给哪个出站。字段名会随版本调整,以对应版本的官方文档为准。
配置文件由哪几部分组成
sing-box 的配置是一个 JSON 文件,顶层由几个固定的部分组成。可以把它理解成一条流水线:流量从 inbounds(入站) 进来,经过 route(路由) 判断,交给某个 outbounds(出站) 发出去;过程中需要解析域名时由 dns 负责,log 记录发生了什么。
如果你只是想在手机上用起来,直接导入机场的 sing-box 订阅即可,步骤见 sing-box 使用教程。本文面向想看懂配置、能自己排错的读者。
sing-box 的配置字段在大版本之间会调整,本文按较新版本的写法讲解,具体字段名与可选值以对应版本的官方文档为准。
| 顶层字段 | 作用 | 是否必需 |
|---|---|---|
log |
日志级别与输出方式 | 可选,建议保留 |
dns |
DNS 服务器、DNS 规则与默认解析方式 | 可选,但实际使用中几乎都需要 |
inbounds |
流量入口:TUN 虚拟网卡、本地混合端口等 | 必需 |
outbounds |
流量出口:节点、直连、分组 | 必需 |
route |
路由规则、规则集、默认出站 | 可选,但决定分流效果 |
experimental |
缓存文件、外部控制接口等扩展功能 | 可选 |
一份结构完整的精简配置
下面这份配置包含了日常使用所需的全部部分:手机或电脑上用 TUN 接管流量,国内域名与 IP 直连,其他流量走代理分组。节点地址、UUID、密码处需替换为机场提供的真实值。
{
"log": { "level": "warn", "timestamp": true },
"dns": {
"servers": [
{ "tag": "dns-remote", "type": "https", "server": "1.1.1.1", "detour": "proxy" },
{ "tag": "dns-direct", "type": "udp", "server": "223.5.5.5" }
],
"rules": [
{ "rule_set": "geosite-cn", "server": "dns-direct" }
],
"final": "dns-remote"
},
"inbounds": [
{
"type": "tun",
"tag": "tun-in",
"address": ["172.19.0.1/30"],
"auto_route": true,
"strict_route": true,
"stack": "mixed"
},
{ "type": "mixed", "tag": "mixed-in", "listen": "127.0.0.1", "listen_port": 2080 }
],
"outbounds": [
{ "type": "selector", "tag": "proxy", "outbounds": ["auto", "hk-01", "jp-01"] },
{
"type": "urltest",
"tag": "auto",
"outbounds": ["hk-01", "jp-01"],
"url": "https://www.gstatic.com/generate_204",
"interval": "5m"
},
{
"type": "vless",
"tag": "hk-01",
"server": "entry.example.com",
"server_port": 443,
"uuid": "替换为机场提供的 UUID",
"tls": { "enabled": true, "server_name": "entry.example.com" }
},
{
"type": "trojan",
"tag": "jp-01",
"server": "entry.example.com",
"server_port": 8443,
"password": "替换为机场提供的密码",
"tls": { "enabled": true, "server_name": "entry.example.com" }
},
{ "type": "direct", "tag": "direct" }
],
"route": {
"rules": [
{ "action": "sniff" },
{ "protocol": "dns", "action": "hijack-dns" },
{ "ip_is_private": true, "outbound": "direct" },
{ "rule_set": ["geosite-cn", "geoip-cn"], "outbound": "direct" }
],
"rule_set": [
{
"tag": "geosite-cn",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-cn.srs",
"download_detour": "proxy"
},
{
"tag": "geoip-cn",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs",
"download_detour": "proxy"
}
],
"final": "proxy",
"auto_detect_interface": true,
"default_domain_resolver": "dns-direct"
},
"experimental": {
"cache_file": { "enabled": true }
}
}
逐段解释
log:日志
level 常用 warn 或 info,排错时临时改成 debug 能看到每条连接的匹配过程,用完记得改回,否则日志量很大。timestamp 为日志加上时间,便于对照问题发生的时刻。
dns:域名解析
servers 列出可用的 DNS 服务器,每个都有自己的 tag。上面的写法中,dns-remote 是通过代理访问的加密 DNS,dns-direct 是国内公共 DNS。rules 决定哪些域名用哪个服务器:命中国内域名规则集的走 dns-direct,其余由 final 指定的 dns-remote 解析。
这样做的目的是:国内网站拿到离你最近的国内 IP,海外网站的解析请求不暴露给本地运营商。DNS 服务器的声明方式在较新版本中改为按 type 区分,旧配置中的 address 写法可能被标记为弃用,请以对应版本文档为准。DNS 是否泄露可以按 DNS 泄露怎么检测和修复自测。
inbounds:流量从哪里进来
| 入站类型 | 作用 | 常见场景 |
|---|---|---|
tun |
创建虚拟网卡,接管系统全部流量 | 手机客户端、电脑 TUN 模式 |
mixed |
在本地端口同时提供 HTTP 与 SOCKS 代理 | 给浏览器或终端手动指定代理 |
http / socks |
单一协议的本地代理端口 | 兼容老程序 |
auto_route 让 sing-box 自动设置系统路由,strict_route 用于防止流量绕过 TUN 泄露出去。mixed 入站务必只监听 127.0.0.1,监听 0.0.0.0 会把代理端口暴露给局域网其他设备。
outbounds:流量从哪里出去
出站分三类:节点(vless、trojan、shadowsocks、hysteria2 等,对应机场的每一个服务器)、直连(direct)和分组。分组中最常用的两个:
selector:手动选择,客户端“分组”页面里切换节点靠的就是它;urltest:定时测速,自动选择延迟最低的节点。
分组的 outbounds 列表里写的是其他出站的 tag,分组也可以嵌套分组,比如上面的 proxy 里包含了 auto。各协议的区别可以看 VLESS + Reality 是什么。
route:分流规则
rules 从上到下依次匹配,命中第一条即停止,都没命中则交给 final 指定的出站。较新版本中,规则除了指定 outbound,还可以通过 action 执行动作:sniff 用于探测连接中的真实域名,hijack-dns 用于接管 DNS 请求,reject 用于拦截。旧版本中用专门的 block、dns 出站实现类似功能,这类写法在新版本中已被弃用。
rule_set 声明规则集来源,remote 类型会从网址下载并缓存。default_domain_resolver 指定解析节点服务器域名时使用的 DNS,指向直连 DNS 可以避免“要连代理先要解析、要解析又要先连代理”的死循环。规则模式的概念对比见规则、全局、直连模式有什么区别。
如何校验与运行配置
在电脑上从 SagerNet/sing-box 的 GitHub Releases 下载对应系统的命令行程序(Windows 选文件名含 windows-amd64 或 windows-arm64 的压缩包,文件名以实际版本为准),然后执行:
Windows PowerShell:
.\sing-box.exe version
.\sing-box.exe check -c .\config.json
.\sing-box.exe format -w -c .\config.json
# 以管理员身份运行 PowerShell 后再启动,TUN 入站需要管理员权限
.\sing-box.exe run -c .\config.json
macOS / Linux:
sing-box version
sing-box check -c config.json
sing-box format -w -c config.json
sudo sing-box run -c config.json
check 没有任何输出表示通过;有报错时会指出具体字段。运行后可以通过 mixed 端口验证出口:Windows 用 curl.exe -x http://127.0.0.1:2080 -s https://chatgpt.com/cdn-cgi/trace,macOS / Linux 把 curl.exe 换成 curl,输出的 loc= 即为出口地区。
看报错定位是哪一段的问题
客户端或命令行报错时,报错信息里通常会带上出问题的字段路径,比如 outbounds[3]、route.rules[2]。对照下表,可以快速判断问题出在哪一段、该找谁解决:
| 报错特征 | 所在部分 | 常见原因 | 处理方法 |
|---|---|---|---|
| 提示未知字段、字段已弃用 | 任意部分 | 配置写法与内核版本不匹配 | 按对应版本文档迁移,或更新订阅获取新配置 |
| 提示找不到某个 tag | outbounds / route / dns | 引用了不存在的出站或服务器 | 检查 tag 拼写,确认被引用的对象已定义 |
| 启动失败,提示权限不足 | inbounds | TUN 入站需要管理员或 root 权限 | 以管理员身份运行,或改用 mixed 入站 |
| 端口被占用 | inbounds | 其他程序占用了 mixed 端口 | 更换 listen_port 或关闭冲突程序 |
| 规则集下载失败 | route.rule_set | 下载时需要代理但代理尚未连通 | 检查 download_detour 指向的出站是否可用 |
| 能启动但全部连接超时 | outbounds | 节点参数错误、订阅已到期 | 更新订阅,换节点对比测试 |
| 部分网站解析失败 | dns | DNS 服务器不可达或规则顺序不当 | 检查 DNS 服务器的 detour 与规则 |
一个实用的判断思路是:配置由机场下发时,字段类报错多半是版本不匹配,应先升级客户端并更新订阅;配置是自己手写的,就逐段检查 tag 引用和 JSON 语法。 如果只有某一类节点连不上,先看它使用的协议是否被当前内核版本支持;全部节点都超时的情况,可以按节点超时解决方法逐项排查。
在手机客户端里使用自己的配置
校验通过的配置文件也可以直接在手机上使用:在官方客户端的“配置”页面新建配置时,类型选择本地(Local),然后导入文件或粘贴配置内容,具体入口以实际版本为准。手写配置不会自动更新节点,适合节点固定的场景;使用机场订阅时仍建议选择远程配置,让节点和规则随订阅同步。手机端通常只需要保留 TUN 入站,mixed 入站可以删掉,以减少不必要的本地监听端口。
常见误区与注意事项
- 校验和运行用的版本不一致:用新版命令行校验通过,不代表旧版手机客户端能加载。校验时尽量使用与客户端相同版本的内核。
- tag 拼写不一致:分组、规则、DNS 里引用的 tag 必须与定义完全一致,大小写也要一致。
- JSON 格式错误:多一个逗号、少一个括号都会导致整份配置无法加载,
format命令能帮你快速定位。 - 把订阅内容贴到公开场合求助:配置中包含节点地址、UUID 和密码,求助前务必替换掉。
- 长期开 debug 日志:日志文件增长很快,还会记录大量访问信息。
请遵守当地法律法规与服务条款,合理使用 sing-box 等网络工具。
常见问题
普通用户需要自己写 sing-box 配置吗?
一般不需要。机场提供的 sing-box 订阅就是一份完整配置,导入即可使用。看懂结构的意义在于排错:知道报错指向哪一段,才能判断是版本问题、节点问题还是规则问题。
为什么同一份配置在新版客户端里报错?
sing-box 在大版本之间会弃用或调整字段,例如路由规则改用 action 写法、DNS 服务器改为按 type 声明等。旧配置在新内核中可能报未知字段或已弃用,需要按对应版本文档迁移,或让机场更新配置。
配置里的 tag 有什么用?
tag 是每个入站、出站、DNS 服务器和规则集的名字,其他地方通过 tag 引用它们。例如分组的 outbounds 列表、路由规则的 outbound 字段都要写已存在的 tag,写错就会启动失败。
怎么检查配置文件有没有写错?
在电脑上下载同版本的 sing-box 命令行程序,执行 sing-box check -c config.json,没有输出即表示通过;执行 sing-box format -w -c config.json 可以顺便整理缩进。
TUN 入站和 mixed 入站要同时写吗?
手机客户端通常只需要 TUN 入站,由系统 VPN 接管流量;电脑上如果还想让某些程序通过本地端口使用代理,可以再加一个只监听 127.0.0.1 的 mixed 入站,两者可以共存。
本文最后更新于 。网络服务与 AI 平台政策变化较快,如发现信息过时,欢迎通过联系我们反馈。