手写本地配置:从最小结构到完整配置

按官方配置结构一步步加: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 对不上,这三类占大多数。
  • 改之前把能跑的版本另存一份,改坏了能立刻回滚,而不是在坏版本上继续修。
  • 密码、密钥、令牌不要写进公开分享的配置示例里,分享前先把这些字段换成占位符。

访问官网 →