sing-box 配置文件结构入门:入站、出站、路由与 DNS 详解
sing-box 配置文件入门:用表格和示例说明 JSON 配置中 log、dns、inbounds、outbounds、route 各部分分别负责什么,入站和出站如何配合,路由规则如何决定流量走向,并给出一份只演示结构的简短示例,帮助你读懂机场下发的 sing-box 配置、定位报错字段。
简要回答 sing-box 配置是一个 JSON 对象,核心由四部分组成:inbounds 决定流量从哪里进来,outbounds 决定流量从哪里出去,route 按规则把入站流量分配给出站,dns 负责域名解析。读懂这四块,就能看懂大多数机场下发的配置,具体字段以官方文档为准。
sing-box 的配置文件是一个 JSON 对象,最核心的是四个部分:**inbounds(入站)**负责接收流量,**outbounds(出站)**负责把流量发出去,**route(路由)**决定每条连接交给哪个出站,dns 负责域名解析。理解“入站 → 路由 → 出站”这条主线,再加上 DNS,就能读懂绝大多数配置。以下内容只讲结构和概念,具体字段请以 sing-box 官方文档为准。
顶层结构一览
| 字段 | 作用 | 新手是否需要关注 |
|---|---|---|
| log | 日志级别与输出方式 | 排错时调高级别即可 |
| dns | DNS 服务器与解析规则 | 需要,影响分流和泄漏 |
| inbounds | 本地监听方式,如 TUN、mixed 端口 | 需要了解 |
| outbounds | 节点、直连、选择器等出口 | 需要了解 |
| route | 分流规则与默认出口 | 需要了解 |
| experimental | 缓存、外部面板等实验性功能 | 一般不用改 |
inbounds:流量从哪里进来
入站定义 sing-box 以什么方式接收流量,常见类型有:
- tun:创建虚拟网卡,接管设备上几乎所有流量,手机客户端和电脑 TUN 模式都依赖它。
- mixed:在本地开一个同时支持 HTTP 与 SOCKS 的端口,浏览器或终端可以手动指向它。
在手机图形客户端里,TUN 入站通常由应用配合系统 VPN 接口完成,TUN 的原理可以参考 Clash Verge TUN 模式说明,概念是相通的。
outbounds:流量从哪里出去
出站就是“出口”。机场节点本身就是出站,此外还有几类特殊出站:
- direct:直连,不经过代理。
- selector:手动选择器,把多个节点组合在一起,由你在界面上切换。
- urltest:自动测速选择,按延迟挑选节点。
- 各协议节点:如 vless、trojan、hysteria2、shadowsocks 等,协议差异见 Hysteria2、VLESS 与 Trojan 对比。
每个出站都有唯一的 tag,其他部分通过 tag 引用它。
route:规则决定走向
路由由一组 rules 和一个 final 组成。连接进来后,sing-box 自上而下匹配规则,命中就交给规则指定的出站;都没命中则交给 final。规则可以按域名、IP、进程、规则集等条件匹配。
dns:解析也要分流
DNS 部分定义可用的 DNS 服务器以及“哪些域名用哪个服务器解析”。配置不当会出现国内网站变慢、DNS 泄漏或分流失效。常见思路是国内域名用国内 DNS,其他域名通过代理解析,部分配置还会启用 Fake-IP。原理和排查见 DNS 问题解决指南 与 Fake-IP 和 Redir-Host 的区别。
结构示例
下面是一份只用于演示层级关系的精简示例,节点信息为占位内容,不能直接使用。不同版本的字段写法可能有调整,请以官方文档为准。
{
"log": { "level": "info" },
"dns": { "servers": [], "rules": [] },
"inbounds": [
{ "type": "tun", "tag": "tun-in", "address": ["172.19.0.1/30"], "auto_route": true }
],
"outbounds": [
{ "type": "selector", "tag": "proxy", "outbounds": ["node-a", "direct"] },
{ "type": "vless", "tag": "node-a", "server": "example.com", "server_port": 443, "uuid": "your-uuid" },
{ "type": "direct", "tag": "direct" }
],
"route": {
"rules": [{ "ip_is_private": true, "outbound": "direct" }],
"final": "proxy",
"auto_detect_interface": true
}
}
读这份示例时可以沿着一条连接走一遍:流量经 tun-in 进入,route 检查是否为局域网地址,是则走 direct,否则交给 final 指定的 proxy 选择器,最终由你选中的 node-a 发出。
报错时怎么对照结构定位
sing-box 启动失败时,日志通常会指出出错的位置,可以按下面的思路对照:
- 提示某个字段未知或已弃用:多半是配置写法与当前内核版本不匹配,先更新订阅,再对照官方文档的迁移说明。
- 提示找不到某个 tag:路由规则、选择器或 DNS 引用了不存在的出站名称,检查拼写是否一致。
- 提示端口被占用:mixed 等入站监听的端口被其他程序占用,换一个端口或关闭冲突程序。
- 能启动但部分网站打不开:问题更可能在 route 或 dns,先检查规则顺序和 DNS 服务器是否可达。
想直接上手客户端,可以看 sing-box Android 教程 或 sing-box 专题。
常见问题
sing-box 配置文件必须自己写吗?
不需要。大多数用户直接导入机场提供的 sing-box 订阅即可,了解结构主要是为了看懂报错、做少量自定义,比如增加直连规则。
为什么同一份配置换了版本就报错?
sing-box 更新较快,部分字段会被调整或弃用。遇到启动失败时先看日志中提示的字段名,再对照官方文档的迁移说明修改,或者让机场更新订阅。
tag 有什么用?
tag 是每个入站、出站的名字。路由规则、选择器和 DNS 设置都通过 tag 引用对应的对象,名字写错就会找不到目标。