适用于: VMISS、DMIT、RFCHost,以及其他有独立公网 IP、可安装 Debian 或 Ubuntu 的 KVM VPS。本文的手动配置按 Debian 12/13 编写。
- 准备系统: 更新软件包、关闭 UFW,确认云防火墙允许 TCP 443。
- 开启 BBR: 写入网络参数并确认拥塞控制算法已经切换为 BBR。
- 安装 sing-box: 添加官方 APT 源,通过系统包管理器安装。
- 生成配置: 在浏览器本地生成 Reality 密钥、UUID 和 Short ID,一次写入完整 JSON。
- 启动服务: 使用
systemctl启动 sing-box,并检查监听端口和日志。 - 导入客户端: 复制 VLESS 链接,连接后测试网页、日志、速度和重启恢复。
Debian:准备服务器与 BBR
系统和最低配置
推荐 Debian 12 或 Debian 13、64 位系统。单人节点使用 1 核、512 MB~1 GB 内存即可,硬盘 5 GB 以上。开始前准备:
- VPS 公网 IPv4 或 IPv6。
- root 权限,或者能使用
sudo的账号。 - 一个未被占用且已在云防火墙放行的 TCP 端口,本文使用
443。 - 一台已安装兼容 VLESS Reality 客户端的电脑或手机。
按照上一篇文章的方法,在 MobaXterm 中打开这台 VPS 的会话:填写服务器 IP、用户名、SSH 端口和密码,成功看到终端提示符后,再执行下面的系统准备命令。这里只复制命令块中的内容,不要把服务器 IP 粘贴进终端。
apt update
apt full-upgrade -y
apt install -y curl ca-certificates gnupg openssl
关闭 UFW,先排除端口拦截
先停止 UFW,并禁止它开机启动:
systemctl stop ufw
systemctl disable ufw
stop 负责立即关闭,disable 负责重启后仍保持关闭。检查结果:
systemctl is-active ufw
systemctl is-enabled ufw
看到 inactive、disabled 即可;提示没有 ufw.service 则表示系统未安装 UFW。这里关闭的是 Debian 内部防火墙,服务商控制台的云防火墙仍需允许 TCP 443。
如果 443 已被 Nginx、Caddy 或其他程序占用,可以停止冲突服务,或者稍后在生成器中改用其他端口。检查端口:
ss -lntp | grep :443
没有任何输出表示当前没有程序监听 443。由于 UFW 已关闭,只需确认 VPS 服务商控制台的云防火墙或安全组允许 TCP 443。
开启 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 一键脚本”。
Debian:通过官方 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。
Debian:选择 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。
Debian:生成并写入 Reality + VLESS Vision 配置
下面的工具会在当前浏览器本地生成 X25519 公私钥、UUID 和 Short ID,并将它们自动替换进服务端配置、客户端出站和 VLESS 导入链接。随机参数不会发送到本站服务器。
- 填写服务器: 输入 VPS 公网 IP 或域名,让生成器创建客户端实际连接的地址。
- 确认端口与 SNI: 端口保持 443;伪装域名先用默认值,避免第一次同时修改多个参数。
- 生成密钥: 页面会自动创建全部参数;“刷新公私钥”只用于以后主动更换 Reality 密钥。
- 复制服务端命令: 按钮会复制包含完整 JSON 的
cat命令,粘贴到 VPS 即可一次写好配置。
Reality + VLESS Vision 配置生成器
所有随机参数只在当前浏览器生成,不会发送到服务器。
正在生成…正在生成…正在生成…正在生成…install -d -m 755 /etc/sing-box
cat > /etc/sing-box/config.json <<'EOF'
{
"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"
}
]
}
EOF
chmod 600 /etc/sing-box/config.json{
"type": "vless",
"tag": "NodeUno-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": "正在生成…"
}
}
}服务端只需要私钥;客户端只需要公钥。不要把私钥发给其他人,也不要把含私钥的服务端配置提交到公开仓库。
生成器的 SERVER INSTALL COMMAND 面板已经把完整 JSON 包装成 cat > /etc/sing-box/config.json <<'EOF' 命令。
点击面板中的“复制”,把整段内容粘贴到 VPS 并按 Enter。它会创建目录、一次写入完整配置,再把权限设为 600;不需要打开 nano,也不需要手动逐行修改 JSON。
执行后运行 cat /etc/sing-box/config.json,确认文件开头是 {、结尾是 }。
配置中的核心字段对应关系如下:
| 服务端字段 | 客户端字段 | 要求 |
|---|---|---|
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 一致 |
Debian:校验配置并启动服务
先让 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,找到第一条明确错误。 - 再查配置语法: 运行
sing-box check -c /etc/sing-box/config.json,确认 JSON 没有缺少引号或括号。 - 检查端口占用: 运行
ss -lntp | grep :443,确认没有其他程序占用同一端口。 - 检查公网入口: 确认云防火墙允许 TCP 443,并且
systemctl is-active ufw返回inactive。 - 最后验证 SNI: 确认伪装域名能从 VPS 正常完成 TLS 1.3 握手。
Debian:导入客户端
使用 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 与分流规则。
完成连接测试
连接节点后依次检查:
- 先打开普通网页: 确认基本代理链路已经连通,不要一开始只测流媒体。
- 查看客户端日志: 确认没有 TLS、Reality、UUID 或端口错误。
- 查看服务端日志: 运行
journalctl -u sing-box -f,确认 VPS 能看到客户端连接。 - 再测试实际速度: 使用测速站或下载文件,判断线路能否满足日常使用。
- 最后测试重启恢复: 重启 VPS,确认 sing-box 会自动启动,避免以后重启后突然失联。
Debian:常见故障
能连接端口,但无法完成 Reality 握手
通常是 SNI、Public Key 或 Short ID 不一致。重新对照生成器输出,不要把公钥和私钥填反。
客户端一直超时
依次检查公网 IP、TCP 443 云防火墙规则、systemctl is-active ufw 是否为 inactive,以及 sing-box 是否正在监听 443。
服务端提示端口占用
使用以下命令查找占用进程:
ss -lntp | grep :443
停止冲突服务,或同时修改服务端监听端口、客户端端口和防火墙规则。
修改配置后服务无法启动
不要反复重启。先运行:
sing-box check -c /etc/sing-box/config.json
journalctl -u sing-box -n 100 --no-pager
修复具体错误后再启动。操作远程服务器时,始终保留一个未断开的 MobaXterm 会话窗口。
Debian:也可以使用社区脚本
不想手动维护 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 和端口。