教你如何使用sing-box
sing-box 的使用教程虽然很多,但都是着重讲解如何安装、使用,很少涉及如何部署 sing-box 服务器,节点添加也是直接通过订阅链接,完全不考虑自建服务器以及自有节点的应用场景。事实上 sing-box 之所以强大,恰恰在于它的适用性,通过它可以胜任多种应用场景,搭建符合个人使用习惯的代理平台,这才是它被称为”瑞士军刀”原因。
本文将详细讲解如何使用 sing-box,包括服务器的搭建、客户端的配置以及 GUI 客户端的使用等。
sing-box是什么
Sing-Box 是一个开源的网络代理工具,类似于 V2Ray 和 Xray,旨在帮助用户绕过网络限制、提高网络隐私和安全性。它支持多种代理协议,允许用户在不同的网络环境下通过代理服务加速网络连接,突破地理限制,并保护数据隐私。
Sing-Box 特点:
- 多协议支持:Sing-Box 支持各种代理协议,如 Shadowsocks、VLESS、VMess 等,适用于不同的应用场景。
- 高性能:与其他代理工具类似,Sing-Box 设计优化了性能,使其能够在不同网络环境下保持高效运行。
- 跨平台支持:Sing-Box 支持多种操作系统,如 Windows、Linux、macOS,以及在路由器上运行,适合网络爱好者和开发者进行网络代理配置。
- 灵活配置:用户可以自定义配置文件,实现灵活的网络代理管理,支持不同的网络需求。
- 隐私保护:通过加密传输和代理协议,Sing-Box 提供了更高的网络隐私和安全性。
Sing-Box 非常适合那些需要提高网络连接效率、保护隐私或绕过防火墙的用户。
sing-box 官方网站:https://sing-box.sagernet.org/zh/
Sing-Box工作原理
sing-box 定位是通过代理平台,可以作为服务端部署应用,也可以作为客户端为主机提供连接代理功能。
sing-box 主要由 Go 语言开发,可执行文件不区分服务端和客户端,通过配置文件来设置其工作模式。sing-box 将数据流量统一划分为入站和出站两种,分别支持相应的流量类型。
入站配置文件结构如下:
{ "inbounds": [ { "type": "", "tag": "" } ] }
其中”type”键表示入站流量的类型,而”tag”是该类型流量对应的标签。入流量可以支持多种类型,不同流量类型设置不同标签即可。
入站流量类型”type”的取值如下:
类型值 | 类型类别 | 类型说明 |
---|---|---|
direct | Direct | 入站是一个隧道服务器 |
mixed | Mixed | 入站是一个 socks4, socks4a, socks5 和 http 服务器 |
socks | SOCKS | 入站是一个 socks4, socks4a 和 socks5 服务器 |
http | HTTP | 入站是一个 http 服务器 |
shadowsocks | Shadowsocks | 入站是一个 shadowsocks 服务器 |
vmess | VMess | 入站是一个 vmess 服务器 |
trojan | Trojan | 入站是一个 trojan 服务器 |
naive | Naive | 入站是一个 naive 服务器 |
hysteria | Hysteria | 入站是一个 hysteria 服务器 |
shadowtls | ShadowTLS | 入站是一个 shadowtls 服务器 |
tuic | TUIC | 入站是一个 tuic 服务器 |
hysteria2 | Hysteria2 | 入站是一个 hysteria2 服务器 |
vless | VLESS | 入站是一个 vless 服务器 |
tun | Tun | 入站是一个 tun 服务器 |
redirect | Redirect | 入站是一个 redirect 服务器 |
tproxy | TProxy | 入站是一个 tproxy 服务器 |
定义好流量类型后,sing-box 就可以作为入流量的服务器来工作。
同样的,出站配置文件结构如下:
{ "outbounds": [ { "type": "", "tag": "" } ] }
出站流量类型”type”的取值如下:
类型值 | 类型类别 | 类型说明 |
---|---|---|
direct | Direct | 出站直接发送请求 |
block | Block | 出站关闭所有传入请求 |
socks | SOCKS | 出站是 socks4/socks4a/socks5 客户端 |
http | HTTP | 出站是一个 HTTP 代理客户端 |
shadowsocks | Shadowsocks | 出站是一个 shadowsocks 客户端 |
vmess | VMess | 出站是一个 vmess 客户端 |
trojan | Trojan | 出站是一个 trojan 客户端 |
wireguard | Wireguard | 出站是一个 wireguard 客户端 |
hysteria | Hysteria | 出站是一个 hysteria 客户端 |
shadowtls | ShadowTLS | 出站是一个 shadowtls 客户端 |
tuic | TUIC | 出站是一个 tuic 客户端 |
hysteria2 | Hysteria2 | 出站是一个 hysteria2 客户端 |
vless | VLESS | 出站是一个 vless 客户端 |
tor | Tor | 出站是一个 tor 客户端 |
ssh | SSH | 出站是一个 ssh 客户端 |
dns | DNS | 出站是一个 dns 客户端 |
selector | Selector | 出站是一个出站流量选择器 |
urltest | URLTest | 出站流量是 url 访问测试流量 |
可以看到,sing-box 的出入流量类型并不完全相同,并且对于出入流量的配置就决定了 sing-box 自身的工作模式。假设入流量支持 trajon,而出流量是 direct,则 sing-box 可以理解为 trajon 的服务器;如果入流量支持 trajon,而出流量同样支持 trajon,则 sing-box 可以理解为 trajon 的中继器;如果入流量支持 mixed,而出流量支持 trajon,则 sing-box 可以理解为使用 trajon 协议的本地 socks 和 http 代理,也就是通常意义上的 trajon 客户端了。
通过对出入流量的不同组合,就可以灵活的使用 sing-box,让其充分发挥效能,这也正是 sing-box 的强大之处。
sing-box 支持的协议都是标准协议,这就让 sing-box 可以适配各种服务器及客户端。sing-box 客户端可以连接 sing-box 的服务器也可以连接 Xray 程序部署的服务器,只要客户端的出流量 vless 协议配置正确即可正常工作;同样的,Xray 的客户端也可以连接 sing-box 部署的 vless 服务器,只要 sing-box 的入流量配置同 Xray 客户端的配置匹配即可正常工作。从而大大提升了 sing-box 的适用性。
sing-box 服务器部署
示例将使用 Linux 系统,讲解如何部署一个支持 trajon 和 vless 两种代理协议的 sing-box 服务器。
首先要下载并安装 sing-box。对于 Linux 系统,sing-box 提供了预安装的软件包,分别为 deb 和 rpm 格式,对应了常用的 Linux 发行版。将软件包下载至本机后,使用系统的包管理命令安装即可。
sing-box安装部署
Debian软件仓库安装
sudo curl -fsSL https://sing-box.app/gpg.key -o /etc/apt/keyrings/sagernet.asc sudo chmod a+r /etc/apt/keyrings/sagernet.asc echo "deb [arch=`dpkg --print-architecture` signed-by=/etc/apt/keyrings/sagernet.asc] https://deb.sagernet.org/ * *" | \ sudo tee /etc/apt/sources.list.d/sagernet.list > /dev/null sudo apt-get update sudo apt-get install sing-box # or sing-box-beta
Redhat软件仓库安装
sudo dnf -y install dnf-plugins-core sudo dnf config-manager --add-repo https://sing-box.app/sing-box.repo sudo dnf install sing-box # or sing-box-beta
手动安装
#Debian手动安装 bash <(curl -fsSL https://sing-box.app/deb-install.sh) #Redhat手动安装 bash <(curl -fsSL https://sing-box.app/rpm-install.sh) ArchLinux手动安装 bash <(curl -fsSL https://sing-box.app/arch-install.sh)
预安装版本会在使用 systemd 系统的发行版创建一个系统服务”sing-box.service”,如果没有创建,也可自添加,内容如下:
[Unit] Description=sing-box service Documentation=https://sing-box.sagernet.org After=network.target nss-lookup.target network-online.target [Service] CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_SYS_PTRACE CAP_DAC_READ_SEARCH AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_SYS_PTRACE CAP_DAC_READ_SEARCH ExecStart=/usr/bin/sing-box -D /var/lib/sing-box -C /etc/sing-box run ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure RestartSec=10s LimitNOFILE=infinity [Install] WantedBy=multi-user.target
sing-box 的配置文件为”/etc/sing-box/config.json”,基本格式如下:
{ "log": {}, "dns": {}, "inbounds": [], "outbounds": [], "route": {}, "experimental": {} }
其中:
- log:用于设置日志相关内容
- dns:用于设置 dns 规则
- inbounds:用于设置入站流量
- outbounds:用于设置出站流量
- route:用于设置路由规则
- experimental:用于设置一些实验性功能
sing-box 的配置文件并非全部必须,无内容的配置项可以删除。
对于代理服务器而言,我们不需要设置复杂的 dns 规则和路由规则,只需要设置好出入站流量规则即可正常提供服务。至于日志和实验性功能,则根据需要选择性设置即可。
现在我们修改配置文件,入流量设置支持 vless 和 naive,出流量则直接使用 direct,启用日志功能,全部配置文件内容如下:
{ "log": { "disabled": false, "level": "warn", "timestamp": true }, "inbounds": [ { "type": "vless", "tag": "vless-in", "listen": "::", "listen_port": 1443, "users": [ { "uuid": "uuid_for_vless", "flow": "xtls-rprx-vision" } ], "tls": { "enabled": true, "certificate_path": "path_to_crt_file", "key_path": "path_to_private_key_file" } }, { "type": "naive", "tag": "naive-in", "listen": "::", "listen_port": 2443, "users": [ { "username": "naive_user_name", "password": "naive_password" } ], "tls": { "enabled": true, "certificate_path": "path_to_crt_file", "key_path": "path_to_private_key_file" } } ], "outbounds": [ { "type": "direct" } ] }
示例配置中,为 sing-box 入流量配置了两种协议支持,侦听端口分别是1443和2443,修改配置文件中标红部分的内容为正确值后,就可以正常启动服务了:
# systemctl start sing-box # systemctl status sing-box # netstat -tnlp | grep sing-box
如图所示,sing-box 服务器正常启动,并按照入流量的配置侦听了对应端口,等待相应客户端的连接。
sing-box客户端
sing-box客户端配置
相较作为服务器,sing-box 作为代理客户端的配置则要复杂难懂的多,其主要原因就是要设置 dns 规则和路由规则。设置这些规则的原因也很直接,就是通过规则来匹配流量是否需要代理,从而达到最佳的使用效果。规则多虽然可以细分流量,精准服务,但是其结果就是配置复杂,稍有不慎,配置中存在逻辑问题,就会影响 sing-box 的工作效果,严重时甚至会造成断网、主机宕机等极端情况。
客户端 dns 和 route 的配置示例如下所示:
{ "dns": { "servers": [ { "tag": "remote", "address": "tcp://8.8.8.8", "detour": "proxy" }, { "tag": "local", "address": "223.5.5.5", "detour": "direct" }, { "tag": "block", "address": "rcode://success" }, { "tag": "local_local", "address": "223.5.5.5", "detour": "direct" } ], "rules": [ { "outbound": "any", "server": "local_local" } ], "strategy": "ipv4_only" }, "route": { "auto_detect_interface": true, "rules": [ { "outbound": "dns_out", "protocol": [ "dns" ] }, { "outbound": "block", "network": "udp", "port": [ 135, 137, 138, 139, 5353 ] }, { "outbound": "proxy", "port_range": [ "0:65535" ] } ] } }
从上面的配置文件中,可以清晰的理解 sing-box 的规则逻辑。
首先设置 dns 服务器,每个服务器采用不同的出流量路径,即设置不同的”detour”,其值为出流量类型的”tag”值。设置好该值,则表示访问该 dns 服务器使用该类型的出流量。dns 服务器设置完成后,就可以设置流量 dns 规则,即流量方向和使用的 dns 服务器,规则可以设置多个,匹配上就会生效。
然后设置路由规则,可以理解为定义流量类型匹配条件。例如上面配置中的”outbound”: “proxy”项,如果不设置路由规则,则只知道有一个”tag”为”proxy”的出流量路径,但是什么样的流量可以使用该路径并不知道(特别是当出流量设置多个路径时),这时路由规则”port_range”: [ “0:65535” ]就可以明确指出,连接到本站所有端口的流量都可以使用”proxy”路径,一下就将出口路径了数据流量方向联系了起来。路由规则设置的越精细,则流量控制的就越精准。
现在,假设入流量采用 tun 隧道模式,出流量采用 vless 协议,为 sing-box 客户端配置添加入流量和出流量的配置如下:
"inbounds": [ { "type": "tun", "tag": "tun-in", "interface_name": "singbox_tun", "inet4_address": "172.19.0.1/30", "inet6_address": "fdfe:dcba:9876::1/126", "mtu": 9000, "auto_route": true, "strict_route": true, "stack": "gvisor", "sniff": true } ], "outbounds": [ { "type": "vless", "tag": "proxy", "server": "vless_server", "server_port": vless_server_port, "uuid": "vless_server_uuid", "flow": "xtls-rprx-vision", "packet_encoding": "xudp", "tls": { "enabled": true, "server_name": "vless_server_name", "insecure": false, "utls": { "enabled": true, "fingerprint": "chrome" }, "reality": { "enabled": true, "public_key": "vless_server_public_key", "short_id": "vless_server_short_id" } } }, { "type": "direct", "tag": "direct" }, { "type": "block", "tag": "block" }, { "type": "dns", "tag": "dns_out" } ],
可以看到,出流量设置了不同的出流量路径,可以作为对应的客户端处理对应流量,出流量路径设置了不同的”tag”,供 dns 和 route 配置项使用。
修改以上配置文件的红色部分为正确值,然后将以上全部配置项合成一个 JSON 文件,并加入 log 配置项,即完成了一个采用隧道模式的 sing-box 客户端配置文件。
当然入流量也可以设置其他多种方式,示例使用隧道模式是因为该模式可以截取主机的全部流量,让主机仿佛工作在 VPV 模式下。
现在可以总结一下 sing-box 配置的正确打开方式了,首先确定 sing-box 工作在服务器侧还是客户端侧,然后确定对应的入、出流量类型,即所支持的协议,最后根据出入流量协议类型设置 dns 及路由规则。至于每个协议的具体配置内容,则可以参考官方说明进行配置即可。
sing-box下载
图形界面sing-box客户端下载
sing-box Android客户端
sing-box for Android:https://sing-box.sagernet.org/zh/clients/android/
sing-box iOS/macOS/Apple tvOS客户端
sing-box for Apple platforms:https://sing-box.sagernet.org/zh/clients/apple/
sing-box 具有手机端和 macOS 端的 GUI 客户端,Windows 平台的 GUI 客户端暂时还没有发布,但是 v2rayN 是支持使用 sing-box 内核的,也可以理解为一个 Windows 平台的 GUI 客户端。
本文以 Android 客户端为例,讲解如何使用 sing-box 的 GUI 客户端,并且手动添加客户端配置文件以实现节点添加。
打开 sing-box 应用,点击底部左数第三个图标,进入”Profile”页面,点击底部”+”图标添加节点:
此时会弹出三个选项,分为导入文件、打节点二维码及手动创建三种方式。对于从机场购买的节点,可以直接通过扫描二维码方式导入,对于自建节点或已有客户端配置文件,则可以选择”Create Manually”手动创建。至于文件导入,因为手动创建时也支持从文件中导入,所以建议不使用。
示例使用手机中的配置文件,则点击”Create Manually”:
创建节点配置有多种方式,可以从网上下载,也可以从本机文件中导入,当然也可以直接创建配置文件,然后再编辑配置文件内容手动生成配置。如果从本机导入配置文件,则点击”Import File”按钮,然后选择配置文件进行导入,导入成功后,点击”Create”创建节点文件。
节点文件添加成功后,可以点击该节点配置文件,然后点击”Edit Content”按钮编辑配置文件内容、检查配置项错误以及格式化文件内容等操作。
最后,点击应用底部左数第一个按钮,进入控制台,就会看到所有添加成功的节点,选择节点后,点击底部的启动图标就可以启动节点了:
如果配置文件正确无误,则可以正常启动 sing-box 并代理上网了。
至于 sing-box Android 手机端的其他配置,则可以保持默认即可
总之,sing-box 是功能强大,适用性广的通用代理平台,充分了解它之后,就可以尽情享受无限网络的乐趣了。
Sing-Box 是一款开源的网络代理工具,广泛支持 Shadowsocks、VLESS、VMess 等多种代理协议,旨在提高网络连接速度、绕过地理限制、保护用户隐私。它具备高性能的运行效率,适用于 Windows、Linux、macOS 等多种操作系统,并能在路由器上运行,方便实现全局代理配置。通过灵活的配置选项,用户可以根据具体需求自定义代理管理,满足不同的网络环境需求。Sing-Box 的加密传输功能进一步提高了数据安全性,确保网络通信的隐私保护,特别适合需要突破网络防火墙和保护在线隐私的用户使用。