本文为在自有服务器上进行合法网络实验的操作记录,仅供学习参考,请遵守所在地的法律法规。

上一篇 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

记下:UUIDPrivate 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 / PortVPS 的 IP / 443直连服务器,不经过域名
UUID上面生成的客户端身份,须与服务端一致
flowxtls-rprx-vision与服务端对应的 Vision 流控
securityreality启用 REALITY
SNIwww.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 服务器 / 反向代理,在这里干两件事:

  1. 在 443 端口提供带证书的 HTTPS(CDN 回源要求源站是合法 HTTPS,而 Xray 的 WS 只是裸 WebSocket);
  2. 只把约定好的密钥路径(如 /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 节点,不是源站
Port443CDN 对外的 HTTPS 端口
UUID与服务端一致客户端身份
securitytls,SNI = 域名与 CDN 之间走标准 HTTPS
networkws,path = /mypathWebSocket 传输;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;
  • 建议两套都配好,按网络情况随时切换——这也正好对应上一篇的选型结论。