sing-box VPS 部署 VLESS + Reality + Vision 新手入门教程:无域名、无证书、纯配置文件方案
如果你刚开始折腾 VPS 节点,不想一上来就碰域名、证书、Nginx、CDN、面板,那么 sing-box + VLESS + Reality + Vision 是一个很适合入门的组合。
它的优点很直接:
- 不需要域名
- 不需要申请 TLS 证书
- 服务端只跑 sing-box,一个配置文件就能启动
Reality负责伪装真实 TLS 握手Vision负责 VLESS 在 TCP 场景下的高性能传输
这篇教程会从一台全新的 Debian / Ubuntu VPS 开始,带你完成安装、生成密钥、写服务端配置、启动服务、填写客户端参数和排错。
本教程基于 sing-box 1.9+ 版本编写。sing-box 语法迭代较快,请尽量使用最新版服务端和客户端。
先说结论
最终我们要部署的是:
1 | VLESS + TCP(RAW) + REALITY + xtls-rprx-vision |
在 sing-box 配置里,最关键的几个字段是:
1 | { |
这里容易混淆的地方是:Vision 不是一个单独协议,也不是传输层,而是 VLESS 的 flow 参数。
一、准备条件
你需要准备:
- 一台 VPS,推荐 Debian 12 或 Ubuntu 22.04 / 24.04
- 一个可以 SSH 登录 VPS 的终端
- VPS 公网 IP
- 放行一个 TCP 端口,本文默认使用
443
本文不需要:
- 不需要域名
- 不需要 Cloudflare
- 不需要申请证书
- 不需要 3x-ui / x-ui 面板
注意:请遵守你所在地区和服务商的使用规则。本文仅用于自有服务器远程访问、加密传输和网络调试场景。
二、更新系统
SSH 登录 VPS 后,先更新系统。
如果你是 root 用户,按顺序一条一条执行:
1 | apt-get update |
1 | apt-get full-upgrade -y |
1 | apt-get install -y curl wget nano ca-certificates gnupg lsb-release ufw |
Reality 对服务端和客户端时间差比较敏感,时间明显不准时可能会连接失败。先查看时间状态:
1 | timedatectl |
重点看 Local time、Universal time 和 System clock synchronized。如果时间明显不对,优先到 VPS 服务商面板里检查系统时间;如果你用的是 LXC / OpenVZ / 容器环境,系统时间通常由宿主机控制,容器内不一定能直接修改。
三、安装 sing-box
sing-box 官方提供了安装脚本。Debian / Ubuntu 用户可以直接执行:
1 | curl -fsSL https://sing-box.app/install.sh | sh |
安装完成后查看版本:
1 | sing-box version |
如果能看到版本号,就说明安装成功。以后需要升级 sing-box,也可以再次运行上面的官方安装脚本。
四、开启 BBR
BBR 不是必须项,但大多数 VPS 上开启后 TCP 体验会更好。
先写入 BBR 配置。注意:请点击代码块右上角的复制按钮完整复制,确保粘贴到终端时包含换行。下面这一段要从第一行复制到 EOF,作为一个整体执行:
1 | tee /etc/sysctl.d/99-bbr.conf > /dev/null <<'EOF' |
再应用系统参数:
1 | sysctl --system |
检查:
1 | sysctl net.ipv4.tcp_congestion_control |
看到类似结果即可:
1 | net.ipv4.tcp_congestion_control = bbr |
五、生成 UUID、Reality 密钥和 short_id
VLESS + Reality 需要 4 个关键参数:
uuid:用户 ID,客户端和服务端必须一致private_key:Reality 私钥,只放在服务端public_key:Reality 公钥,只放在客户端short_id:短 ID,客户端和服务端必须一致
先生成 UUID:
1 | sing-box generate uuid |
示例输出:
1 | 0d72f5a1-1111-4a22-8888-123456789abc |
再生成 Reality 密钥对:
1 | sing-box generate reality-keypair |
示例输出:
1 | PrivateKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
最后生成 short_id:
1 | sing-box generate rand --hex 8 |
示例输出:
1 | 7f3a91c6d8e24b10 |
如果你的 sing-box 版本没有 generate rand,也可以用:
1 | openssl rand -hex 8 |
把这 4 个值先记下来:
1 | UUID = 你的 UUID |
千万不要把
PrivateKey发给别人。客户端只需要PublicKey。
六、选择 Reality 伪装目标
Reality 需要一个真实可访问的网站作为握手目标。新手可以先用:
1 | www.microsoft.com |
在 VPS 上测试一下:
1 | curl -I https://www.microsoft.com --connect-timeout 5 |
能看到 HTTP 响应头,说明 VPS 可以访问这个目标。
你也可以换成其他大型 HTTPS 网站,但建议满足这几点:
- 支持 TLS 1.3
- 从你的 VPS 能正常访问
- 域名和证书正常
- 不要使用奇怪的小站或自建站
本文后面的配置统一使用:
1 | server_name = www.microsoft.com |
如果后续使用中遇到断流,可以将 server_name 和 handshake.server 换成苹果的系统更新或 iCloud 域名,例如 swdist.apple.com 或 gateway.icloud.com。换伪装域名时,服务端和客户端必须保持一致。
七、写入服务端配置
打开 sing-box 配置文件:
1 | nano /etc/sing-box/config.json |
把下面这一整份 JSON 写入 /etc/sing-box/config.json。如果文件里已经有默认配置,比如 shadowsocks、mixed、tun 等旧入站内容,不要和下面的配置混在一起;写入前先清空原文件内容,并替换 3 个地方:
替换成你的UUID替换成你的Reality私钥替换成你的ShortID
这里 不用填 VPS IP。服务端的 "listen": "0.0.0.0" 表示监听这台 VPS 的所有公网和内网地址,保持不变即可。VPS IP 只填在后面的客户端配置里。
注意:这一段是 服务端配置,要写在 VPS 的 /etc/sing-box/config.json 里。服务端配置里应该看到 inbounds 里的 "type": "vless" 和 private_key。如果你看到的是 "type": "mixed"、"tag": "mixed-in"、"server": "你的VPS公网IP"、public_key 或 "final": "proxy",那是后面的客户端配置,不能粘到 VPS 服务端。
1 | { |
这里解释几个重点:
listen_port:服务端监听端口,本文用443uuid:VLESS 用户 IDflow:必须填xtls-rprx-visionserver_name:客户端填写的 SNI,也就是伪装目标域名handshake.server:Reality 实际转发握手的目标站private_key:只写服务端 Reality 私钥short_id:客户端也要填写同一个值
如果你的 VPS 同时有 IPv6,并且你希望监听 IPv4 + IPv6,可以把:
1 | "listen": "0.0.0.0" |
改成:
1 | "listen": "::" |
新手优先用 0.0.0.0,排错更直观。
八、检查配置并启动服务
编辑时看到 JSON 被挤成很长一行,或者自动折到下一行,是正常显示效果,不代表配置错了。不要靠肉眼判断,写入后用下面的命令检查。
下面几步建议一条一条执行,不要把多条命令粘在同一行。
第一步,检查配置文件:
1 | sing-box check -c /etc/sing-box/config.json |
如果没有报错,第二步,格式化配置:
1 | sing-box format -w -c /etc/sing-box/config.json |
第三步,设置开机自启并重启服务:
1 | systemctl enable sing-box |
1 | systemctl restart sing-box |
第四步,查看运行状态:
1 | systemctl status sing-box --no-pager |
看到 Active: active (running),并且日志里有 tcp server started at 0.0.0.0:443,说明 sing-box 已经启动成功。如果 Loaded 那一行显示 disabled,表示当前服务虽然在运行,但还没有设置开机自启,再执行一次 systemctl enable sing-box 即可。
如果误把几条命令粘在同一行,可能会看到 unknown flag: --no-pager。这不是配置错了,只是 shell 把后面的命令当成前一条命令的参数了,重新按上面四步分开执行即可。
查看日志:
1 | journalctl -u sing-box --output cat -f |
检查端口是否监听:
1 | ss -tlnp | grep ':443' |
正常情况下,你应该能看到 sing-box 正在监听 443。
九、放行防火墙端口
如果你使用 ufw,先确认 SSH 端口已经放行。若执行 ufw 时提示 ufw: command not found,说明系统里还没安装 ufw,可以先安装。下面两条命令要分开执行,不要粘在同一行:
1 | apt-get update |
1 | apt-get install -y ufw |
如果误粘成 apt-get update apt-get install -y ufw,会看到 E: The update command takes no arguments。这不是系统坏了,重新按上面两条分别执行即可。
如果你用的是容器环境,系统可能不支持 ufw。这种情况下可以先跳过系统内防火墙,只去服务商后台安全组放行 22/tcp 和 443/tcp。
默认 SSH 是 22:
1 | ufw allow 22/tcp |
放行 sing-box 节点端口:
1 | ufw allow 443/tcp |
启用防火墙:
1 | ufw enable |
1 | ufw status |
如果你改过 SSH 端口,比如 SSH 是 2222,那就必须放行:
1 | ufw allow 2222/tcp |
云厂商后台的安全组也要同步放行
443/tcp。很多连接超时不是 sing-box 配置错了,而是云防火墙没开。
十、客户端怎么填
不同客户端界面不一样,但核心参数是一样的。
图形客户端通用参数
1 | 协议:VLESS |
注意两点:
地址 / Server填你的 VPS IP,不是www.microsoft.comSNI / Server Name才填www.microsoft.com
这两个填反了,是新手最常见的错误。
桌面端 sing-box 客户端示例
如果你在电脑本地也用 sing-box,可以参考下面这份配置。这一段适合 macOS / Windows / Linux 桌面端使用,因为它只是在本机开一个 127.0.0.1:7890 代理端口。
注意:这不是手机端整机代理配置。手机端如果直接照抄这个 mixed-in 配置,客户端可能显示已经启动,但系统流量不会自动走代理。
把这几个值替换掉:
你的VPS公网IP你的UUID你的Reality公钥你的ShortID
1 | { |
启动客户端后,把系统代理或浏览器代理指向:
1 | 127.0.0.1:7890 |
如果客户端日志里只看到终端测试请求,比如 api.ipify.org:443,但浏览器没有任何连接记录,说明浏览器还没有走这个本地代理。
手机端 sing-box 使用要点
手机端不要只看 sing-box started。关键是确认它有没有用 VPN / TUN 模式接管系统流量。
正常情况下,手机端启动后应该出现系统 VPN 图标,sing-box 日志里也应该能看到手机浏览器或 App 发出的连接。如果没有 VPN 图标,或者日志里没有任何新的访问记录,通常说明手机流量没有进入 sing-box。
手机端建议优先使用客户端图形界面填写上面的“图形客户端通用参数”,或使用客户端提供的导入功能。不要把桌面端的 127.0.0.1:7890 当成手机整机代理来用。
如果手机端提供运行模式,优先选择类似下面的模式:
- VPN
- TUN
- 全局代理 / Global
如果只提供本地 HTTP / SOCKS 代理模式,那就还需要在系统 Wi-Fi 代理里手动填写手机本机代理地址;这个方式容易漏掉 App 流量,新手更推荐直接用 VPN / TUN 模式。
十一、测试是否成功
桌面端客户端连接后,打开终端测试:
1 | curl -x socks5h://127.0.0.1:7890 https://api.ipify.org |
如果返回的是你的 VPS 出口 IP,说明客户端到 VPS 的代理链路已经工作。此时如果浏览器仍然没网,重点检查浏览器或系统代理是否真的指向 127.0.0.1:7890。
也可以测试 HTTPS:
1 | curl -x socks5h://127.0.0.1:7890 https://www.google.com -I |
手机端测试时,直接用手机浏览器打开:
1 | https://api.ipify.org |
如果显示的是 VPS IP,说明手机端已经走代理。如果显示的还是手机运营商或家里宽带 IP,说明手机端 VPN / TUN 没有接管流量,优先回到客户端里检查运行模式和配置是否启用。
服务端日志里如果有连接记录,也说明入站正在工作:
1 | journalctl -u sing-box --output cat -f |
十二、常见错误排查
1. 客户端连接超时
优先检查端口:
1 | ss -tlnp | grep ':443' |
1 | ufw status |
再检查云厂商安全组是否放行了 443/tcp。
如果端口没监听,说明 sing-box 没启动成功:
1 | systemctl status sing-box --no-pager |
1 | journalctl -u sing-box --output cat -e |
2. reality verification failed
通常是这些参数不一致:
- 客户端
PublicKey填错 - 服务端
PrivateKey填错 short_id不一致server_name/ SNI 不一致- 客户端时间或服务端时间偏差太大
- 客户端 sing-box 核心太旧
先检查时间:
1 | timedatectl |
再升级 sing-box,按顺序一条一条执行:
1 | apt-get update |
1 | apt-get install --only-upgrade sing-box |
1 | systemctl restart sing-box |
3. TLS handshake invalid connection / processed invalid connection
服务端日志里偶尔出现 TLS handshake invalid connection 或 processed invalid connection,不一定代表配置错了。公网端口会被扫描,陌生连接打到 Reality 入站时可能会被拒绝。
如果 systemctl status 里已经看到 Active: active (running),并且日志里出现 inbound connection from ...,说明外部连接已经能打到 VPS,端口和安全组大概率是通的。
判断是不是自己的客户端:先在本地查公网 IP,再打开客户端连接,看服务端日志里是否出现同一个 IP。
1 | curl https://api.ipify.org |
如果日志里的 IP 不是你的公网 IP,多半只是公网扫描,可以忽略。如果日志里的 IP 是你的公网 IP,但仍然报 Reality / TLS 握手错误,再重点检查 UUID、Reality 公钥、short_id、SNI 和 flow 是否完全一致。
4. 客户端显示 connected,但网页打不开
先在本机确认本地代理是否工作:
1 | curl -x socks5h://127.0.0.1:7890 https://api.ipify.org |
如果这条命令能返回 VPS 出口 IP,说明节点本身是通的。浏览器打不开通常是浏览器没有走代理:把 macOS 系统代理或浏览器代理设置为 SOCKS5 127.0.0.1 7890,再打开 https://api.ipify.org 验证。
检查服务端出站是否能访问外网:
1 | curl -I https://www.google.com --connect-timeout 5 |
1 | curl -I https://www.microsoft.com --connect-timeout 5 |
如果服务端自己都访问不了目标网站,那不是客户端问题,而是 VPS 出口网络问题。
5. 手机端 sing-box 启动了,但没网络
如果电脑端用 curl -x socks5h://127.0.0.1:7890 https://api.ipify.org 能返回 VPS IP,但手机端不行,优先怀疑手机端没有用 VPN / TUN 接管系统流量,而不是 VPS 或防火墙坏了。
手机端按这个顺序排查:
- 启动后手机状态栏是否出现 VPN 图标
- 手机浏览器打开
https://api.ipify.org是否显示 VPS IP - VPS 上执行
journalctl -u sing-box --output cat -f时,手机访问网页后是否出现新的inbound connection
如果没有 VPN 图标,也没有服务端新连接,说明手机流量根本没有进入 sing-box。回到手机客户端里选择 VPN / TUN / 全局代理模式。
如果服务端有手机的新连接,但仍然打不开网页,再检查客户端参数是否和服务端一致,尤其是 UUID、Public Key、Short ID、SNI、Flow 和端口 443。
6. 速度不理想
VLESS + Reality + Vision 是稳定路线,不是暴力提速路线。速度主要取决于:
- VPS 线路质量
- 本地运营商到 VPS 的路由
- 晚高峰丢包
- VPS 带宽限制
- 客户端分流和 DNS 配置
如果 TCP 晚高峰丢包严重,可以再额外部署 Hysteria2 / TUIC 作为 UDP 加速备用节点。但这已经是另一套方案,不建议新手一开始就混在同一个教程里。
十三、升级和维护
以后升级 sing-box,按顺序一条一条执行:
1 | apt-get update |
1 | apt-get install --only-upgrade sing-box |
1 | sing-box check -c /etc/sing-box/config.json |
1 | systemctl restart sing-box |
查看服务状态:
1 | systemctl status sing-box --no-pager |
查看实时日志:
1 | journalctl -u sing-box --output cat -f |
修改配置后,一定先检查:
1 | sing-box check -c /etc/sing-box/config.json |
没报错再重启:
1 | systemctl restart sing-box |
十四、参数速查表
| 参数 | 服务端填写 | 客户端填写 |
|---|---|---|
| VPS IP | 不需要 | server |
| 端口 | listen_port |
server_port |
| UUID | users.uuid |
uuid |
| Vision | users.flow |
flow |
| Reality 私钥 | tls.reality.private_key |
不填 |
| Reality 公钥 | 不填 | tls.reality.public_key |
| short_id | tls.reality.short_id |
tls.reality.short_id |
| 伪装域名 | tls.server_name 和 handshake.server |
tls.server_name / SNI |
| uTLS 指纹 | 不填 | chrome |
结语
如果你只是想先搭一个稳定、干净、可维护的 VPS 节点,那么这套 sing-box + VLESS + Reality + Vision 就足够作为第一套配置。
它不追求花哨,但胜在链路简单、依赖少、排错容易。等你把这套跑稳之后,再去加 Hysteria2、TUIC、CDN 备用通道或更复杂的分流,会轻松很多。
附录:配套客户端配置示例
下面这份是 sing-box 客户端 Fake-IP + TUN 分流模板,不是 VPS 服务端配置。使用前先把 你的VPS公网IP、你的UUID、你的Reality公钥、你的ShortID 改成你自己的参数。
它和前面的桌面端 mixed-in 示例用途不同:前面的示例只提供本机代理端口,这份模板用于接管系统流量并做分流。
1 | { |