VLESS 部署指南(sing-box)

采用 VLESS + Reality + xtls-rprx-vision 方案:无需域名和证书,伪装为正常 HTTPS 流量。需要 sing-box 1.14.0 及以上(与本系列其他篇一致;Reality 本身更早可用)。字段说明见 VLESS inboundTLS / Reality

一、部署前准备

  • 一台使用 systemd 的 Linux VPS,具备 root 或 sudo 权限;官方安装脚本覆盖 deb / rpm / Arch / OpenWrt
  • 云安全组和本机防火墙放行 TCP 443,且未被其他程序占用——只改安全组不够;
  • 出站方向可正常访问 443 端口(Reality 握手需要转发到目标站点)。

二、安装 sing-box

bash
curl -fsSL https://sing-box.app/install.sh | sh
sing-box version

输出中的版本号必须 ≥ 1.14.0。若要钉死版本:

bash
curl -fsSL https://sing-box.app/install.sh | sh -s -- --version 1.14.0

脚本会下载 sing-box、安装 systemd 服务(以 sing-box 用户运行)并创建 /etc/sing-box/

三、生成密钥和用户标识

1. 生成 Reality 密钥对

bash
sing-box generate reality-keypair

输出示例:

text
PrivateKey: YOUR_PRIVATE_KEY
PublicKey:  YOUR_PUBLIC_KEY
  • PrivateKey 填入服务端配置;
  • PublicKey 填入客户端配置。

2. 生成用户 UUID

bash
sing-box generate uuid

不要手编「好记」的 UUID。

3. 生成 short_id

short_id 是十六进制字符串,解码后不能超过 8 字节(即最多 16 个十六进制字符,长度必须为偶数)。一般用 OpenSSL 生成 4 字节(8 个字符):

bash
openssl rand -hex 4

超过 16 个十六进制字符会导致配置校验失败。把三项输出记录好,下一步分别填入服务端和客户端配置。

四、写入服务端配置

将以下配置写入 /etc/sing-box/config.json

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 即可):

bash
sudo chmod 600 /etc/sing-box/config.json

伪装站点怎么选

server_namehandshake.server 决定 Reality 借用哪个真实站点完成握手:

  • 选国外大型、支持 TLS 1.3 和 HTTP/2 的 HTTPS 站点,最好与 VPS 地区较近;
  • 不要使用自己控制或容易关停的站点;
  • 常见选择:www.microsoft.comwww.samsung.comwww.lovelive-anime.jp 等;
  • VPS 必须能出站访问该站点,选完先在 VPS 上 curl -I 验证。

server_namehandshake.server 与客户端的 server_name 必须完全一致。

五、检查并启动

bash
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-pager

check 没有输出且退出码为 0 表示配置通过。status 应为 active (running);否则查看日志:

bash
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 数组里,不能把出站对象单独当成完整配置文件。

json
{
  "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. 服务启动失败

bash
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. 客户端无法连接

依次确认:

  1. systemctl statusactive (running)
  2. 云安全组和系统防火墙放行 TCP 443;
  3. 客户端 uuidflowserver_namepublic_keyshort_id 与服务端完全一致;
  4. flow 两端一致:要么都启用,要么都不启用;
  5. 客户端与服务端系统时间相差过大也会导致握手失败。可用 tls.reality.max_time_difference 放宽容差(官方示例为 1m,省略时的默认值以当前版本文档为准);
  6. VPS 能正常出站访问伪装站点:
bash
curl -I --max-time 10 https://www.microsoft.com

如果出站被墙或被拦截,更换 handshake.server 为可访问的站点。

3. 可以同时启用多用户吗

可以。在 users 数组中添加多个用户,每个用户使用独立 UUID:

json
"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