WebSocket 快被 Xray 内核标记废弃了,现在过 CDN 主流用 XHTTP。这篇讲它一个实用特性——上下行分离:上行和下行各走一条线路,把两边的长处占上。
下面给两套方案,各自独立、照着做就行:
- 方案一:上行 Cloudflare + 下行 CloudFront。
- 方案二:全程只用 CloudFront(上行免费套餐 + 下行按量),不碰 Cloudflare,步骤更省。
先说共同的原理和准备,再分开讲。
原理
你的设备 ──上行──▶ 源站(你的 VPS + Xray) ▲ │ └──────下行◀─────────┘
客户端同时连上行和下行:请求经上行到源站,数据从下行拉回来。服务端只要一个 XHTTP 入站,分离靠客户端的 downloadSettings 完成。所谓”上行”是你把数据传到 CDN、再由 CDN 回源到你的服务器,对 AWS 来说这段是免费的——这也是能白嫖不出账单的原因。
准备工作(两套通用)
- 一个 AWS 账号(开 CloudFront)。注册要张信用卡,虚拟卡也行;新号一般有 200 刀赠金,就算偶尔扣费也先扣赠金,不用太紧张。
- 一台 VPS 当源站。
- 一个域名。方案一需要托管在 Cloudflare;方案二用来给节点签证书即可。
注册 AWS 有个坑:用虚拟卡(比如 Bybit 的卡)时,注册地区要和你的出口 IP 地区一致,否则容易触发风控。
搭节点(两套通用,3X-UI)
VPS 上装节点。可选先装 BBR(脚本 https://github.com/byJoey/Actions-bbr-v3 )。面板用 3X-UI(https://github.com/MHSanaei/3x-ui )。
先申请证书:跑面板脚本选申请证书,它让你输域名时先别急着输——去 DNS 把域名解析到服务器 IP,解析生效后再输、端口默认 80、等签发。
签好后加入站:
- 传输选 XHTTP,mode 选 stream-up。
- path 后面一定要带斜杠,比如 `/abc/`。不加斜杠连不上,这是重灾区,务必注意。
- 安全选 TLS(过 CDN 没法用 reality),证书选「从面板获取」。
- 加一个客户端(UUID)。
先测直连通不通。通常通,但延迟偏高——这正是要解决的。
方案一:上行 Cloudflare + 下行 CloudFront
这套上行走 Cloudflare(免费、上传稳),下行走 CloudFront(下载不限速)。多数人搭完连不通,问题都出在 Cloudflare 这边。
Cloudflare 侧
1. SSL/TLS 模式必须改成「完整」
到域名的 SSL/TLS → 概述,加密模式必须是「完整」(Full),灵活、完全严格都不行,不对就直接握手失败。
2. 开启「允许通过 gRPC 连接到源站」
同页面往下到「网络」,把「允许通过 gRPC 连接到您的源站」打开,和下面 CloudFront 的 gRPC 配套,不开不通。
3. 上行入口 + 端口重写
- 加一条 A 记录指向服务器 IP 当上行入口(可开橙云代理)。
- 建一条规则:主机名等于这个上行域名时,回源端口重写到节点的实际端口。
CloudFront 侧(下行)
进 AWS 控制台搜 CloudFront,创建分发:
- 源域名填节点域名,端口改成节点实际端口,源协议选 HTTPS(入站用了 TLS,回源就得走 HTTPS,明文 HTTP 回源会握手失败)。
- 缓存步骤启用 gRPC(必须,不开不通),缓存策略选关缓存(CachingDisabled)。
- 压缩对象关掉。建好后记下分配的 `dxxxx.cloudfront.net`。
生成配置
用工具 https://joeyblog.net/xhttp.html (打开先刷新一次):上行填 Cloudflare 域名、下行填 CloudFront 域名,下行 mode 选「跟随上行」,点生成。往下看”生成配置”一节。
方案二:全程只用 CloudFront(更省事)
上一套要配 Cloudflare。这套把上行也换成 CloudFront 的 100G 免费套餐,下行走 CloudFront 按量付费,全程不碰 Cloudflare,步骤简单不少。上行的 100G 免费额度能保证不出账单。
建两个 CloudFront 分发
上行分发(免费套餐):
- 创建分发时选免费套餐那个选项。
- 源域名填节点域名,端口改成节点实际端口,源协议选 HTTPS(入站是 TLS,回源必须 HTTPS)。
- 缓存步骤启用 gRPC(必须),缓存策略关缓存。
- 免费套餐没法关 WAF,直接下一步。
- 行为里把压缩对象关掉。
下行分发(按量付费):
步骤基本一样:域名、端口、启用 gRPC、关缓存都照做。区别是这档要把 WAF 关掉(不关可能产生费用),压缩对象也关掉。
建完你会有两个分发:一个免费(上行)、一个按量(下行),各自有一个 `dxxxx.cloudfront.net` 域名。
为什么必须开 gRPC:CloudFront 默认会缓冲整个请求体,XHTTP 的 stream-up 长连接会被卡住。开了 gRPC,CloudFront 走双向流式转发、不缓冲,stream-up 才能跑。这是 TLS + 过 CloudFront 最容易踩的坑。
生成配置
上行地址填免费套餐那个分发的域名、端口 443;下行地址填按量付费那个分发的域名。其余同下。
生成客户端配置(两套通用)
不用手写 JSON,用工具:https://joeyblog.net/xhttp.html
打开后先刷新一次页面(有 CDN 缓存),然后:
- 上行地址:方案一填 Cloudflare 域名、方案二填免费套餐分发域名,端口 443,host 和 SNI 都填。
- 下行地址:CloudFront(方案二是按量付费那个)分配的域名。
- 下行 mode 和入站一致,选「跟随上行」即可。
- 点「生成配置」。
工具会同时给出 Xray JSON、v2rayN、完整配置,以及小火箭链接 / v2rayN 链接:
- 小火箭:复制「小火箭链接」,App 自动识别。
- v2rayN:用「v2rayN 链接」直接导入;或复制「v2rayN」那段扁平 JSON,粘进 v2rayN 服务器设置里的 XHTTP Extra 框(地址/端口/UUID/TLS/SNI 在界面各自填)。
- 手搓:复制「完整配置」丢进 Xray 内核。
关于优选:如果速度慢,多半是需要优选。前提是 host 已经填好,然后把上行/下行地址换成优选域名即可;工具里也能直接用网页优选。优选只改”连到哪台机器”,握手 SNI 还是用真实域名。
两个变体玩法
如果你的服务器上行本身不错(比如移动/联通/电信的”快乐机”,晚高峰下载拉胯但上传和延迟还行),可以:
- 上行走服务器直连:复制一份配置,把上行域名改回你的服务器地址、端口改成节点端口。适合嫌 100G 上行不够用、且服务器上行给力的情况。
- 下行走服务器直连:同理,把下行字段改成服务器地址。
举一反三,上行下行哪条走 CDN、哪条走直连,按你的线路情况自由组合。
测速 + 费用
延迟能压到 50ms 出头,YouTube 4K 秒开、拽进度条几乎不加载,跑到三十几万码率没问题。费用上,上下行分离这套实测下来是免费的(上行走 CloudFront 免费额度、下行 AWS 这段不计上行费)。就算配置不当偶尔扣费,也先扣账户里的 200 刀赠金,不用太担心。
连不通先查这几样
- 方案一:Cloudflare 的 SSL/TLS 是不是「完整」、gRPC 开没开、端口有没有重写。
- 方案二:CloudFront 每个分发的 gRPC 有没有启用。
- 两套通用:path 后面有没有加斜杠、下行 mode 和入站一致没有。
一键脚本还在筹备,但更建议你先手动搭一遍,至少搞懂它是怎么回事。