# fast-xray
Cloudflare 优选 IP 工具,面向 CDN 落地的 VLESS 节点。纯 Rust,内置 `VLESS + WebSocket + TLS` 客户端,**无需 xray**。
从 Cloudflare 的 IP 段中筛出延迟低、下载快的 IP,输出可直接导入的节点(别名 `速度-延迟-ip`,如 `12.34M-156ms-104.19.53.168`)。
## 原理
节点经 Cloudflare 反代(橙云)时,任意 CF IP 都接受其 TLS 连接,回源由 **TLS SNI** 与 **WebSocket Host** 决定。优选只替换连接 IP,SNI / Host 保持原域名,即可在等价的 CF IP 中择优。
**网络拓扑**
```mermaid
flowchart LR
Client["客户端
fast-xray"]
subgraph CF["Cloudflare 任播网络"]
direction TB
IP1["CF IP A"]
IP2["CF IP B"]
IP3["CF IP …(最优)"]
end
Origin["源站
VLESS 服务端"]
Dest["目标
generate_204 · cachefly"]
Client -.->|探测候选| IP1
Client -.->|探测候选| IP2
Client ==>|"选最优 · TLS"| IP3
IP1 --> Origin
IP2 --> Origin
IP3 ==>|"SNI / Host = 原域名"| Origin
Origin --> Dest
```
不同候选 IP 仅是进入 Cloudflare 的入口不同,均回到同一源站;优选即在其中挑延迟低、速度快的入口。
**隧道分层**
```mermaid
flowchart TB
A["TCP — 候选 CF IP:443"]
B["TLS — SNI = 原域名"]
C["WebSocket — Host = 原域名, path = 原 path"]
D["VLESS 头 — uuid + 目标地址"]
E["内层 TLS + HTTP — 测延迟 / 下载测速"]
A --> B --> C --> D --> E
```
其中 SNI 与 Host 始终为原域名,候选 IP 仅决定流量从哪个 Cloudflare 入口进入。
## 适用范围
仅支持 `VLESS + ws + tls`、`encryption=none`、无 flow / Vision 的 CDN 落地节点。
Reality 直连源站、不经 CDN,不适用本工具。
## 使用
完整流程(无子命令即 auto):
```bash
fast-xray --node-file node.txt -n 50 --lat-top 30 --speed-top 10
```
节点 URL 含 `&`,可直接加引号传入,或用 `--node-file` 从文件读取。结果写入 `result/result.txt`。
各阶段也可单独运行用于调试或定制。
## 流水线
```mermaid
flowchart LR
CF["CF IP 段"] -->|ping| A["ip.txt
N 个有效 IP"]
A -->|latency| B["latency.csv
最快 M 个"]
B -->|speed| C["speed.csv
最优 K 个"]
C -->|export| R["result.txt
可导入节点"]
```
| 阶段 | 输入 | 处理 | 输出 |
| --- | --- | --- | --- |
| `ping` | CF IP 段 | TCP 443 探测,收集 N 个低延迟有效 IP | `ip.txt` |
| `latency` | `ip.txt` | 建隧道测真实代理延迟 | `latency.csv` `latency.txt` |
| `speed` | `latency.csv` | 下载测速,按速度档 + 延迟排序 | `speed.csv` `speed.txt` |
| `export` | 任一 IP 文件 | 生成可导入节点 | `result.txt` |
`auto` 即依次执行上述四步,中间结果同时落盘。
## 命令参考
### auto — `fast-xray [NODE] [OPTIONS]`
| 参数 | 默认 | 说明 |
| --- | --- | --- |
| `[NODE]` / `--node-file` | — | 节点 URL,或从文件读取 |
| `-n, --count` | 50 | 阶段 1 收集的有效 IP 数 |
| `--lat-top` | 0 | 阶段 2 保留的最快 IP 数(0 = 全部) |
| `--speed-top` | 0 | 最终节点数(0 = 全部) |
| `--speed-concurrency` | 1 | 测速并发数(1 最准,调大更快) |
| `-6, --ipv6` | off | 同时测 IPv6 |
| `--ping-max` | 300 | 第一次 ping(TCP)延迟上限 ms |
| `--lat-max` | 0 | 第二次 ping(真实延迟)上限 ms(0 关闭) |
| `--min-speed` | 0 | 最低速度 MB/s(0 关闭) |
| `-o, --output` | result | 输出目录 |
| `-v, --verbose` | off | 打印各阶段结果表 |
auto 使用各阶段默认的超时、并发、丢包等参数;需精调时单独运行子命令。
### ping — `fast-xray ping [OPTIONS]`
| 参数 | 默认 | 说明 |
| --- | --- | --- |
| `-n, --count` | 50 | 目标有效 IP 数,达成即停 |
| `-t, --timeout` | 3 | TCP 连接超时(秒) |
| `-c, --concurrency` | 100 | 并发数 |
| `-6, --ipv6` | off | 同时测 IPv6 |
| `-p, --port` | 443 | 探测端口 |
| `--max-probe` | count×100 | 探测预算上限 |
| `--times` | 1 | 每 IP 探测次数(`>1` 启用丢包过滤) |
| `--min` / `--max` | 10 / 300 | 平均延迟区间 ms |
| `--max-loss` | 0 | 丢包率上限 0–1 |
| `-o` / `-v` | result | 输出目录 / 结果表 |
### latency — `fast-xray latency [NODE] [OPTIONS]`
| 参数 | 默认 | 说明 |
| --- | --- | --- |
| `[NODE]` / `--node-file` | — | 节点 |
| `-i, --input` | result/ip.txt | 输入 IP 列表 |
| `-c, --concurrency` | 50 | 并发隧道数 |
| `-t, --timeout` | 5 | 单 IP 超时(秒) |
| `--max` | 0 | 真实延迟上限 ms(0 关闭) |
| `-p, --top` | 0 | 保留最快 N(0 全部) |
| `-o` / `-v` | result | 输出目录 / 结果表 |
### speed — `fast-xray speed [NODE] [OPTIONS]`
| 参数 | 默认 | 说明 |
| --- | --- | --- |
| `[NODE]` / `--node-file` | — | 节点 |
| `-i, --input` | result/latency.csv | 输入(IP + 延迟) |
| `-c, --concurrency` | 1 | 并发下载数 |
| `-t, --timeout` | 10 | 单 IP 下载上限(秒) |
| `--bytes` | 10000000 | 每 IP 下载字节数 |
| `--min` | 0 | 最低速度 MB/s(0 关闭) |
| `-p, --top` | 0 | 保留最优 N(0 全部) |
| `-o` / `-v` | result | 输出目录 / 结果表 |
排序:速度每 0.1 MB/s 一档,先比档位,同档按延迟升序。
### export — `fast-xray export [NODE] [OPTIONS]`
| 参数 | 默认 | 说明 |
| --- | --- | --- |
| `[NODE]` / `--node-file` | — | 节点 |
| `-i, --input` | result/ip.txt | 有效 IP(纯 IP 或 CSV,取首列) |
| `-o, --output` | result | 输出目录 |
别名按输入列自动适配:`speed.csv → 速度-延迟-ip`,`latency.csv → 延迟-ip`,纯 IP `→ ip`。
## 输出
默认写入 `result/`:`ip.txt`、`latency.{csv,txt}`、`speed.{csv,txt}`、`result.txt`(最终可导入节点)。