本文为在自有服务器上进行合法网络实验的操作记录,仅供学习参考,请遵守所在地的法律法规。
上一篇 VLESS、REALITY 与 CDN 讲清了原理,这篇就动手:同一台 VPS,分别把 REALITY(直连、无需域名) 和 WS + CDN(藏源站、需要域名) 跑起来。两套都基于 Xray,核心差别只在 streamSettings。
准备工作
- 一台境外 VPS(Debian / Ubuntu 为例),有 root 权限;
- 安全组 / 防火墙放行 443 端口;
- WS + CDN 方案还需要一个域名 + 一个 Cloudflare 账号。
先用官方脚本装好 Xray:
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
配置文件在 /usr/local/etc/xray/config.json,改完用 systemctl restart xray 重启。
方案一:VLESS + REALITY(直连,无需域名)
REALITY 不需要域名和证书,最省事,适合 IP 还没被封的新机器。
第 1 步:生成所需的密钥和 ID
xray uuid # 生成 UUID(客户端身份)
xray x25519 # 生成一对密钥:Private key / Public key
openssl rand -hex 8 # 生成 shortId
记下:UUID、Private key(服务端用)、Public key(客户端用)、shortId。
第 2 步:服务端配置
{
"inbounds": [
{
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{ "id": "<UUID>", "flow": "xtls-rprx-vision" }
],
"decryption": "none"
},
"streamSettings": {
"network": "tcp",
"security": "reality",
"realitySettings": {
"dest": "www.microsoft.com:443",
"serverNames": ["www.microsoft.com"],
"privateKey": "<Private key>",
"shortIds": ["<shortId>"]
}
}
}
],
"outbounds": [{ "protocol": "freedom" }]
}
几个关键参数的含义:
decryption: none:VLESS 自身不加密,这里固定写none(加密交给 REALITY/TLS);flow: xtls-rprx-vision:XTLS Vision 流控,避免「TLS 套 TLS」的双重加密开销,REALITY/直连 TLS 专用;dest/serverNames:要「借用」的真实网站,两者必须一致。选一个真实存在、支持 TLS 1.3、且本地不被墙的大站当「门面」;privateKey:REALITY 密钥对里的私钥,留在服务端;对应的公钥(Public key)给客户端;shortIds:客户端识别码,可留空""或填上面生成的值,服务端可配置多个区分不同客户端。
第 3 步:客户端关键参数
| 参数 | 值 | 作用 |
|---|---|---|
| Address / Port | VPS 的 IP / 443 | 直连服务器,不经过域名 |
| UUID | 上面生成的 | 客户端身份,须与服务端一致 |
| flow | xtls-rprx-vision | 与服务端对应的 Vision 流控 |
| security | reality | 启用 REALITY |
| SNI | www.microsoft.com | 握手时伪装成的「门面」网站,须等于服务端 serverNames |
| publicKey (pbk) | 上面生成的 Public key | 与服务端私钥配对,完成认证 |
| shortId (sid) | 上面生成的 | 须是服务端 shortIds 里的一个 |
| fingerprint (fp) | chrome | 模拟的 TLS 指纹,让握手看起来像 Chrome 浏览器 |
用分享链接一键导入
除了手填,更常见的是直接导入一条 vless:// 链接(v2rayN、v2rayNG、NekoBox 等都支持「从剪贴板导入」)。REALITY 节点的链接格式:
vless://<UUID>@<VPS-IP>:443?encryption=none&flow=xtls-rprx-vision&security=reality&sni=www.microsoft.com&fp=chrome&pbk=<Public key>&sid=<shortId>&type=tcp#REALITY节点
? 后面的每个参数就对应上表里的一项,# 后面是节点备注名。重启 systemctl restart xray,导入后连上就能用。
方案二:VLESS + WS + CDN(藏源站,需要域名)
当机器 IP 容易被封时,用 Cloudflare 把源站藏起来。
这套方案比 REALITY 多了一个组件 Nginx。它是最常用的 Web 服务器 / 反向代理,在这里干两件事:
- 在 443 端口提供带证书的 HTTPS(CDN 回源要求源站是合法 HTTPS,而 Xray 的 WS 只是裸 WebSocket);
- 只把约定好的密钥路径(如
/mypath)反代给本地 Xray,其余路径返回一个普通网页,伪装成正常网站。
Nginx 需要你自己准备证书。不过我们本来就在 Cloudflare 后面,直接用 Cloudflare 免费的**源站证书(Origin Certificate)**最省事——它由 Cloudflare 签发、有效期长达 15 年,只需被 CDN 信任即可。
第 1 步:Cloudflare 解析 + 源站证书
- 把域名的 A 记录指向 VPS IP,开启橙色云(代理);
- SSL/TLS 模式选 Full (strict);
- 在面板 SSL/TLS → Origin Server → Create Certificate 生成证书,把证书和私钥分别存到
/etc/ssl/cf-origin.pem和/etc/ssl/cf-origin.key。
不想用源站证书,也可以用
acme.sh配合 Cloudflare DNS API 申请 Let’s Encrypt 证书,后面 Nginx 配置同理。
第 2 步:Xray 监听本地 WS
{
"inbounds": [
{
"listen": "127.0.0.1",
"port": 10000,
"protocol": "vless",
"settings": {
"clients": [{ "id": "<UUID>" }],
"decryption": "none"
},
"streamSettings": {
"network": "ws",
"wsSettings": { "path": "/mypath" }
}
}
],
"outbounds": [{ "protocol": "freedom" }]
}
注意 WS 方案不需要 flow(Vision 只用于 REALITY/直连 TLS)。
第 3 步:Nginx HTTPS + 反代
/etc/nginx/conf.d/proxy.conf:
server {
listen 443 ssl;
http2 on;
server_name your.domain.com;
ssl_certificate /etc/ssl/cf-origin.pem;
ssl_certificate_key /etc/ssl/cf-origin.key;
# 密钥路径反代给本地 Xray
location /mypath {
proxy_pass http://127.0.0.1:10000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; # WebSocket 升级
proxy_set_header Connection "upgrade"; # WebSocket 升级
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 其余路径返回普通页面做伪装
location / {
return 200 "hello";
}
}
这里最容易漏的是 Upgrade / Connection "upgrade" 两个头——没有它们 WebSocket 握不上手,Nginx 反代 WebSocket 必须手动加上。改完 nginx -t 测试语法,再 systemctl restart nginx。
第 4 步:客户端关键参数
| 参数 | 值 | 作用 |
|---|---|---|
| Address | 域名(也可填 Cloudflare 优选 IP) | 连的是 Cloudflare 节点,不是源站 |
| Port | 443 | CDN 对外的 HTTPS 端口 |
| UUID | 与服务端一致 | 客户端身份 |
| security | tls,SNI = 域名 | 与 CDN 之间走标准 HTTPS |
| network | ws,path = /mypath | WebSocket 传输;path 须和服务端、Nginx 完全一致 |
| host | 域名 | WS 的 Host 头;填优选 IP 时必须写域名,CDN 靠它判断回源到哪个站 |
用分享链接一键导入
WS + CDN 节点的 vless:// 链接格式:
vless://<UUID>@<域名或优选IP>:443?encryption=none&security=tls&sni=<域名>&type=ws&host=<域名>&path=%2Fmypath#WS-CDN节点
注意 path 在链接里要做 URL 编码:/mypath 写成 %2Fmypath。WS 方案不带 flow(Vision 只用于 REALITY/直连 TLS)。
验证与排错
systemctl status xray nginx # 两个服务是否都在跑
journalctl -u xray -e # 看 Xray 报错日志
nginx -t # 检查 Nginx 配置语法
ss -tlnp | grep -E '443|10000' # 端口是否监听
常见坑:
- REALITY 连不上:多半是客户端
publicKey/shortId/SNI和服务端对不上。 - WS + CDN 502 / 握手失败:检查 Nginx 是否写了
Upgrade/Connection头、path是否和 Xray 完全一致、Cloudflare 是否橙云且 SSL 模式为 Full (strict)。 - 能连但不通:确认 VPS 防火墙和云厂商安全组都放行了 443。
小结
- 两套方案 Xray 配置的差异,几乎只在
streamSettings:REALITY 走tcp + reality,CDN 走ws,外面套一层 Nginx/CDN 的 TLS; - 新机器、要速度 → 先上 REALITY;
- IP 被盯上、要藏源站 → 换 WS + CDN;
- 建议两套都配好,按网络情况随时切换——这也正好对应上一篇的选型结论。