sing-box 是一个高性能、支持多协议(如 VLESS、VMess、Shadowsocks、Trojan、SOCKS 等)的网络代理工具,常用于科学上网、代理分流等场景,兼容多种前端、支持多平台
sing-box 不分客户端与服务端,其部署方式与 shadowsocks 类似,根据需要选择合适的配置文件进行部署
下面实践如何快速地在 debian12 服务器上部署一个 vless 协议的 sing-box 代理服务
sing-box 下载地址
- https://github.com/SagerNet/sing-box/releases/tag/v1.11.14
选择合适版本,这里我选择二进制的 amd64 版本,如下:
mkdir -p /opt/sing-box
cd /opt/sing-box
wget https://github.com/SagerNet/sing-box/releases/download/v1.11.14/sing-box-1.11.14-linux-amd64.tar.gz
tar -xvf sing-box-1.11.14-linux-amd64.tar.gz
cd sing-box-1.11.14-linux-amd64
接下来创建一个配置文件 config.json
,内容如下:
{
"log": {
"level": "info"
},
"inbounds": [
{
"type": "vless",
"listen": "::",
"listen_port": 443,
"users": [
{
"uuid": "621d1745-382d-40e4-87cf-23e1b17a7b57",
"flow": "xtls-rprx-vision"
}
],
"tls": {
"enabled": true,
"server_name": "www.microsoft.com",
"reality": {
"enabled": true,
"handshake": {
"server": "www.microsoft.com",
"server_port": 443
},
"private_key": "",
"short_id": ["12345678","23456789","34567890"]
}
}
}
],
"outbounds": [
{
"type": "direct"
}
]
}
以上配置需要修改:
uuid
:替换为你自己的 UUID,使用./sing-box generate uuid
命令生成private_key
:替换为你自己的 private_key,可以使用./sing-box generate reality-keypair
命令生成(公钥也要记住,在客户端需要填写)short_id
:替换为你自己的 short_id,8 位数即可,可以多放几个,用于伪装握手时识别正确的流量
以上参数说明:
type
:协议类型,这里使用 vlesslisten
:监听地址,::
表示监听所有地址listen_port
:监听端口,这里使用 443users
:用户列表,这里只配置了一个用户,使用 UUID 进行身份验证tls
:TLS 配置,启用 TLS 并配置相关参数,server_name
为域名,要避免使用 cloudflare 的域名(敏感),建议使用微软的域名或者其他在国内比较正常的域名reality
:启用 Reality 协议,配置握手服务器、私钥和 short_idoutbounds
:出站配置,这里使用 direct 直连
Xray Reality Vision 伪装原理如下:
- 利用 TLS(HTTPS)握手过程,模仿真实网站(如 www.microsoft.com)进行 TLS 指纹伪装,不需要目标站证书,客户端和服务端通过私钥/short_id 验证身份,防 DPI
server_name
等同于目标网站,外部行为与访问目标站一致,达到不可区分效果
通过伪造与真实网站一致的 TLS 参数和握手,做到高度伪装流量,提升代理隐匿性和防检测能力
运行方法:
./sing-box run -c config.json
后台运行可以采用 systemd 管理,创建一个服务文件 /etc/systemd/system/sing-box.service
,内容如下:
[Unit]
Description=Sing-box Proxy Service
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/sing-box/sing-box-1.11.14-linux-amd64
ExecStart=/opt/sing-box/sing-box-1.11.14-linux-amd64/sing-box run -c /opt/sing-box/sing-box-1.11.14-linux-amd64/config.json
Restart=on-failure
RestartSec=3s
LimitNOFILE=65535
StandardOutput=append:/var/log/sing-box.log
StandardError=append:/var/log/sing-box.log
ProtectSystem=full
ProtectHome=yes
NoNewPrivileges=yes
PrivateTmp=yes
[Install]
WantedBy=multi-user.target
如果对速度有要求,那么还需要打开 /etc/sysctl.conf
文件,添加以下内容:
# 1 客户端TCP Fast Open / 2 服务端TCP Fast Open / 3 同时启用客户端和服务器的TCP Fast Open
net.ipv4.tcp_fastopen=3
# 允许TCP Time-Wait状态的插槽被重新使用。这对于高并发服务器非常有用
net.ipv4.tcp_tw_reuse=1
# 增加了处于监听状态的套接字队列的最大长度。当服务器接收到大量并发连接请求时,这个参数可以防止新连接被拒绝
net.core.somaxconn=10240
# 设置了所有套接字的接收缓冲区最大值(以字节为单位)。更大的缓冲区可以容纳更多的数据,从而提高网络吞吐量,尤其是在高带宽和高延迟网络中
net.core.rmem_max=16777216
# 设置了所有套接字的发送缓冲区最大值(以字节为单位)。与rmem_max类似,更大的发送缓冲区可以提高数据发送效率
net.core.wmem_max=16777216
# 定义了TCP接收缓冲区的最小值、默认值和最大值
net.ipv4.tcp_rmem=4096 87380 16777216
# 定义了TCP发送缓冲区的最小值、默认值和最大值。
net.ipv4.tcp_wmem=4096 65536 1677721
# 设置默认的排队规则为 Fair Queue (FQ)。FQ是一种流量调度算法,它为每个流提供公平的带宽分配,有助于减少延迟和提高交互性
net.core.default_qdisc=fq
# 将TCP拥塞控制算法设置为 BBR (Bottleneck Bandwidth and RTT)
net.ipv4.tcp_congestion_control=bbr
# 启用TCP时间戳。尽管这会增加一点点开销,但它可以帮助操作系统更有效地处理乱序数据包和重复ACK,提高高吞吐量连接的性能
net.ipv4.tcp_timestamps=1
# 启用选择性确认 (SACK)。SACK允许接收方告诉发送方哪些数据段是丢失的,从而避免不必要的重传,提高恢复丢失数据包的效率
net.ipv4.tcp_sack=1
# 启用TCP窗口缩放。对于高带宽长延迟网络,更大的TCP窗口可以允许发送方在收到确认之前发送更多的数据,从而提高吞吐量
net.ipv4.tcp_window_scaling=1
# 增加可用临时端口的范围。对于高并发代理服务器,扩大可用端口范围可以避免端口耗尽问题。您可以根据实际情况调整起始和结束端口号。
net.ipv4.ip_local_port_range=1024 65535
# 增加Netfilter连接跟踪表的最大条目数。对于高并发代理服务器,维护大量并发连接需要更大的连接跟踪表
net.nf_conntrack_max=655360
以上参数中,以下几个是最重要的(从高到低):
net.ipv4.tcp_congestion_control=bbr
BBR (Bottleneck Bandwidth and RTT) 是 Google 开发的拥塞控制算法,旨在最大限度地利用带宽并最小化延迟net.core.default_qdisc=fq
与 BBR 配合使用效果更佳。Fair Queue (FQ) 作为默认排队规则,能够为每个数据流提供更公平的带宽分配,有助于减少单个连接对整体性能的影响,并降低延迟net.ipv4.tcp_fastopen=3
启用 TCP Fast Open,可以减少连接建立的延迟,尤其在高延迟网络中效果明显net.core.somaxconn=10240
增加监听套接字队列长度,允许更多的并发连接请求net.ipv4.tcp_tw_reuse=1
允许 TIME-WAIT 状态的套接字被重用,减少端口耗尽问题