首页/进阶自建节点/搭建第一个节点:sing-box Reality + VLESS Vision 完整教程
LEVEL 03 · 自主控制

搭建第一个节点:sing-box Reality + VLESS Vision 完整教程

从 Debian、BBR 和官方 APT 安装开始,配置 sing-box Reality + VLESS Vision,启动服务并导入客户端。

本教程使用 sing-box + VLESS + TCP + Reality + Vision 搭建第一个自建节点。Reality 不要求你购买域名或申请 TLS 证书,适合作为第一套可维护的手动部署方案。

下文中的 Vision 指 xtls-rprx-vision 流控,不是一个独立协议。服务端与客户端必须使用同一组 UUID、Reality 公钥、Short ID、端口和 SNI,任何一项不一致都会连接失败。

如果还没有服务器,可先阅读自建节点 VPS 怎么选。建议使用拥有独立公网 IPv4 的 VPS;NAT VPS 也能部署,但必须把外部端口映射到本文的监听端口。

准备服务器:Debian 与 BBR

系统和最低配置

推荐 Debian 12 或 Debian 13、64 位系统。单人节点使用 1 核、512 MB~1 GB 内存即可,硬盘 5 GB 以上。开始前准备:

  • VPS 公网 IPv4 或 IPv6。
  • root 权限,或者能使用 sudo 的账号。
  • 一个未被占用且已在云防火墙放行的 TCP 端口,本文使用 443
  • 一台已安装兼容 VLESS Reality 客户端的电脑或手机。

先登录服务器并更新系统:

ssh root@你的服务器IP
apt update
apt full-upgrade -y
apt install -y curl ca-certificates gnupg openssl

如果 443 已被 Nginx、Caddy 或其他程序占用,可以停止冲突服务,或者稍后在生成器中改用其他端口。检查端口:

ss -lntp | grep :443

没有任何输出表示当前没有程序监听 443。还要在 VPS 服务商的云防火墙,以及 Debian 本机防火墙中放行所选的 TCP 端口。

开启 BBR

Debian 的现代内核已经包含 BBR。先检查当前状态:

sysctl net.ipv4.tcp_congestion_control
sysctl net.core.default_qdisc

写入完整的网络参数配置并立即加载:

cat > /etc/sysctl.d/98-bbr.conf << 'EOF'
fs.file-max                     = 6815744
net.ipv4.tcp_max_syn_backlog    = 8192
net.core.somaxconn              = 8192
net.ipv4.tcp_tw_reuse           = 1
net.ipv4.tcp_abort_on_overflow  = 1
net.core.default_qdisc          = fq
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_no_metrics_save    = 1
net.ipv4.tcp_ecn                = 0
net.ipv4.tcp_frto               = 0
net.ipv4.tcp_mtu_probing        = 0
net.ipv4.tcp_rfc1337            = 1
net.ipv4.tcp_sack               = 1
net.ipv4.tcp_fack               = 1
net.ipv4.tcp_window_scaling     = 1
net.ipv4.tcp_adv_win_scale      = 2
net.ipv4.tcp_moderate_rcvbuf    = 1
net.ipv4.tcp_fin_timeout        = 30
net.ipv4.tcp_rmem               = 4096 87380 67108864
net.ipv4.tcp_wmem               = 4096 65536 67108864
net.core.rmem_max               = 67108864
net.core.wmem_max               = 67108864
net.ipv4.udp_rmem_min           = 8192
net.ipv4.udp_wmem_min           = 8192
net.ipv4.ip_local_port_range    = 1024 65535
net.ipv4.tcp_timestamps         = 1
net.ipv4.conf.all.rp_filter     = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.ip_forward             = 1
net.ipv6.conf.all.forwarding    = 1
net.ipv6.conf.default.forwarding= 1
net.ipv4.conf.all.route_localnet= 1
EOF

sysctl -p && sysctl --system

其中 sysctl -p 会加载默认配置文件,sysctl --system 会继续按顺序加载 /etc/sysctl.d/ 下的配置,包括刚写入的 98-bbr.conf

验证结果:

sysctl net.ipv4.tcp_congestion_control
lsmod | grep bbr

第一条应显示 bbr。第二条没有输出时,可先产生一些 TCP 流量再检查;只要拥塞控制算法已经是 BBR,就不需要重复运行来历不明的“BBR 一键脚本”。

通过官方 APT 源安装 sing-box

以下命令来自 sing-box 官方软件源,适用于 Debian:

mkdir -p /etc/apt/keyrings

curl -fsSL https://sing-box.app/gpg.key \
  -o /etc/apt/keyrings/sagernet.asc

chmod a+r /etc/apt/keyrings/sagernet.asc

cat >/etc/apt/sources.list.d/sagernet.sources <<EOF
Types: deb
URIs: https://deb.sagernet.org/
Suites: *
Components: *
Enabled: yes
Signed-By: /etc/apt/keyrings/sagernet.asc
EOF

apt-get update
apt-get install -y sing-box

确认安装结果和服务文件:

sing-box version
systemctl status sing-box --no-pager

刚安装时服务可能因为还没有有效配置而未运行,这是正常的。官方软件包默认读取 /etc/sing-box/config.json

选择 Reality 伪装域名

Reality 会与一个真实支持 TLS 1.3 的站点完成握手。本文和下方生成器默认使用 download-installer.cdn.mozilla.net:443。合适的 SNI 应满足:

  • 从你的 VPS 所在网络可以稳定访问。
  • 支持 TLS 1.3,且域名与证书匹配。
  • 与 VPS 位于相同或邻近的网络,连接路径尽量短。
  • 服务端配置中的 server_name、握手地址,以及客户端 SNI 完全一致。

先在 VPS 上测试默认域名:

openssl s_client -connect download-installer.cdn.mozilla.net:443 \
  -servername download-installer.cdn.mozilla.net -tls1_3 </dev/null

能看到证书,并在协商结果中看到 TLSv1.3 后即可使用。如果默认域名从你的 VPS 访问不稳定,推荐通过 RealiTLScanner 寻找邻近网段中更合适的候选域名。

使用 RealiTLScanner 扫描邻近域名

XTLS/RealiTLScanner 会扫描指定 IP、CIDR 网段或域名,识别支持 Reality 所需 TLS 特征的站点。项目官方建议在本地电脑运行扫描器,因为直接从云服务器批量扫描可能导致 VPS 被风控标记。

先确认 VPS 的公网 IP。假设地址是 203.0.113.42,它所在的 IPv4 /24 网段就是 203.0.113.0/24。初次只扫描 /24,不要直接扩大到 /16;同时只扫描你有权测试的地址范围,并控制线程数。

Linux 下载与运行

在 RealiTLScanner 的 Releases 页面下载与你电脑架构对应的文件。常见的 x86-64 Linux 使用 linux-amd64

curl -fLo RealiTLScanner \
  https://github.com/XTLS/RealiTLScanner/releases/latest/download/RealiTLScanner-linux-amd64
chmod +x RealiTLScanner
./RealiTLScanner

ARM64 Linux 或 Apple Silicon Linux 虚拟机应下载 RealiTLScanner-linux-arm64。Windows 可从同一页面下载 RealiTLScanner-windows-64.exe,在 PowerShell 或终端中运行。

扫描 VPS 邻近网段

把示例网段替换成 VPS 实际所在的 /24:

./RealiTLScanner \
  -addr 203.0.113.0/24 \
  -port 443 \
  -thread 5 \
  -timeout 5 \
  -out neighbors.csv

参数含义:

参数作用建议
-addr单个 IP、域名或 CIDR 网段初次使用 VPS 所在的 /24
-portTLS 扫描端口Reality 通常使用 443
-thread并发线程数从 5 或更低开始
-timeout单个目标超时秒数网络较差时可提高到 10
-outCSV 结果文件便于筛选证书域名

终端中 feasible=true 表示扫描器认为目标具备可用特征;neighbors.csv 会记录 IP、原始域名、证书域名、证书签发者和地区。优先选择:

  1. 扫描结果显示可用,并支持 TLS 1.3。
  2. 位于 VPS 邻近地址或相同网络的稳定站点。
  3. 证书域名明确、可以持续正常访问的公共站点。
  4. 不是临时、个人或明显即将失效的域名。

不要看到 feasible=true 就直接使用。选出候选域名后,回到 VPS 单独验证:

CANDIDATE=扫描得到的候选域名
openssl s_client -connect "$CANDIDATE:443" \
  -servername "$CANDIDATE" -tls1_3 </dev/null

确认域名能够解析、证书匹配且 TLS 1.3 握手稳定后,把下方生成器的“Reality 伪装域名(SNI)”替换为该候选域名。生成器会同时更新服务端的 server_namehandshake.server、客户端 SNI 和 VLESS URI。

生成并写入 Reality + VLESS Vision 配置

下面的工具会在当前浏览器本地生成 X25519 公私钥、UUID 和 Short ID,并将它们自动替换进服务端配置、客户端出站和 VLESS 导入链接。随机参数不会发送到本站服务器。

  1. 填写 VPS 公网 IP 或域名。
  2. 确认监听端口和 Reality 伪装域名。
  3. 点击服务端配置旁的“刷新公私钥”,可单独更换 Reality 密钥对。
  4. 点击“复制”获得已经替换完成的配置。
LOCAL KEY WORKBENCH

Reality + VLESS Vision 配置生成器

所有随机参数只在当前浏览器生成,不会发送到服务器。

UUID正在生成…
SHORT ID正在生成…
PUBLIC KEY正在生成…
PRIVATE KEY正在生成…
SERVER/etc/sing-box/config.json
{
  "log": {
    "level": "info",
    "timestamp": true
  },
  "inbounds": [
    {
      "type": "vless",
      "tag": "vless-reality-in",
      "listen": "::",
      "listen_port": 443,
      "users": [
        {
          "uuid": "正在生成…",
          "flow": "xtls-rprx-vision"
        }
      ],
      "tls": {
        "enabled": true,
        "server_name": "download-installer.cdn.mozilla.net",
        "reality": {
          "enabled": true,
          "handshake": {
            "server": "download-installer.cdn.mozilla.net",
            "server_port": 443
          },
          "private_key": "正在生成…",
          "short_id": [
            "正在生成…"
          ]
        }
      }
    }
  ],
  "outbounds": [
    {
      "type": "direct",
      "tag": "direct"
    }
  ]
}
CLIENT OUTBOUNDsing-box 客户端出站
{
  "type": "vless",
  "tag": "uuFly-Reality",
  "server": "请填写 VPS 公网 IP",
  "server_port": 443,
  "uuid": "正在生成…",
  "flow": "xtls-rprx-vision",
  "network": "tcp",
  "tls": {
    "enabled": true,
    "server_name": "download-installer.cdn.mozilla.net",
    "utls": {
      "enabled": true,
      "fingerprint": "chrome"
    },
    "reality": {
      "enabled": true,
      "public_key": "正在生成…",
      "short_id": "正在生成…"
    }
  }
}
VLESS URI支持 URI 的客户端可直接导入
vless://正在生成…@请填写 VPS 公网 IP:443?encryption=none&flow=xtls-rprx-vision&security=reality&sni=download-installer.cdn.mozilla.net&fp=chrome&pbk=%E6%AD%A3%E5%9C%A8%E7%94%9F%E6%88%90%E2%80%A6&sid=%E6%AD%A3%E5%9C%A8%E7%94%9F%E6%88%90%E2%80%A6&type=tcp#uuFly-Reality

服务端只需要私钥;客户端只需要公钥。不要把私钥发给其他人,也不要把含私钥的服务端配置提交到公开仓库。

复制生成器中的“服务端配置”,在 VPS 上写入文件:

install -d -m 755 /etc/sing-box
nano /etc/sing-box/config.json

粘贴后按 Ctrl+O、回车保存,再按 Ctrl+X 退出。也可以使用自己熟悉的编辑器。

配置中的核心字段对应关系如下:

服务端字段客户端字段要求
users.uuiduuid必须完全一致
users.flowflow都是 xtls-rprx-vision
tls.reality.private_keytls.reality.public_key同一密钥对,但不能互换
tls.reality.short_id[0]tls.reality.short_id必须完全一致
listen_portserver_port客户端填写外部可访问端口
server_nametls.server_name必须与握手 SNI 一致

校验配置并启动服务

先让 sing-box 检查 JSON 语法与字段:

sing-box check -c /etc/sing-box/config.json

命令无报错后,设置开机启动并立即运行:

systemctl enable --now sing-box
systemctl restart sing-box
systemctl status sing-box --no-pager

确认端口已经监听:

ss -lntp | grep :443

如果生成器中使用的不是 443,请替换为实际端口。实时查看日志:

journalctl -u sing-box -f

常用维护命令:

# 修改配置后先检查,再平滑重载
sing-box check -c /etc/sing-box/config.json
systemctl reload sing-box

# 查看最近 100 行日志
journalctl -u sing-box -n 100 --no-pager

# 停止、启动与重启
systemctl stop sing-box
systemctl start sing-box
systemctl restart sing-box

如果服务启动失败,优先检查:

  1. journalctl -u sing-box -n 100 --no-pager 中的具体字段错误。
  2. JSON 是否多了逗号、少了引号或括号。
  3. 端口是否已被其他程序占用。
  4. 云防火墙和系统防火墙是否放行同一个 TCP 端口。
  5. Reality SNI 是否能从 VPS 正常完成 TLS 1.3 握手。

导入客户端

使用 VLESS 链接直接导入

点击生成器底部 VLESS URI 右侧的“复制”,在支持 Reality 的客户端中选择:

  • 从剪贴板导入。
  • 导入 URL。
  • 新建 VLESS 节点后粘贴链接。

推荐使用最新版 Clash MiClash Verge Rev 或 sing-box 官方客户端。客户端内核必须支持 Reality 和 xtls-rprx-vision

导入后检查以下字段:

  • 地址:VPS 公网 IP 或域名。
  • 端口:服务端监听端口。
  • UUID:与服务端用户 UUID 一致。
  • 流控:xtls-rprx-vision
  • 传输:TCP。
  • TLS:开启,安全类型为 Reality。
  • SNI:生成器中填写的 Reality 伪装域名。
  • 指纹:Chrome。
  • Public Key 和 Short ID:与生成器一致。

合并 sing-box 客户端配置

如果你直接维护 sing-box JSON,把生成器中的“客户端出站”对象加入客户端配置的 outbounds 数组,再在路由或选择器中引用它的 tag

生成器提供的是出站对象,不是完整客户端配置,因为不同客户端的 TUN、DNS、路由和本地监听配置不同。这样做可以避免覆盖你已有的 DNS 与分流规则。

完成连接测试

连接节点后依次检查:

  1. 能否打开普通 HTTPS 网站。
  2. 客户端日志是否出现 TLS、Reality 或 UUID 错误。
  3. VPS 上的 journalctl -u sing-box -f 是否能看到连接。
  4. 使用测速站或下载文件测试实际速度。
  5. 重启 VPS 后,确认 sing-box 会自动恢复。

常见故障

能连接端口,但无法完成 Reality 握手

通常是 SNI、Public Key 或 Short ID 不一致。重新对照生成器输出,不要把公钥和私钥填反。

客户端一直超时

检查公网 IP 是否填写正确、VPS 是否有独立入站能力、云防火墙是否开放 TCP 端口。NAT VPS 还要确认外部端口映射到正确的内部端口。

服务端提示端口占用

使用以下命令查找占用进程:

ss -lntp | grep :443

停止冲突服务,或同时修改服务端监听端口、客户端端口和防火墙规则。

修改配置后服务无法启动

不要反复重启。先运行:

sing-box check -c /etc/sing-box/config.json
journalctl -u sing-box -n 100 --no-pager

修复具体错误后再启动。如果是远程服务器,始终保留一个未断开的 SSH 窗口。

也可以使用一键脚本

不想手动维护 JSON 时,可以选择活跃、公开源码的社区脚本。截至本文更新时,以下项目均有较多 GitHub Star:

项目特点更适合
yonggekkk/sing-box-yg多协议、订阅输出、IPv4/IPv6 与多种系统支持希望功能齐全、按菜单完成安装
fscarmen/sing-box多协议、Reality、客户端订阅及安装后管理需要较丰富管理能力
233boy/sing-boxReality 与常见协议安装、命令式管理喜欢较简洁的交互流程

一键脚本拥有 root 权限,运行前至少查看 README、最近提交、Issues 和脚本源码。建议先下载到本地检查,再执行,而不是直接把远程内容通过管道交给 shell:

curl -fLo sing-box-install.sh \
  https://raw.githubusercontent.com/yonggekkk/sing-box-yg/main/sb.sh

less sing-box-install.sh
bash sing-box-install.sh

脚本适合快速部署,但手动安装更容易理解配置结构、定位错误和迁移服务器。无论使用哪种方法,都应保存服务端配置备份,并记录客户端所需的 UUID、公钥、Short ID、SNI 和端口。