使用sing-box快速搭建一个属于自己的抗封VLESS+Reality代理
前言
作为一个通用代理平台,sing-box 协议覆盖更广,DNS 和分流结合得更紧密,TUN 和系统级代理能力也更完整,拿来给自己搭一个私人小通道再合适不过啦(´▽`)
这篇教程就带大家从零开始,在自己的海外服务器上把 sing-box 部署起来。全程只用官方的手动安装方式,不装 s-ui 之类的配置面板,清清爽爽,每行配置都能看懂~
官方文档放在这里,遇到不认识的字段随时可以去翻:
版本小约定:下面的服务端配置在 sing-box 1.11 及以上版本都能跑;客户端配置用到了 1.14 才有的顶层
http_clients和新版 DNS 写法,所以客户端内核请用 1.14 及以上(老内核需要改动几处,文末有说明)。
一、安装 sing-box
本文不使用 s-ui 或其他配置面板,直接按官方文档手动安装 sing-box。运行安装命令:
1 | curl -fsSL https://sing-box.app/install.sh | sh |
跑完之后敲一下版本命令:
1 | sing-box version |
能打印出版本号,就说明这个小家伙已经安安静静住进你的服务器啦。官方安装脚本会顺手把 systemd 服务也注册好,之后直接用 systemctl 管理就行。
默认配置文件在 /etc/sing-box/config.json,记住这个路径哦,下一步就要改它。
二、生成节点 UUID 以及 Reality 密钥对
Reality 需要准备三样小东西:密钥对、UUID,还有 short_id。
1. 生成 Reality 密钥对
打开终端运行:
1 | sing-box generate reality-keypair |
你会得到类似这样的输出:
1 | PrivateKey: kPf5rxxxxxxBE1w |
这是 Reality 要用到的密钥对,先把它复制到剪贴板备用。两个值的用途可别记混啦:
PrivateKey(私钥):填在服务端配置里,自己收好,不要外传PublicKey(公钥):填在客户端配置里
小提醒:客户端填的是 PublicKey 公钥,不是私钥哦,这一点好多教程都容易写错。
2. 生成 UUID
1 | sing-box generate uuid |
或者用系统自带的小工具也一样:
1 | cat /proc/sys/kernel/random/uuid |
会得到一串类似 xxxxx3b69-9xax-41be-axf3-5dxxxx0efbf8 的字符串,这是 uuid,同样复制到剪贴板备用。
3. 生成 short_id
1 | sing-box generate rand --hex 8 |
short_id 是一串十六进制字符,最长 8 字节(也就是 16 个十六进制字符),它会参与 Reality 握手时的身份校验。留空(写 "")也能用,但填上更稳妥,服务端和客户端必须填得一模一样。
三、修改服务端默认配置文件
sing-box 的默认配置文件是 /etc/sing-box/config.json,我们用 vim 打开它:
1 | vim /etc/sing-box/config.json |
把里面的内容清空。今天我们要搭建的是 VLESS + Reality,可以直接使用下面这个模板,并把其中的占位符替换成你刚生成的内容:
1 | { |
sing-box 自带的 JSON 解析器支持
//注释和尾随逗号,所以上面这些注释不会让它报错(不过就别再拿其他 JSON 校验工具去检查啦,标准 JSON 是不认注释的)。
关于伪装域名(也就是 handshake.server),挑选时记住这几点:
- 必须是支持 TLS 1.3 + HTTP/2 的网站
- 挑大厂的大流量站点,和你的服务器之间延迟低一些更好
- 别用你自己的域名,也别用已经被标记过、或你所在网络根本打不开的域名
顺手可以验证一下它合不合格:
1 | openssl s_client -connect www.learn.microsoft.com:443 -tls1_3 -alpn h2 </dev/null 2>/dev/null | grep -E "Protocol|ALPN" |
看到 Protocol : TLSv1.3 和 ALPN protocol: h2 就可以放心啦。
顺便说说 alpn 为什么写
h2、http/1.1:Reality 的握手走的是 TCP,而h3是给 QUIC/UDP 用的,把它塞进这个列表属于常见的小坑,容易让握手对不上。
四、启动 sing-box
先做一次配置语法检查:
1 | sing-box check -c /etc/sing-box/config.json |
如果没有任何输出,就代表语法检查通过,可以进入下一步。
启动服务:
1 | systemctl start sing-box |
如果需要开机自启,运行:
1 | systemctl enable sing-box |
看看运行状态:
1 | systemctl status sing-box |
输出里存在 Active: active (running) 即为运行成功。以后每次改完配置,都记得先检查再重启:
1 | sing-box check -c /etc/sing-box/config.json && systemctl restart sing-box |
万一起不来,就到日志里找原因:
1 | journalctl -u sing-box -o cat -e |
五、客户端连接
打开 sing-box 客户端,添加配置文件(需要 1.14 及以上内核),粘贴下面的模板,并修改其中所有占位符:
1 | { |
需要替换的地方一共这几处,别漏掉:
server:你的服务器 IPserver_port:服务端 sing-box 监听的端口uuid:服务端填的那个 UUIDpublic_key:Reality 的 PublicKey 公钥short_id:和服务端一致的 short_idserver_name:和服务端保持一致(模板里已经填好了)
替换完保存启用,就可以用它出去看看世界啦~(๑•̀ㅂ•́)و✧
这份客户端配置里还有几个小细节,知道了会更安心:
dns里的remote服务器走select出站,也就是借用你的节点来解析;local则直连阿里 DNS,国内域名用国内 DNS 解析会更快。http_clients里定义的那个客户端,默认会被用作远程rule_set的下载通道(第一个即默认,不需要额外指定),所以规则集也能顺顺利利拉下来。- 分流部分:
geoip-cn命中走直连,geosite-cn、ext-cn-domain命中用国内 DNS 解析,广告域名和 Chrome 的 DoH 域名则由AdGuardSDNSFilter、chrome-doh这两个规则集拦掉。 - 那两条
clash_mode规则要在客户端里切换模式(global/direct)才会生效;如果想手动切换模式,可以在experimental里补一个clash_api。
六、几个小贴士
- 端口要放行:云服务商的安全组和服务器自身的防火墙都得放行对应的 TCP 端口,比如:
1
ufw allow 443/tcp
- 443 被占用:先用
ss -tlnp | grep :443看看是谁占了(比如 nginx),不想动它就把 sing-box 换成 8443 之类的端口,客户端记得同步改。 - 关于
listen: "::":它表示同时监听 IPv4 和 IPv6;如果你的服务器彻底关掉了 IPv6,可以改成0.0.0.0。 - 老内核要改哪里:客户端内核低于 1.14 时,需要删掉顶层的
http_clients整段(远程规则集会退回用默认出站去下载),DNS 规则里的"action": "predefined"也要改回旧写法。 - 速度慢的话:可以在服务端顺手开一下 BBR:
1
echo -e "net.core.default_qdisc=fq\nnet.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf && sysctl -p
到这里,一个属于自己的 VLESS + Reality 小节点就搭好啦!全程不用证书、不用域名、不用面板,干干净净的(≧▽≦)
配置里最容易踩坑的还是 PublicKey 和 short_id 两边要一致,其他字段照抄就行。祝你用得开心~


