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
  },
}
Plain text

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网站说明并结合需要自行添加。