sing-box 配置:读懂 JSON 的五个顶层字段
先看懂骨架,再去查具体字段,比背配置有用得多。
sing-box 配置文件由几个顶层字段构成:log(日志)、dns(解析)、inbounds(入站,流量从哪进)、outbounds(出站,流量往哪出)、route(路由,什么流量走哪个出站)。
最小骨架示例
{
"log": { "level": "info" },
"inbounds": [
{ "type": "mixed", "tag": "mixed-in", "listen": "127.0.0.1", "listen_port": 7890 }
],
"outbounds": [
{
"type": "trojan",
"tag": "proxy",
"server": "<服务器地址>",
"server_port": 443,
"password": "<你的密码>",
"tls": { "enabled": true, "server_name": "<伪装域名>" }
},
{ "type": "direct", "tag": "direct" }
],
"route": {
"final": "proxy"
}
}各字段含义
- inbounds
- 本地入口。mixed 提供 HTTP/SOCKS 混合端口;tun 是虚拟网卡入口。
- outbounds
- 出口列表。每个节点是一个出站,direct 是直连。
- route
- 路由规则与兜底出站(final)。可以引用规则集。
- dns
- 解析服务器与策略,常与路由配合。
怎么扩展
- 加 tun 入站:让整台设备流量经过 sing-box,需要权限。
- 加规则:在 route 里写规则,把域名或 IP 指向 direct 或 proxy。
- 多个节点:用 selector 或 urltest 类型的出站把它们组织起来。
route 里怎么写规则
route 部分有两个关键字段:rules 是一条条规则,final 是兜底出站。每条规则由"匹配条件"和"动作或出站"组成,匹配条件可以是域名、域名后缀、IP 段、规则集等。规则同样是按顺序匹配的,命中后就不再往下看,所以顺序依然重要。
{
"route": {
"rules": [
{ "ip_is_private": true, "outbound": "direct" },
{ "domain_suffix": ["example.com"], "outbound": "direct" }
],
"final": "proxy"
}
}用 selector 与 urltest 管理多个节点
当有多个节点时,不要在规则里直接指向某一个,而是先把它们放进一个 selector(手动选择)或 urltest(自动测速)出站,规则指向这个组即可。这样要换节点,只需要在组里切换,不需要改规则。selector 适合你想自己挑选,urltest 适合让内核按延迟自动选,两者也可以嵌套使用。
tun 入站的几个关键字段
| 字段 | 作用 |
|---|---|
| type | 入站类型,tun 表示虚拟网卡 |
| address | 为虚拟网卡分配的地址 |
| auto_route | 自动设置系统路由,把流量导向虚拟网卡 |
| stack | 网络栈实现方式 |
具体的字段名称与取值,请以所用版本的官方文档为准;不同版本之间可能有调整。
常见报错对照
| 报错或现象 | 常见原因 |
|---|---|
| 启动即报字段未知 | 字段已在新版本里被改名或弃用 |
| 提示找不到出站 | 规则里引用的 outbound 名称与定义不一致 |
| 规则集加载失败 | 地址不可达,或格式与声明不符 |
| 配置无法解析 | JSON 少了逗号、多了逗号或括号不匹配 |
从 Clash 配置迁移到 sing-box:思路对照
如果你熟悉 Clash 系的配置,转到 sing-box 时,可以用"对应关系"来理解:Clash 的 proxies 对应 sing-box 的 outbounds;proxy-groups 对应 selector 与 urltest 类型的出站;rules 对应 route 里的 rules;rule-providers 对应 rule_set;dns 与 tun 各自有对应的字段。理解了对应关系,迁移时你就不是"从零学一门新语言",而是"把同样的概念换一种写法"。
| Clash 概念 | sing-box 概念 |
|---|---|
| proxies | outbounds(具体的节点) |
| proxy-groups | outbounds 中的 selector / urltest |
| rules | route.rules |
| rule-providers | route.rule_set |
| mixed-port | inbounds 中的 mixed |
| tun | inbounds 中的 tun |
需要强调的是,两种配置的字段与行为并不完全等价,迁移后要逐项验证,而不是机械翻译。
关于「sing-box配置」的常见问题
JSON 里能写注释吗?
标准 JSON 不支持注释。想临时禁用某段,需要删掉或另存备份。
配置写完怎么验证?
先用 check 命令检查合法性,再运行观察日志。
JSON 配置很容易写错,有什么办法吗?
用编辑器的 JSON 校验功能,并配合内核自带的检查命令,两道检查能拦住大多数低级错误。
sing-box路由规则怎么写?
路由规则写在配置的 route 部分,按顺序匹配,可以按域名、IP 段、规则集或进程指定出站。写完用命令行的检查命令或客户端的校验功能验证,再重载配置。