手写本地配置:从最小结构到完整配置
按官方配置结构一步步加:log、dns、inbounds、outbounds、route;先跑通最小版,再加分组、DNS 与规则。
先看整体结构
sing-box 的配置是 JSON,顶层按官方文档分成几大块,新手先记住常用的五块就够了:
{
"$schema": "https://sing-box.sagernet.org/schema.json",
"log": {},
"dns": {},
"inbounds": [],
"outbounds": [],
"route": {}
}
log:日志级别与输出,排查时才需要调高,平时保持默认即可。dns:域名解析用哪个服务器、按什么规则走,详见《DNS 与规则集》。inbounds:本机应用怎么进来,常见的是混合入站(mixed)和 TUN 入站。outbounds:流量出去走哪个出站,可以是直连、代理出站,也可以是分组。route:按域名、IP、端口等规则,把流量指给出站;没有命中任何规则时,走route.final指定的默认出站,空着就走第一个出站。
$schema 这一行不是必填,但加上后,支持 JSON Schema 的编辑器会在你写错字段名时提示,写配置时建议保留。
第一步:最小可跑版
不要一上来就写一百行。先写一个只有入站、一个代理出站、一个直连出站、一条默认路由的版本,确认能启动、能访问目标,再往上加东西。骨架长这样,里面带 YOUR_ 的地方都要换成你自己的值,不要照抄:
{
"log": { "level": "info" },
"inbounds": [
{ "type": "mixed", "tag": "mixed-in", "listen": "127.0.0.1", "listen_port": 2080 }
],
"outbounds": [
{ "type": "direct", "tag": "direct" },
{ "type": "shadowsocks", "tag": "proxy-out", "server": "YOUR_SERVER", "server_port": 8388, "method": "YOUR_METHOD", "password": "YOUR_PASSWORD" }
],
"route": { "final": "proxy-out" }
}
这个骨架只说明结构:mixed 入站监听本地 2080,默认出站走代理出站。实际协议字段按你用的协议来,Shadowsocks、Trojan、VLESS 等字段各不相同,不要把一种协议的字段套到另一种协议上。
写完先做两件事:
sing-box check -c config.json
sing-box format -w -c config.json
check 是校验,报错会指出第一处问题;format 是格式化,帮你把缩进、换行理顺,排查时看着更清楚。校验通过再启动,校验不通过不要靠重启去碰运气。
第二步:加分组
流量不需要永远只走一个出站。分组出站长这样:
selector:手动选,图形客户端里会出现一个可点选的组。urltest:按配置里的测试规则自动选,适合有多个同类出站时自动挑延迟低的。
分组的出站列表里填的是其他出站的 tag,tag 写错一个字母,分组就找不到那个出站,启动或运行时会报错。建议 tag 起得短而唯一,例如 proxy-out、direct,不要用中文空格或容易混淆的相似名。
第三步:加 DNS 与路由
DNS 和路由是两套规则,经常被混成一套:
- DNS 规则决定“这个域名用哪个 DNS 服务器解析”,在
dns.rules里写。 - 路由规则决定“解析完、连接时走哪个出站”,在
route.rules里写。
顺序上,路由规则按列表顺序匹配,命中第一条就停,不会继续往下找。所以要把更具体的规则放前面、宽泛的兜底规则放后面;把“全部走直连”放第一条,后面的代理规则就永远命中不了。规则集(rule-set)的写法见 DNS 与规则集那篇。
第四步:一次只改一处
手写配置最常见的失败不是“不会写”,而是“一次改太多”:
- 每次只改一处,改完
check一次、启动验证一次。 - 出问题先看第一条错误,字段名拼错、括号没闭合、tag 对不上,这三类占大多数。
- 改之前把能跑的版本另存一份,改坏了能立刻回滚,而不是在坏版本上继续修。
- 密码、密钥、令牌不要写进公开分享的配置示例里,分享前先把这些字段换成占位符。