官方文档:Xray-core 讨论区长文《XHTTP: Beyond REALITY》 · XHTTP 配置文档 · 作者图文教程:3X-UI XHTTP 上下行分离教程(Joey Blog) · 在线填写器:joeyblog.net/xhttp.html · 视频教程:Joey blog(见文末)
先把这篇的定位说清,免得和本站前几篇搞混:CFNext、CFnew 在 Cloudflare Workers 里发的 XHTTP 节点,是 Workers 侧的简化实现(cfnew 的 XHTTP 写死 stream-one 模式);而 XHTTP 的「完全体」是 VPS 上 Xray-core 的玩法——尤其是它的招牌能力上下行分离(上传走一条路、下载走另一条路),靠客户端的 downloadSettings 实现,Workers 侧做不了。本文按 Joey blog 官方图文(2026-11-02,含双机实测)把原理、三种模式、双 VPS 中转与分离的完整配置步骤写全。提醒:本项目供学习与网络技术研究,请遵守当地法律法规。
(说明:原站图文对程序化抓取有限制,步骤截图未能取用,本文配图为官方视频封面;逐步界面可对照文末图文原文与视频。)
XHTTP 是什么,和 WebSocket 有什么区别
XHTTP 是 Xray-core 的新一代传输协议,把代理流量装进 HTTP 请求里。相比老牌的 WebSocket(WS)传输:
- 原生上下行分离:上传和下载可以走不同的连接、不同的路径甚至不同的机器(靠
downloadSettings指定下行),WS 做不到 - 三种工作模式(见下表),从「兼容一切」到「最简单粗暴」可选
- 带 XMUX 多路复用、header padding(头部填充)等设计;原生支持 HTTP/3(QUIC)
- 按 Joey 视频的口径:Xray 官方已提示 WebSocket 将被逐步淘汰,过 CDN 的主流传输正在转向 XHTTP——这也是 CFNext/cfnew 都主推 XHTTP 的原因
三种模式(先选对,再填参数)
| 模式 | 工作方式 | 兼容性与适用场景 |
|---|---|---|
packet-up | 上行分包 POST(一个个小包发)+ 下行流式 GET | 兼容性最高,几乎能过所有 CDN / 反代 |
stream-up | 上行流式 POST + 下行流式 GET | TLS + HTTP/2 场景、过 CDN 常用 |
stream-one | 单个 POST 连接双向流 | 最简单、兼容性最低;过 Cloudflare 需开 gRPC,过 Nginx 需 grpc_pass |
mode 填 auto(默认)时 Xray 自动选:TLS + HTTP/2 → stream-up;REALITY → stream-one;其它 → packet-up。一般只需要填好 path(路径),其余参数留空用默认即可。一个高频踩坑点:path 末尾要带 /(如 /joey-xhttp-demo/),两端不一致就连不上——服务端、客户端、下载连接三处 path 必须逐字相同。
三种组网方案(本篇实操的主线)
准备两台 VPS:一台做入口 A(离你近、线路好,只做转发),一台做落地 B(真正出口,跑 VLESS + XHTTP + REALITY)。三种用法的数据路径:
| 方案 | 上传路径 | 下载路径 |
|---|---|---|
| 直连 | 客户端 → B | B → 客户端 |
| 整条中转 | 客户端 → A → B | B → A → 客户端 |
| 上下行分离 | 客户端 → B(直达) | B → A → 客户端 |
分离的关键原理:客户端主连接直达 B 上传,同时额外经 A 向 B 建立一条下载连接;两条连接必须以同一 path 抵达 B 的同一个 XHTTP 入站才属于同一个会话。所以 A 只做 Tunnel(隧道)透传转发,不需要另一套 VLESS 用户和 REALITY 参数。入口地址变了,最终出口仍是 B 的 IP。
准备工作
本篇对应作者实测版本(新版本字段可能微调,以官方文档为准):
| 软件 | 版本 |
|---|---|
| 3X-UI(官方) | v3.11.0 |
| 服务端 Xray | v26.10.21 |
| v2rayN(客户端) | v7.23.4 |
- 两台 VPS 都装好 3X-UI。Debian / Ubuntu 新机器用 root 执行(固定本期版本):
apt update
apt install -y curl
curl -fL https://raw.githubusercontent.com/MHSanaei/3x-ui/v3.11.0/install.sh -o /tmp/3x-ui-install.sh
bash /tmp/3x-ui-install.sh v3.11.0跟着提示设面板账户、端口、登录路径与 HTTPS。已有面板的先备份配置,别把安装命令当新增面板重跑。
- 客户端用 v2rayN(官方项目下载),必须支持 XHTTP 与
downloadSettings、能保留 XHTTP Extra(扩展参数)的 Xray 内核,只会导入普通 VLESS 节点不够 - 防火墙/安全组放行:入口 A 的节点端口、落地 B 的节点端口都要对客户端可达(分离时 B 的端口必须允许客户端直达,不能只放行 A)
- 示例参数(文中统一口径,实际换成你自己的):A 地址
192.0.2.10、端口24443;B 地址198.51.100.20、端口26443;XHTTP path/joey-xhttp-demo/(文档示例 IP 不能连接)
第一步:在落地 B 建 XHTTP 入站
打开 B 的 3X-UI →「入站」→「添加入站」,按标签依次填:
基础配置
| 字段 | 填法 |
|---|---|
| 备注 | 写清用途,如 XHTTP 落地 |
| 协议 | VLESS |
| 地址 | 0.0.0.0(监听所有网卡;客户端连的是 B 的公网 IP/域名,别把 0.0.0.0 填到客户端) |
| 端口 | 26443 或你的空闲端口 |
传输标签
| 字段 | 填法 |
|---|---|
| 传输 | XHTTP |
| 路径 path | /joey-xhttp-demo/(末尾带 /,后面处处对齐) |
| 模式 mode | auto |
| Host | 本例留空 |
| 缓冲 / Padding / XMUX | 先保留默认,跑通再调 |
安全标签:选 REALITY,配目标(dest)与 SNI——本期用 www.microsoft.com:443、SNI www.microsoft.com(换目标要选符合 REALITY 要求、从 B 可达的站点,SNI 同步给客户端);生成密钥后私钥留服务器、公钥给客户端,记下 Short ID。再给入站加一个 VLESS 用户并记录 UUID;flow 留空,不要带入 TCP+REALITY 节点的 xtls-rprx-vision。
保存后,先把这个落地节点导入 v2rayN 直连 B 测试:网页能开、出口显示为 B,再往下走。直连不通时不要加中转和分离。
第二步:在入口 A 建 Tunnel 转发
切到 A 的 3X-UI,新建 Tunnel 入站,端口 24443,「协议」标签填:
| 字段 | 填法 |
|---|---|
| 重写地址 | 落地 B 的公网 IP 或域名(示例 198.51.100.20) |
| 重写端口 | B 的节点端口 26443 |
| 允许的网络 | 本方案选 TCP 即可(XHTTP + REALITY 底层走 TCP) |
A 不需要建 VLESS 用户、不需要 REALITY 参数——它只把数据转给 B,由 B 完成认证与处理。
第三步:客户端先跑通「整条中转」
- 复制第一步已测通的落地节点,备注改成「入口中转」
- 只改两处:address → A 的地址;port →
24443 - UUID、SNI、公钥、Short ID、XHTTP path 全部沿用落地节点;传输仍是 xhttp、模式 auto、flow 留空
- 切到该节点验证:网页可开,且出口仍是 B(直连与中转出口必须一致)
到这里双机中转已完整可用。速度满意的话可以先停在这一步,分离是下一步的进阶选项,不是必修课。
第四步:上下行分离(用在线填写器生成)
分离从落地直连节点改起:主连接保持去 B,只把下载连接指向 A。
- 打开在线填写器(生成在浏览器本地完成,不上传、不保存参数;页面提供离线版下载)
- 填两组信息:落地地址/端口、入口地址/转发端口;以及落地节点的 UUID、REALITY 公钥、SNI、Short ID、XHTTP path
- 点「生成节点和 Extra」→「复制节点」,在 v2rayN 里从剪贴板导入
- 导入后逐项核对(最容易填反的是主地址):
| 位置 | 必须是什么 |
|---|---|
| 节点主 address / port | 落地 B / 26443(主地址留在落地!) |
| 主连接传输 / 安全 | xhttp / reality |
| XHTTP Extra 最外层 | downloadSettings |
downloadSettings.address / port | 入口 A / 24443 |
| 下载连接的 REALITY 参数 | B 的 SNI、公钥、Short ID |
| 两条连接的 XHTTP path | 同一个值,与 B 的入站一致 |
已有落地节点时,也可以只把填写器生成的 Extra 粘到该节点的「XHTTP Extra」里——不要再包一层 extra,也不要把完整节点 JSON 塞进这个框。下载连接的传输仍是 XHTTP;拿普通 TCP+REALITY 的配置塞进来不会变成同一个 XHTTP 会话。
作者实测结果(如实引用,别当承诺)
同一台电脑、同一网络、相邻时段,用 FAST(fast.com)网页测速(测速服务器由 FAST 自动选择,三次出口均为 B):
| 方案 | 下载 Mbps | 上传 Mbps | 空载延迟 ms | 负载延迟 ms |
|---|---|---|---|---|
| 直连落地 | 440 | 59 | 270 | 293 |
| 整条中转 | 920 | 52 | 186 | 209 |
| 上下行分离 | 880 | 57 | 197 | 208 |
作者的结论:这轮先选整条中转。分离能用、也比直连快,但没有超过中转;上传反而是直连更高。分离不是必然更快——它的价值在于「上行线路和下行线路质量不对称」时各走最优路径,你的网络是否受益,要用自己的三条节点实测对比,别照搬别人的数字。分离节点下实测 YouTube 2160p60(4K60)播放:实际分辨率 3840×2160@60、掉帧 0、缓冲 12 秒以上,可流畅播放。
常见问题与排查(三层定位)
一口气配完三层再排错最容易乱。保留一条已测通的节点,按层找起点:
| 现象 | 先检查什么 |
|---|---|
| 落地直连就不通 | B 的入站监听、系统防火墙与云安全组;UUID、SNI、公钥、Short ID、path 五件套是否逐字一致;flow 是否留空 |
| 直连通、中转不通 | A 的入口端口是否可达;Tunnel 重写地址是否为 B、重写端口是否为 B 的节点端口 |
| 中转通、分离不通 | 主地址是否仍为 B;Extra 是否被客户端保留;downloadSettings 是否在最外层;两条连接是否回到同一个 XHTTP 入站(path 是否一致) |
| 能连但测速数字不对劲 | 浏览器是否真走了当前节点;是否还有另一款客户端或 TUN 在接管流量;网页查到的出口是否确实为 B |
补充:系统代理与 TUN 尤其要留意——切了 v2rayN 的节点,不代表浏览器一定跟着走,先看测试页显示的出口再记录速度。想撤回分离,切回保留的直连/中转节点最省事;在分离节点上清空 XHTTP Extra(主地址仍是 B)恢复的是落地直连。
视频教程
- 作者官方视频:XHTTP 传输协议快速上手:双机中转+上下行分离(Joey blog)——封面见本文开头配图
- 作者图文版:3X-UI XHTTP 上下行分离教程(Joey Blog)——逐步截图以图文版为准
- 前作(扩展阅读):上行 CF + 下行 AWS 的分离方案
- 前作:纯 CloudFront 版 XHTTP——专讲两个坑:CloudFront 侧 SSL/TLS 必须设「完全」、网络里要开 gRPC
和 CFNext / CFnew 里 XHTTP 的关系
- 相同点:都是 XHTTP 传输、都用 path 区分入站、客户端侧(v2rayN 的 XHTTP 设置、mode 选择、path 对齐)的知识完全通用
- 不同点:Workers 侧实现跑在 Cloudflare 上,cfnew 只做 stream-one、CFNext 面板直接发节点,胜在零成本零维护;但双机中转、downloadSettings 上下行分离、REALITY 直连落地都是 VPS 上 Xray-core 才有的能力
- 选择建议:纯免费、轻量使用 → CFNext/cfnew;有 VPS 且追求线路优化与可控性 → 本篇的 Xray 玩法
资料来源
- 作者图文教程(2026-11-02,含版本与实测数据):https://joeyblog.net/3x-ui-xhttp-split.html
- Xray-core 官方讨论长文:https://github.com/XTLS/Xray-core/discussions/4113
- XHTTP 配置文档(官方文档镜像):https://lcuwx2016.github.io/xtls/config/transports/xhttp.html
- 双 VPS 分离踩坑讨论:https://github.com/XTLS/Xray-core/discussions/4271
- 在线填写器:https://joeyblog.net/xhttp.html
还没有评论,来抢沙发。