一. 前言
1. 作者的一些话
本系列将开启一个全新的教程,教程偏向一般肯独立思考、有接受大篇幅的信息理解能力的用户。
本文将着重于sing-box文档的讲解,以及其他注意事项的结合教学。
跟随本教程,你可以从头到尾理解并编写属于自己的sing-box配置文件,玩转sing-box。
二. JSON数据格式的轻量理解
1. 为什么要了解JSON数据格式?
请点击上方的sing-box文档-配置部分的链接,查看该网页的第一句话:

“sing-box使用JSON作为配置文件格式”
因此我们要想完全理解sing-box配置,势必需要先简单了解JSON数据格式是什么,以及它的构成。
2. JSON数据格式的基本概念
- JSON 是一种数据格式,不是编程语言。
- 起源于 JavaScript 对象字面量的语法,但现在独立存在,几乎所有语言都有解析库。
- 常见用途:配置文件、API 数据传输、数据库存储(如 MongoDB)。
听起来对你来说可能有点抽象对嘛,但只要记住,JSON不属于编程语言,它只是一种数据交换格式。因为结构清晰、轻量级,容易被机器和人读取,且各个编程语言都有JSON解析库,被广泛使用。
3. JSON的数据类型
JSON共支持6种数据类型
① 字符串(String)
- 必须用双引号
""包裹起来 - 支持转义字符:
\\n,\\t,\\\\,\\"
例如:
"love"
"apple\\nmelon"
字符串(String)数据在sing-box配置文件中大量使用,如sing-box日志等级就使用字符串作为值:
"trace"
"debug"
"info"
"warn"
"error"
"fatal"
"panic"
② 数字(Number)
- 支持整数、浮点数
- 不支持
NaN、Infinity
例如:
42
3.1415
-100
数字(Number)数据在sing-box配置文件中大量使用,最常见的就是端口值,如下的443:
"server_port": 443
③ 布尔值(Boolean)
true或false
这个没什么好说的,布尔值只有如上两种。在sing-box中,常用于表示某功能的开启或关闭,如TUN模块启用自动路由:
"auto_route": true
④ 空值(null)
- 表示空、无值
- 仅有一个null
在sing-box配置文件中,这个值未见使用。
⑤ 对象(Object)
- 无序的“键值对”集合
<aside> 💡
什么是“键值对”?
- 键(key):就像一个“名字”或者“标签”,用来标识某个数据。
- 值(value):对应的数据内容,可以是字符串、数字、布尔、null、对象、数组。
两者组合在一起,叫做 键值对。
如下就是一个基础的键值对,sing-box配置文件内大部分都是由键值对构成。
"type": "vless"
</aside>
- 用 花括号
{}包裹起来 - 键(key)必须是字符串,值(value)可以是任意 JSON 类型
- 对象是可以嵌套使用的
- 同一个对象中的多个键值对,除最后一个以外,其余的末尾要加
,
最典型的一个对象示例:
{
"type": "vless",
"tag": "vless-out",
"server": "example.com",
"server_port": 12345,
"uuid": "A1B4A7EB-64AF-4747-B5C3-B2BB1DE2CE9D"
}
嵌套使用的对象示例(其中TLS部分就是在对象中嵌套使用对象):
{
"type": "hysteria2",
"tag": "hy2-out",
"server": "example.com",
"server_port": 12345,
"password": "A1B4A7EB-64AF-4747-B5C3-B2BB1DE2CE9D",
"tls": {
"enabled": true,
"server_name": "example.com",
"insecure": false
},
"up_mbps": 50,
"down_mbps": 200
}
⑥ 数组(Array)
- 有序的值列表
- 用 方括号
[]
一个基础的数组:
[1, 2, 3, "apple", false, null]
数组数据类型在sing-box配置文件中,常见于DNS规则和路由规则、节点组处,当添加多个数据时,就会使用数组(如下的outbounds处):
{
"tag": "url-test",
"type": "selector",
"outbounds": [
"node1",
"node2",
"node3",
"node4",
"node5"
],
"default": "node1"
}
了解到这里,你就已经对JSON格式有了一个基本的了解。
接下来,我们将开始了解sing-box的主要模块和工作流程。
三. sing-box主要模块
1. 10大模块的作用了解
{
"log": {},
"dns": {},
"ntp": {},
"certificate": {},
"endpoints": [],
"inbounds": [],
"outbounds": [],
"route": {},
"services": [],
"experimental": {}
}
//请从这里开始,使用代码编辑器,建议VS Code,一边观看教程一边跟随修改配置文件,加深理解。
- Log模块
这个模块主要是控制sing-box核心运行时的日志输出方式和等级。
此模块可以省略不写。
如若不写,sing-box默认将开启trace日志等级,将运行时的一切日志都输出出来。
- DNS模块
这个模块主要是负责sing-box核心使用的DNS服务器,如何处理DNS解析结果,DNS分流规则和其他DNS行为。
此模块可以省略不写。
如若不写,sing-box将直接把DNS解析交给操作系统完成,由操作系统控制。
- NTP模块
<aside> 💡
什么是NTP?
NTP (Network Time Protocol,网络时间协议) 是TCP/IP协议中应用层的一个协议,用于客户端与服务端进行时钟同步,包括时间、时区等。
</aside>
这个模块主要是负责sing-box核心的内置时间,有些协议,如TLS/Shadowsocks/VMess等依赖正确的时间工作,此模块可以让这些协议在操作系统时间错误的情况下依然可以使用。
此模块可以省略不写。
如若不写,sing-box将直接使用系统时间。
- Certificate模块
这个模块主要是控制sing-box核心信任的证书范围。
💡什么是证书?
证书是现代互联网的安全基石,它就像网络世界里的“身份证”,用来证明某个网站、个人或组织的身份是否真实可信,并且在数据传输中起到加密、验证、完整性保护的作用。
在sing-box中,这个模块主要是负责TLS证书。
TLS证书与所有使用了TLS安全层的协议有关,Vless+TLS/VMess+TLS/Hysteria等。
sing-box此模块可以自定义增减证书的信任范围。
此模块可以省略不写。
如若不写,sing-box直接使用系统受信任的 CA 证书。
- Endpoints模块
这个模块是sing-box核心用于使用WireGuard和Tailscale协议的模块。
原来WireGuard模块隶属于Outbound模块,sing-box 1.12.0开始并入Endpoints模块,并同时增加了Tailscale的支持。
此模块根据需要决定是否写。
如若不写,sing-box将不启用WireGuard和Tailscale的支持。
- Inbound模块
这个模块是sing-box核心用于确定如何接受流量进入的模块,也就是常说的入站模块。
sing-box作为服务端使用时,这个模块常用于配置指定加密协议的服务端入站监听,比如shadowsocks/VMess/Vless/Hysteria等。
sing-box作为客户端使用时,这个模块常用于配置标准socks/HTTP代理,用于接管系统代理流量,或配置TUN接口全局接管操作系统流量。
此模块必须写。
- Outbound模块
这个模块是sing-box核心用于确定流量如何离开的模块,也就是常说的出站模块。
sing-box作为服务端使用时,这个模块一般只开启一个直连出站,即sing-box不经任何处理直接把数据发送出去。如果有链式代理的情况,也可以配置转发的下一个目标。
sing-box作为客户端使用时,这个模块常用于配置指定加密协议的客户端出站,比如shadowsocks/VMess/Vless/Hysteria等。
此模块必须写。
- Route模块
这个模块是sing-box核心用于确定流量应该如何路由、使用哪一个出站的模块,也就是常说的路由模块。
这个模块一般用于分流流量、确定默认的网络接口。
此模块可以不写。
如若不写,sing-box将使用内建默认路由(一般是第一个可用的出站)。
- Services模块
这个模块是sing-box核心额外支持的一些服务。
目前支持Derp服务器、伪造systemd-resolved DBUS服务和SSM API。
该模块作为一般代理用途时极少使用。
此模块根据需要决定是否写。
- Experimental模块
这个模块是sing-box核心的实验性功能模块。
Clash API和V2ray API就在此模块提供,用于便捷通过WebUI进行出站控制。
此模块根据需要决定是否写,但考虑到这是内核教程,在拥有多节点时,切换节点必须依赖该模块Clash API功能,所以此处标记为必须写。
2.sing-box 模块间的工作流程
对于仅仅使用代理的普通用户来说,上述10个模块并不都是需要使用的。
实际上,我们只需要DNS、Inbound、Outbound、Route和Experimental模块即可,这些模块在一般处理代理数据的工作流程是:

对于sing-box 1.11.0之前的版本,由于DNS协议嗅探在Inbound模块处,且有独立的特殊DNS出站,故带有DNS模块的流程为:

对于sing-box 1.11.0之后的版本,由于DNS协议嗅探在Route模块处,且不再具有独立的特殊DNS出站,故带有DNS模块的流程为:

3. Log模块详解
结构
{
"log": {
"disabled": false,
"level": "info",
"output": "box.log",
"timestamp": true
}
}
如上为整个Log模块的内容。
这个字段没什么内容,难度较低,没有二级功能,因此我们直接插入总配置即可:
{
"log": {
"disabled": false,
"level": "info",
"output": "box.log",
"timestamp": true
},
"dns": {},
"ntp": {},
"certificate": {},
"endpoints": [],
"inbounds": [],
"outbounds": [],
"route": {},
"services": [],
"experimental": {}
}
字段
- disabled 这个字段是控制sing-box是否在运行时输出日志的,如果设置为ture,则禁用日志,后面的level、output、timestamp就不再有效。
- level 这个字段是日志等级,控制sing-box运行时输出的日志范围,有以下等级可选:
tracedebuginfowarnerrorfatalpanictrace等级输出的内容最多,panic输出的内容最少,如果没有指示这个字段,sing-box默认为trace。 - output 这个字段设置日志输出的位置,如果这个字段不为空,sing-box就会把日志输出到一个文件而不是在控制台中,注意,日志输出路径必须具有写权限。
- timestamp 添加时间到日志每一行,设置为true的话每一行日志都有时间,反之没有。
总配置
比如常见记录日志的配置,等级为debug,不需要单独输出日志文件,每一行日志需要时间,那么只需要修改为:
{
"log": {
"disabled": false,
"level": "debug",
"timestamp": true
},
"dns": {},
"ntp": {},
"certificate": {},
"endpoints": [],
"inbounds": [],
"outbounds": [],
"route": {},
"services": [],
"experimental": {}
}
至此,你就写好了Log模块哦~
恭喜你迈出了第一步!那后面对你来说就不会太难~

Comments NOTHING