采用 VLESS + Reality + xtls-rprx-vision 方案:无需域名和证书,伪装为正常 HTTPS 流量。需要 sing-box 1.14.0 及以上(与本系列其他篇一致;Reality 本身更早可用)。字段说明见 VLESS inbound 与 TLS / Reality。
一、部署前准备
- 一台使用 systemd 的 Linux VPS,具备 root 或
sudo权限;官方安装脚本覆盖 deb / rpm / Arch / OpenWrt; - 云安全组和本机防火墙放行 TCP
443,且未被其他程序占用——只改安全组不够; - 出站方向可正常访问 443 端口(Reality 握手需要转发到目标站点)。
二、安装 sing-box
curl -fsSL https://sing-box.app/install.sh | sh
sing-box version输出中的版本号必须 ≥ 1.14.0。若要钉死版本:
curl -fsSL https://sing-box.app/install.sh | sh -s -- --version 1.14.0脚本会下载 sing-box、安装 systemd 服务(以 sing-box 用户运行)并创建 /etc/sing-box/。
三、生成密钥和用户标识
1. 生成 Reality 密钥对
sing-box generate reality-keypair输出示例:
PrivateKey: YOUR_PRIVATE_KEY
PublicKey: YOUR_PUBLIC_KEYPrivateKey填入服务端配置;PublicKey填入客户端配置。
2. 生成用户 UUID
sing-box generate uuid不要手编「好记」的 UUID。
3. 生成 short_id
short_id 是十六进制字符串,解码后不能超过 8 字节(即最多 16 个十六进制字符,长度必须为偶数)。一般用 OpenSSL 生成 4 字节(8 个字符):
openssl rand -hex 4超过 16 个十六进制字符会导致配置校验失败。把三项输出记录好,下一步分别填入服务端和客户端配置。
四、写入服务端配置
将以下配置写入 /etc/sing-box/config.json:
{
"log": {
"level": "info",
"timestamp": true
},
"inbounds": [
{
"type": "vless",
"listen": "::",
"listen_port": 443,
"users": [
{
"uuid": "CHANGE_THIS_TO_GENERATED_UUID",
"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": "CHANGE_THIS_TO_PRIVATE_KEY",
"short_id": [
"CHANGE_THIS_TO_SHORT_ID"
]
}
}
}
],
"outbounds": [
{
"type": "direct"
}
]
}使用 xtls-rprx-vision 时不要启用 multiplex。
必须修改的字段
| 配置项 | 填入内容 |
|---|---|
users[0].uuid |
sing-box generate uuid 的输出 |
tls.reality.private_key |
sing-box generate reality-keypair 输出的 PrivateKey |
tls.reality.short_id |
openssl rand -hex 4 的输出(偶数长度,最多 16 个十六进制字符) |
tls.server_name / tls.reality.handshake.server |
用于伪装的目标站点域名 |
listen |
默认 ::。机器禁用 IPv6 时改为 0.0.0.0 |
设置配置文件权限(官方服务以 sing-box 用户运行,600、属主 root 即可):
sudo chmod 600 /etc/sing-box/config.json伪装站点怎么选
server_name 和 handshake.server 决定 Reality 借用哪个真实站点完成握手:
- 选国外大型、支持 TLS 1.3 和 HTTP/2 的 HTTPS 站点,最好与 VPS 地区较近;
- 不要使用自己控制或容易关停的站点;
- 常见选择:
www.microsoft.com、www.samsung.com、www.lovelive-anime.jp等; - VPS 必须能出站访问该站点,选完先在 VPS 上
curl -I验证。
server_name、handshake.server 与客户端的 server_name 必须完全一致。
五、检查并启动
sudo sing-box check -c /etc/sing-box/config.json
sudo systemctl enable sing-box
sudo systemctl restart sing-box
sudo systemctl status sing-box --no-pagercheck 没有输出且退出码为 0 表示配置通过。status 应为 active (running);否则查看日志:
sudo journalctl -u sing-box --output cat -e六、服务管理
| 操作 | 命令 |
|---|---|
| 查看状态 | sudo systemctl status sing-box --no-pager |
| 启动 | sudo systemctl start sing-box |
| 停止 | sudo systemctl stop sing-box |
| 重启 | sudo systemctl restart sing-box |
| 禁用开机自启 | sudo systemctl disable sing-box |
| 查看最近日志 | sudo journalctl -u sing-box --output cat -e |
| 实时查看日志 | sudo journalctl -u sing-box --output cat -f |
七、客户端配置参考
下面是一份可直接 sing-box check 的最小客户端配置:本地 mixed 入站 + 一个出站。出站必须放在 outbounds 数组里,不能把出站对象单独当成完整配置文件。
{
"log": {
"level": "info",
"timestamp": true
},
"inbounds": [
{
"type": "mixed",
"listen": "127.0.0.1",
"listen_port": 1080
}
],
"outbounds": [
{
"type": "vless",
"tag": "vless-out",
"server": "YOUR_SERVER_IP",
"server_port": 443,
"uuid": "CHANGE_THIS_TO_GENERATED_UUID",
"flow": "xtls-rprx-vision",
"tls": {
"enabled": true,
"server_name": "www.microsoft.com",
"utls": {
"enabled": true,
"fingerprint": "chrome"
},
"reality": {
"enabled": true,
"public_key": "CHANGE_THIS_TO_PUBLIC_KEY",
"short_id": "CHANGE_THIS_TO_SHORT_ID"
}
}
}
]
}本机 SOCKS / HTTP 代理为 127.0.0.1:1080。
要点:
| 客户端字段 | 说明 |
|---|---|
server |
VPS 公网 IP |
uuid |
与服务端 users[0].uuid 一致 |
flow |
必须同为 xtls-rprx-vision,两端不能只有一端启用 |
tls.server_name |
与服务端 server_name 一致 |
tls.reality.public_key |
服务端密钥对中的 PublicKey |
tls.reality.short_id |
服务端 short_id 列表中的其中一项(客户端是字符串,服务端是数组) |
utls.fingerprint |
模拟的浏览器 TLS 指纹,常用 chrome |
八、故障排查
1. 服务启动失败
sudo sing-box check -c /etc/sing-box/config.json
sudo journalctl -u sing-box -n 100 --no-pager重点排查:
private_key是否完整复制,注意结尾不要带引号或空格;short_id是否为偶数长度、且解码后不超过 8 字节的十六进制字符串(超过 16 个字符会校验失败);- 443 端口是否被其他程序占用(
sudo ss -lntp | grep ':443'); - UUID 是否为有效格式;
- 是否在 Vision 下误开了
multiplex; - 禁用 IPv6 的机器是否仍在听
::(改为0.0.0.0)。
2. 客户端无法连接
依次确认:
systemctl status为active (running);- 云安全组和系统防火墙放行 TCP 443;
- 客户端
uuid、flow、server_name、public_key、short_id与服务端完全一致; flow两端一致:要么都启用,要么都不启用;- 客户端与服务端系统时间相差过大也会导致握手失败。可用
tls.reality.max_time_difference放宽容差(官方示例为1m,省略时的默认值以当前版本文档为准); - VPS 能正常出站访问伪装站点:
curl -I --max-time 10 https://www.microsoft.com如果出站被墙或被拦截,更换 handshake.server 为可访问的站点。
3. 可以同时启用多用户吗
可以。在 users 数组中添加多个用户,每个用户使用独立 UUID:
"users": [
{
"uuid": "USER1_UUID",
"flow": "xtls-rprx-vision"
},
{
"uuid": "USER2_UUID",
"flow": "xtls-rprx-vision"
}
]所有用户共用同一组 Reality 密钥和 short_id,修改配置后重启服务生效。
4. 为什么没有证书申请环节
Reality 模式下证书由伪装目标站点的握手链路提供,服务端只保管自己的密钥对,因此无需域名、无需 ACME——既省去证书续期,也降低了被主动探测识别的概率。
九、安全建议
- UUID、Reality 密钥对、
short_id全部用生成命令出,不要手编弱值; config.json权限600;私钥只留在服务端,公钥给客户端;xtls-rprx-vision不要搭配multiplex;- 伪装站选 VPS 能出站访问、且不是你自己控制的站点;
- 定期升级 sing-box,升级后重新执行
sing-box check。