实操:VLESS + WebSocket + TLS + CDN 搭建全流程
上一章讲解了 Trojan 方案的搭建。本章换一个更主流的协议——VLESS,搭配 WebSocket + TLS + Cloudflare CDN,实现:
- 代理流量伪装成正常 HTTPS WebSocket 连接
- VPS 真实 IP 隐藏在 CDN 后面
- 非代理请求回落到正常网站(完美伪装)
整个方案基于一台已有 Web 项目运行的 VPS,代理与网站共存。
方案架构
外部观察者看到的:一个普通网站域名,走 Cloudflare CDN,和全球数十亿网站没有任何区别。
前置条件
| 需要 | 说明 |
|---|---|
| VPS | 已有一台运行 Web 项目的服务器 |
| 域名 | 已配置 Cloudflare DNS(本文用 proxy.example.com) |
| Nginx | 已安装并运行 |
| Cloudflare 账号 | 域名已托管在 Cloudflare |
本教程假设你已经完成了第三章的 TLS 证书配置。如果你的 VPS 上已经有 Cloudflare Origin Certificate 和运行中的 Nginx,可以直接开始。
安装 Xray
安装完成后:
- 可执行文件:
/usr/local/bin/xray - 配置文件:
/usr/local/etc/xray/config.json - systemd 服务:
xray.service
验证安装:
生成 UUID
每个客户端需要一个唯一的 UUID 作为认证凭证:
输出类似:a1b2c3d4-e5f6-7890-abcd-ef1234567890
记下这个 UUID,后面配置要用。
生成随机路径
WebSocket 路径相当于一个额外的"密码"——只有知道这个路径的人才能连上代理:
输出类似:b428ee8316
最终 WebSocket 路径就是 /b428ee8316。不要用容易猜到的路径(如 /ws、/ray、/proxy),这些是扫描器的首选目标。
路径不要用常见的 /ws、/ray、/v2ray 等——GFW 和安全扫描器会主动探测这些路径。用随机字符串是最安全的。
配置 Xray
编辑配置文件:
写入以下内容(替换 你的UUID):
关键参数解释:
| 参数 | 说明 |
|---|---|
port: 10001 | Xray 监听的本地端口(Nginx 会转发到这里) |
listen: 127.0.0.1 | 只监听本地,不对外暴露 |
protocol: vless | 使用 VLESS 协议 |
decryption: none | VLESS 不做额外加密(TLS 由 Nginx 处理) |
network: ws | 传输层用 WebSocket |
path | WebSocket 路径,客户端必须匹配 |
注意 listen: "127.0.0.1" 这个设置——它确保 Xray 只接受来自本机(Nginx)的连接。即使有人知道了端口号,也无法从外部直接连接 Xray。
启动 Xray
确认输出中有 Active: active (running)。如果启动失败,检查配置文件 JSON 格式:
配置 Nginx
这是整个方案最关键的部分——Nginx 同时处理代理流量和正常网站流量。
创建站点配置
写入:
配置解析
WebSocket 转发关键点:
| 配置项 | 为什么需要 |
|---|---|
proxy_http_version 1.1 | WebSocket 需要 HTTP/1.1 |
Upgrade + Connection headers | 告诉后端升级为 WebSocket 连接 |
proxy_read_timeout 300s | WebSocket 长连接不能用默认的 60s 超时 |
回落伪装关键点:
| 配置项 | 为什么需要 |
|---|---|
proxy_pass http://127.0.0.1:3000 | 非代理请求转发给正常网站 |
proxy_redirect 两行 | 修复 Next.js 重定向带端口号的问题 |
proxy_redirect 必须同时写 http:// 和 https:// 两条!Next.js 的 i18n 中间件可能生成 https://domain:3000/zh 的重定向,只写 http 的规则匹配不到 https 开头的 Location header。这是一个非常隐蔽的坑。
启用配置
配置 Cloudflare
DNS 记录
在 Cloudflare 控制台添加 DNS 记录:
| Type | Name | Content | Proxy |
|---|---|---|---|
| A | proxy | 你的VPS IP | Proxied(橙色云朵) |
橙色云朵(Proxied)是关键——它让流量经过 Cloudflare CDN,隐藏你的真实 VPS IP。如果用灰色云朵(DNS Only),你的 IP 就暴露了。
SSL/TLS 模式
SSL/TLS → Overview → 设为 Full 或 Full (Strict)
| 模式 | 含义 | 适用情况 |
|---|---|---|
| Flexible | Cloudflare→VPS 用 HTTP | ❌ 不安全 |
| Full | Cloudflare→VPS 用 HTTPS(不验证证书) | ✅ 可用 |
| Full (Strict) | Cloudflare→VPS 用 HTTPS(验证证书) | ✅ 最安全 |
确认 WebSocket 开启
Network → WebSockets → 确认为 On(Cloudflare 免费版默认开启)。
客户端配置
Clash(YAML 格式)
v2rayN 配置
| 参数 | 值 |
|---|---|
| 地址 | proxy.example.com |
| 端口 | 443 |
| UUID | 你的 UUID |
| 加密 | none |
| 传输协议 | ws |
| 路径 | /你的随机路径 |
| TLS | 开启 |
| SNI | proxy.example.com |
| 跳过证书验证 | 否 |
skip-cert-verify 必须设为 false(关闭)! 走 Cloudflare CDN 时,证书是 Cloudflare 颁发的正规证书,不需要跳过验证。设为 true 反而可能导致某些客户端走异常的 TLS 流程,出现连接超时。
验证部署
检查 Xray 是否运行
检查 Nginx WebSocket 转发
应该返回 101 Switching Protocols,说明 Xray 的 WebSocket 正常工作。
检查完整链路(从外部)
浏览器验证伪装效果
直接在浏览器打开 https://proxy.example.com——你应该看到和主站一模一样的网页。任何人(包括审查系统)访问这个域名,看到的就是一个正常运行的网站。
踩坑记录
以下是实际部署中遇到的真实问题:
问题一:开启 Cloudflare 橙色云朵后客户端连接超时
原因:开启 CDN 代理后,TLS 证书从你的 Origin Certificate 变成了 Cloudflare 颁发的正规证书。如果客户端配置了 skip-cert-verify: true,某些客户端会走不同的 TLS 握手路径,导致 Cloudflare 拒绝连接。
解决:客户端设置 skip-cert-verify: false,让 TLS 握手走标准流程。
问题二:访问代理域名被重定向到 :3000 端口
原因:Next.js 的 i18n 中间件生成重定向时带上了后端端口号(https://domain:3000/zh)。
解决:Nginx 配置中添加 proxy_redirect 规则,同时覆盖 http 和 https:
问题三:浏览器显示"连接不安全"
原因:Cloudflare DNS 记录使用了灰色云朵(DNS Only),浏览器直接连到 VPS,而 VPS 上的 Origin Certificate 不被浏览器信任(它只被 Cloudflare 信任)。
解决:将 DNS 记录切换为橙色云朵(Proxied),让流量经过 Cloudflare。
安全加固
隐藏 Xray 端口
确认 Xray 只监听 localhost:
如果显示 0.0.0.0:10001,说明配置中 listen 没写 127.0.0.1,需要修复。
防火墙规则
只开放必要端口:
不要开放 10001 端口——Xray 只需要本地访问。
定期更新 Xray
与 Reality 方案的对比
搭建完成后,你现在有了两套方案可选:
| 维度 | VLESS + WS + TLS + CDN(本章) | VLESS + Reality(第二章) |
|---|---|---|
| IP 隐藏 | ✅ IP 在 CDN 后面 | ❌ IP 暴露 |
| 抗 IP 封锁 | ✅ IP 被封换 CDN 节点即可 | ❌ IP 被封需要换 VPS |
| 性能 | 较好(多一层 WS + CDN 开销) | 极佳(TCP 直连) |
| 抗主动探测 | 强(回落到正常网站) | 最强(回落到大站真实内容) |
| 部署复杂度 | 中等(需要域名 + CDN + 证书) | 低(不需要域名) |
| 推荐用法 | 主力方案(IP 安全) | 备用方案(性能优先) |
最佳实践:日常使用 WS + CDN 方案(本章),保护 VPS IP 不被暴露。当需要极致性能(如大流量下载、实时游戏)时,临时切换到 Reality 方案。
小结
本章完成了一套生产级的代理部署:
- Xray:运行 VLESS 协议,监听本地 WebSocket 端口
- Nginx:按路径分流——代理路径转发给 Xray,其余回落到正常网站
- Cloudflare CDN:隐藏 VPS 真实 IP,提供免费 SSL 证书
- 客户端:标准 VLESS + WS + TLS 配置
这套方案的核心优势是三重伪装:
- 流量伪装:看起来是普通的 HTTPS WebSocket 连接
- 域名伪装:走 CDN,和正常网站一样
- 回落伪装:直接访问域名看到的是真实运营的网站
任何外部观察者都无法区分这个域名上的代理流量和正常网站流量。