sing-box简介
sing-box是一个当下流行的快速、可定制和通用的代理平台,可用于创建网络代理服务器、客户端和透明代理。支持当下主流的代理协议,而且对于新协议新特性的支持也非常快。sing-box的配置使用config.json文件,里面的参数较多,同时sing-box也在不断优化和升级,参数在不断调整变化,不少新手配置起来多少还是有点障碍,一些机场主的配置也存在不少问题甚至是错误的。本文把sing-box的配置进行抽丝剥茧,详细讲解包括客户端和服务器端的配置。由于内容比较枯燥和相对专业,并非适合所有人阅读和自行配置。
哪些人适合:
- 具备一定计算机软件、网络基础的。至少要会编辑json格式文件
- 打算自己配置客户端(和|或)服务器端的
- 想详细了解软件运行配置的
哪些人不适合:
- 想开盖即食的,比如直接使用机场订阅,不喜欢自己配置折腾的
- 无探索尝试精神的
- 无开源精神,以此牟利的。
客户端config配置
下面以客户端的config.json为例进行讲解(sing-box v1.10.x),配置全文如下client config.json:
config.json
{
"dns": {
"servers": [
{
"tag": "google",
"address": "tls://dns.google",
"address_resolver": "alidns",
"detour": "site"
},
{
"tag": "alidns",
"address": "223.5.5.5",
"detour": "direct"
},
{
"tag": "block",
"address": "rcode://success"
}
],
"rules": [
{
"rule_set": "geosite-category-ads-all",
"server": "block"
},
{
"rule_set": [
"geosite-gfw"
],
"server": "google"
}
],
"final": "alidns",
"disable_cache": true,
"strategy": "prefer_ipv4"
},
"inbounds": [
{
"type": "tun",
"address": [
"172.20.0.1/30"
],
"auto_route": true,
"sniff": true
}
],
"outbounds": [
{
"type": "direct",
"tag": "direct"
},
{
"type": "hysteria2",
"tag": "site",
"server": "site.abc.com",
"server_port": 16060,
"password": "yourpassWD",
"tls": {
"enabled": true
}
},
{
"type": "block",
"tag": "block"
},
{
"type": "dns",
"tag": "dns-out"
}
],
"route": {
"rules": [
{
"protocol": "dns",
"outbound": "dns-out"
},
{
"rule_set": [
"geoip-cn"
],
"outbound": "direct"
},
{
"rule_set": [
"geosite-gfw"
],
"outbound": "site"
},
{
"rule_set": "geosite-category-ads-all",
"outbound": "block"
}
],
"rule_set": [
{
"tag": "geoip-cn",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs",
"download_detour": "site"
},
{
"tag": "geosite-gfw",
"type": "remote",
"format": "binary",
"url": "https://github.com/MetaCubeX/meta-rules-dat/raw/refs/heads/sing/geo/geosite/gfw.srs",
"download_detour": "site"
},
{
"tag": "geosite-category-ads-all",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-category-ads-all.srs",
"download_detour": "site"
}
],
"final": "direct",
"auto_detect_interface": true
},
}
config.json主要包括7部分:
1 2 3 4 5 6 7 8 9
| { "log": {}, "dns": {}, "endpoints": [], "inbounds": [], "outbounds": [], "route": {}, "experimental": {} }
|
这7部分见名知意,log为日志,dns为域名解析,endpoints可以先不管它,inbounds为入站,outbounds为出站,route为数据路由,experimental是一些实验性内容,其实就是其他设置。
其中最核心的就是inbounds,outbounds,route,只要这3部分就可以实现基本功能运行,但是dns解析会有问题,有可能造成“dns泄露”,达不到最优效果。所以要实现基本功能最好是包含dns。我重点讲解这4个部分。
dns
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| "dns": { "servers": [ { "tag": "google", "address": "tls://dns.google", "address_resolver": "alidns", "detour": "site" }, { "tag": "alidns", "address": "223.5.5.5", "detour": "direct" }, { "tag": "block", "address": "rcode://success" } ], "rules": [ { "rule_set": "geosite-category-ads-all", "server": "block" }, { "rule_set": [ "geosite-gfw" ], "server": "google" } ], "final": "alidns", "disable_cache": true, "strategy": "prefer_ipv4" },
|
dns这里包含了3部分,定义dns服务器,dns的规则以及一些其他参数。其中servers里定义了3个服务器,分别是google,alidns和block(默认)。每一个的解释如下:
1 2 3 4 5 6
| { "tag": "google", #dns服务器的名字,用于其他地方调用这个服务器 "address": "tls://dns.google", #服务器的地址,这里采用的是tls协议 "address_resolver": "alidns", #由于服务器地址里设置的是域名而非IP地址,所以对于这个域名也需要进行解析,这里指定用什么服务器进行解析,这里指定的是alidns "detour": "site" #dns解析请求通过哪个出站节点出去,这里指定从site出站节点 },
|
1 2 3 4 5
| { "tag": "alidns", #dns服务器名字。google dns服务器名字的解析就是调用的这个 "address": "223.5.5.5", #服务器的地址 "detour": "direct" #dns解析请求通过哪个出站节点出去,这里指定直接出去,不走任何VPN节点 },
|
rules定义了进行dns解析的规则,满足什么条件用什么dns进行解析。
1 2 3 4 5 6 7 8 9 10 11 12
| "rules": [ { "rule_set": "geosite-category-ads-all", #指定规则geosite-category-ads-all(广告网站) "server": "block" #指定满足规则的域名用什么dns服务器进行解析,这里指定用block解析,也就是屏蔽 }, { "rule_set": [ #指定这条规则使用的是规则集 "geosite-gfw" #规则集geosite-gfw,即gfw屏蔽的域名 ], "server": "google" #指定满足规则的域名用什么dns服务器进行解析,这里指定用google来解析 } ],
|
最后是dns这部分的一些其他设置:
1 2 3
| "final": "alidns", #指定默认用什么dns服务器进行解析,也就是没有匹配到任何dns规则的域名用什么服务器解析,这里设定的是alidns "disable_cache": true, #是否缓存dns解析记录,根据需要自行设置 "strategy": "prefer_ipv4" #域名解析策略,指定域名解析是IPv4优先(prefer_ipv4),IPv6优先(prefer_ipv6),只解析IPv4(ipv4_only),只解析IPv6(ipv4_only)
|
inbounds
1 2 3 4 5 6 7 8 9 10
| "inbounds": [ { "type": "tun", #定义入站类型,这里定义的是tun "address": [ #定义tun端口的ip地址及掩码 "172.20.0.1/30" ], "auto_route": true, #定义是否自动添加路由,tun模式推荐设置true,sing-box自动帮你添加路由,除非很熟悉路由及添加方式否则推荐设置true "sniff": true #定义是否嗅探流量,选择true。 } ],
|
inbounds定义了sing-box可以接收的数据入站的类型,这里只定义了tun模式,还可以定于多种方式,具体可参考sing-box网站。这里的客户端例子之所以选择tun是因为配置相对简单,实现也比较容易,不会再配置nftables/iptables,而且tun模式在客户端也是实现客户端流量获取最全的方法。客户端还有TProxy,Redirect,不过还是推荐tun。
outbounds
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| "outbounds": [ { "type": "direct", "tag": "direct" }, { "type": "hysteria2", "tag": "site", "server": "site.abc.com", "server_port": 16060, "password": "yourpassWD", "tls": { "enabled": true } }, { "type": "block", "tag": "block" }, { "type": "dns", "tag": "dns-out" } ],
|
outbounds定义了sing-box发出流量的类型,可以采用哪些协议发出流量。这个例子里outbounds定义了hysteria2、direct(直接转发流量)、block(阻断流量)、dns(处理dns流量)。后3个都比较简单,是默认的一些出站,也就是定义类型(type)及名字(tag),hysteria2解释如下:
1 2 3 4 5 6 7 8 9 10
| { "type": "hysteria2", #定义类型是hysteria2 "tag": "site", #定义这个出站的名字,会被其他地方调用 "server": "site.abc.com", #这个出站的服务器地址 "server_port": 16060, #服务器端口 "password": "yourpassWD", #密码 "tls": { #tls配置 "enabled": true #启用tls } },
|
不同的出入站具体的参数不尽相同,具体可以参考sing-box网站各个协议的详细说明。
route
route是负责路由的,决定什么类型的流量怎么处理,从哪个outbound出去,以及一些规则集。route包含3部分:规则(rules),规则集(rule-set),一些其他参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| "rules": [ { "protocol": "dns", #指定协议,这里指定的是dns协议 "outbound": "dns-out" #满足协议的流量从dns-out出去 }, { "rule_set": [ #指定规则集 "geoip-cn" #指定geoip-cn,即cn的ip地址集合 ], "outbound": "direct" #满足条件的流量从direct出去,即直接转发 }, { "rule_set": [ #指定规则集 "geosite-gfw" #指定geosite-gfw,即gfw屏蔽的网站 ], "outbound": "site" #满足条件的流量从sitet出去,即通过outbounds的site节点转发 }, { "rule_set": "geosite-category-ads-all", #指定规则集合,这里是广告网站 "outbound": "block" #满足条件的流量从block转发,即阻止 } ],
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| "rule_set": [ #定义规则集合 { "tag": "geoip-cn", #规则集合的名字,便于其他地方调用 "type": "remote", #获取方式,从远端获取 "format": "binary", #格式为二进制文件 "url": "https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs", #规则集合的url "download_detour": "site" #从哪个节点获取规则文件,这里是从site节点 }, { "tag": "geosite-gfw", "type": "remote", "format": "binary", "url": "https://github.com/MetaCubeX/meta-rules-dat/raw/refs/heads/sing/geo/geosite/gfw.srs", "download_detour": "site" }, { "tag": "geosite-category-ads-all", "type": "remote", "format": "binary", "url": "https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-category-ads-all.srs", "download_detour": "site" } ],
|
其他部分的说明:
1 2
| "final": "direct", #规则都不匹配时流量最后的转发节点,这里是直接转发 "auto_detect_interface": true #自动侦测端口,当入站使用tun模式时为避免出现环路需要设置成true
|
服务器端config配置
服务器端的配置相对客户端还更加简单,config.json配置文件如下server config.json:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| { "log": { #log部分可以不要,但作为服务器推荐还是保留日志 "disabled": false, "level": "error", "output": "./log", "timestamp": true }, "inbounds": [ #server的inbounds是为客户端提供服务的,接收客户端发送过来的数据 { "type": "hysteria2", #协议类型为hysteria2 "tag": "hy2-in", #这个入站的名字 "listen": "::", #侦听地址 "listen_port": 16060, #侦听端口 "users": [ #用户密码 { "password": "yourpassWD" } ], "tls": { #tls配置 "enabled": true, "alpn": [ "h3" ], "certificate_path": "../cert/cert.pem", #证书 "key_path": "../cert/private.key" } } ], "outbounds": [ { "type": "direct", "tag": "direct" }, { "type": "block", "tag": "block" }, ], "route": { "rules": [ { "ip_is_private": true, #私网地址block "outbound": "block" }, { "rule_set": [ "geoip-cn", #目的IP为CN "geosite-category-ads-all" #目的网站为广告网站 ], "outbound": "block" #阻塞 } ], "rule_set": [ #规则集 { "tag": "geoip-cn", "type": "remote", "format": "binary", "url": "https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs", "download_detour": "direct" }, { "tag": "geosite-category-ads-all", "type": "remote", "format": "binary", "url": "https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-category-ads-all.srs", "download_detour": "direct" } ], "final": "direct" #未匹配的规则默认以direct转发流量 } }
|
sing-box支持的协议比较多,大家可以根据需要自行在inbounds和outbounds添加,注意服务器端和客户端协议的对应关系。使用上述config.json就可以完成服务器端和客户端sing-box的配置,辅助性质的参数可参照sing-box网站说明并结合需要自行添加。