🌊 第01章 · VLESS + WS 原理
Xray 协议与 WebSocket 伪装
VLESS + WS 原理¶
这一章不碰任何键盘命令,只讲清楚一件事:为什么在现代网络环境下,VLESS + WebSocket 会成为"翻墙"这条链路里最常用的一套组合。把它的每一个部分——VLESS、UUID、WebSocket、TLS、反向代理——都拆开看透,后面第 2 到第 4 章的所有配置命令,本质都是在把这些概念落成一行行可运行的文本。
一句话概括:VLESS 是"身份卡片",WebSocket 是"普通卡车的伪装",TLS 是"密封保险箱",Nginx 是"前台门卫"。 你拿身份卡片通过门卫,把保险箱塞进普通卡车里,混在正常车流里开出去,谁也看不出这台车在运什么。
我们为什么需要"翻墙"这套东西¶
假设你在海外有一台 VPS(虚拟服务器),本机在国内。国内到这台 VPS 之间,中间可能有一层"检查站",它会看你在访问什么。
- 直接
SSH、ping、或走裸TCP端口,特征很明显,容易被针对性阻断; - 走
HTTPS(443 端口)就正常得多——因为全网大量正常网站就长这样,检查站不能把 443 都封了。
所以思路自然长成:把要隐藏的流量,装进一个看起来像"正常 HTTPS 网页访问"的壳子里。 这就是"代理"与"翻墙"的本质。
VLESS 是什么¶
VLESS 是 Xray(及其前身 V2Ray)家族里的一个传输协议。要理解它,先看它"不管什么":
VLESS 自身不带加密。它不是用来"加密封装"的,而是用来识别身份的——它只负责确认"你是谁,我要把流量送谁去"。
| 概念 | 作用 | 类比 |
|---|---|---|
| VLESS | 传输协议,负责身份认证 + 转发指令 | 快递单上的收件人信息 |
| UUID | 一串唯一的 ID 值,相当于"口令" | 快递单上的唯一快递单号 |
flow |
流控方案(如 xtls-rprx-vision),控制数据流向 |
分拣路线 |
decryption |
none 表示不解密(解密交给 TLS 层) |
不用自己的锁,锁在下一层 |
VLESS 相比老协议有几个优点:
1. 无状态、无额外加密开销,额外加一层解密都是在浪费;
2. 服务端配置简单,只要一对 UUID 即可;
3. 配合 XTLS 的 flow 可以做到"一跳直通",即加密只做一次,性能更好。
在真实环境里,配置文件里就一行身份信息:
"settings": {
"clients": [
{
"id": "72f6b462-da16-41cb-8370-d737f34d1710",
"flow": ""
}
],
"decryption": "none"
}
这串 72f6b462-da16-41cb-8370-d737f34d1710 就是这台服务器的 UUID,后面第 4 章客户端要靠它连进来。它存在服务器磁盘与客户端的配置文件里。
UUID 有多重要¶
安全提示(务必记住):
UUID与 WebSocket 路径path是这套系统的两把"钥匙"。任何人只要同时拿到这两样,再配上服务器地址,就能完全模拟你的客户端把流量穿过去,等于把你的代理白嫖甚至用于非法用途。所以:绝不要把 UUID 和 ws 路径贴到公开论坛、截图、或者任何能被人看到的聊天里。 服务器上的/root/.deploy/xray_uuid与/root/.deploy/xray_wspath两个文件权限是600,就是为防别人偷看。
本机这两个文件的真实内容(你部署时要替换成你自己的,这里只是示例结构):
# UUID(身份口令)
cat /root/.deploy/xray_uuid
72f6b462-da16-41cb-8370-d737f34d1710
# WebSocket 伪装路径(门牌号)
cat /root/.deploy/xray_wspath
/ws-f033eda368eb1b99f9d79a4f
WebSocket:让流量"看起来像网页"¶
WebSocket(简称 WS)本身是一个 Web 标准协议,初衷是让网页能和服务端保持一个长连接、双向通信。它比普通 HTTP 请求的"一问一答"更轻,适合实时聊天、在线游戏、即时推送这类场景。
WS 的特点正好被利用:
- 它跑在 HTTP(S) 之上,前几个字节长得和普通 HTTP 请求一模一样(GET /ws-xxxx HTTP/1.1);
- 经过 Upgrade: websocket 头进行一次"升级握手"后,保持一条长链接;
- 对检查站而言,这就是一条普通的网页长连接,只是"打开了好久"。
WebSocket 的标准握手流程:
客户端 → 服务器: GET /ws-f033eda368eb1b99f9d79a4f (带 Upgrade: websocket 头)
(看起来像在访问这个网站的一个普通长连接页面)
服务器 → 客户端: 101 Switching Protocols
(握手成功,之后这条连接就双向畅通了)
客户端 ⇄ 服务器: 这条连接里再跑我们的 VLESS 数据
接地气:可以把 WebSocket 想象成你在一栋写字楼的大楼正门,拿着一张访客证(UUID),坐普通电梯(WebSocket)上楼。保安看见你刷了一次门禁就上楼了,只觉得是普通访客,不会想到你怀里揣着一份机密文件(真实翻墙流量)——因为文件放在了密封档案袋(TLS)里。
TLS:装上"保险箱"¶
WebSocket + TLS 是这套组合的标准形态。TLS(通常就是 HTTPS 里那个加密层)负责三件事:
| TLS 作用 | 说明 |
|---|---|
| 加密 | 真正的翻墙数据在 TLS 里加密,抓到包也看不懂 |
| 信任 | 用证书证明"我真是 bangdream.xyz",不被冒充 |
| 伪装 | 让整条连接在外人看来就是一次正常的 HTTPS 访问 |
在真实配置里,Xray 的 streamSettings.security 是 none(Xray 自转不负责 TLS),因为 TLS 由外层 Nginx 终止——这就是下一节要解释的关键架构。
为什么把它藏进 Nginx 反向代理里¶
这是整个方案最核心的思路,很多新手在这里会转不过弯:
Xray 本身不直接暴露给公网,而是监听在本机内网地址
127.0.0.1:10086。真正对外提供 443 端口的是一个网站(Nginx),Nginx 只把特定的一个路径/ws-f033eda368eb1b99f9d79a4f转发到后端的 Xray。
这样带来的好处: 1. 外界访问你的服务器,看到的是一个正常网站(比如 bangdream.xyz),扫描 443 端口只会发现一个网站,而不会看到一个"代理服务"; 2. TLS 证书由 Nginx 统一管理(Certbot 自动续期),Xray 只需要处理纯 WS; 3. 只有恰好知道那个隐藏路径的请求才会被送进 Xray,其他人访问那个路径只会得到 404 或其它正常页面。
互联网访问者
│ (443 HTTPS, 看起来是访问 bangdream.xyz 这个网站)
▼
Nginx (43 端口, 有 TLS 证书)
│ location /ws-f033eda368eb1b99f9d79a4f ──► 转发
▼
Xray (127.0.0.1:10086, 只监听本机)
│ VLESS 身份校验 (UUID)
▼
freedom outbound (direct) ──► 帮你访问你想访问的任何网站
上图就是这一整套系统的完整链路。把这个图印在脑子里,后面所有配置命令都是往链条上"接零件"。
为什么用"反向代理"而不是直接开 TLS¶
有人会问:为什么不干脆让 Xray 自己监听 443 并自己加 TLS?那样少一层。但坏处很明显:
- 你的服务器如果还要正常跑网站(比如这里跑了个 Web 应用在 3000 端口、GitLab 在 8090),443 只能被一个程序占用——Nginx 正好可以把 443 分给多个"业务";
- Xray 自持 TLS 时,证书续期、配置管理都落在 Xray 上,和 Xray 升级耦合;
- 用 Nginx 反代,代理和网站混在一起,"伪装性"最好——这正是这套方案的核心价值。
| 方案 | 443 端口占用 | 伪装性 | 证书管理 | 适用 |
|---|---|---|---|---|
| Xray 直接监听 443 | 独占 | 中 | Xray 自己搞 | 纯代理机 |
| Nginx 反代 Xray | Nginx 共享复用于多个站点 | 高 | Certbot 统一 | 同一台机器还跑着网站 |
本章小结¶
| 关键点 | 一句话记忆 |
|---|---|
| VLESS | 只认身份,不负责加密 |
| UUID | 唯一的身份口令,绝不可泄露 |
| WebSocket | 让流量长得像网页长连接 |
| TLS | 负责真正的加密(这里是 Nginx 终止) |
| 反向代理 | 把代理藏在正常网站后面 |
| 伪装路径 | 只有知道这个路径的请求,才会被转进 Xray |
搞懂了这些,接下来第 2 章我们就把 Xray 这台"接收器"真正装起来、跑起来。
再次强调安全底线:
UUID和ws 路径是你的钥匙串,丢一把就等于把整个翻墙通道送人。在后面的章节里,涉及这两者时都请按你的实际情况替换,并且不要在公开渠道截图或粘贴。