搭建第一个节点: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 |
-port | TLS 扫描端口 | Reality 通常使用 443 |
-thread | 并发线程数 | 从 5 或更低开始 |
-timeout | 单个目标超时秒数 | 网络较差时可提高到 10 |
-out | CSV 结果文件 | 便于筛选证书域名 |
终端中 feasible=true 表示扫描器认为目标具备可用特征;neighbors.csv 会记录 IP、原始域名、证书域名、证书签发者和地区。优先选择:
- 扫描结果显示可用,并支持 TLS 1.3。
- 位于 VPS 邻近地址或相同网络的稳定站点。
- 证书域名明确、可以持续正常访问的公共站点。
- 不是临时、个人或明显即将失效的域名。
不要看到 feasible=true 就直接使用。选出候选域名后,回到 VPS 单独验证:
CANDIDATE=扫描得到的候选域名
openssl s_client -connect "$CANDIDATE:443" \
-servername "$CANDIDATE" -tls1_3 </dev/null
确认域名能够解析、证书匹配且 TLS 1.3 握手稳定后,把下方生成器的“Reality 伪装域名(SNI)”替换为该候选域名。生成器会同时更新服务端的 server_name、handshake.server、客户端 SNI 和 VLESS URI。
生成并写入 Reality + VLESS Vision 配置
下面的工具会在当前浏览器本地生成 X25519 公私钥、UUID 和 Short ID,并将它们自动替换进服务端配置、客户端出站和 VLESS 导入链接。随机参数不会发送到本站服务器。
- 填写 VPS 公网 IP 或域名。
- 确认监听端口和 Reality 伪装域名。
- 点击服务端配置旁的“刷新公私钥”,可单独更换 Reality 密钥对。
- 点击“复制”获得已经替换完成的配置。
Reality + VLESS Vision 配置生成器
所有随机参数只在当前浏览器生成,不会发送到服务器。
正在生成…正在生成…正在生成…正在生成…{
"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"
}
]
}{
"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": "正在生成…"
}
}
}服务端只需要私钥;客户端只需要公钥。不要把私钥发给其他人,也不要把含私钥的服务端配置提交到公开仓库。
复制生成器中的“服务端配置”,在 VPS 上写入文件:
install -d -m 755 /etc/sing-box
nano /etc/sing-box/config.json
粘贴后按 Ctrl+O、回车保存,再按 Ctrl+X 退出。也可以使用自己熟悉的编辑器。
配置中的核心字段对应关系如下:
| 服务端字段 | 客户端字段 | 要求 |
|---|---|---|
users.uuid | uuid | 必须完全一致 |
users.flow | flow | 都是 xtls-rprx-vision |
tls.reality.private_key | tls.reality.public_key | 同一密钥对,但不能互换 |
tls.reality.short_id[0] | tls.reality.short_id | 必须完全一致 |
listen_port | server_port | 客户端填写外部可访问端口 |
server_name | tls.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
如果服务启动失败,优先检查:
journalctl -u sing-box -n 100 --no-pager中的具体字段错误。- JSON 是否多了逗号、少了引号或括号。
- 端口是否已被其他程序占用。
- 云防火墙和系统防火墙是否放行同一个 TCP 端口。
- Reality SNI 是否能从 VPS 正常完成 TLS 1.3 握手。
导入客户端
使用 VLESS 链接直接导入
点击生成器底部 VLESS URI 右侧的“复制”,在支持 Reality 的客户端中选择:
- 从剪贴板导入。
- 导入 URL。
- 新建 VLESS 节点后粘贴链接。
推荐使用最新版 Clash Mi、Clash 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 与分流规则。
完成连接测试
连接节点后依次检查:
- 能否打开普通 HTTPS 网站。
- 客户端日志是否出现 TLS、Reality 或 UUID 错误。
- VPS 上的
journalctl -u sing-box -f是否能看到连接。 - 使用测速站或下载文件测试实际速度。
- 重启 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-box | Reality 与常见协议安装、命令式管理 | 喜欢较简洁的交互流程 |
一键脚本拥有 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 和端口。