# 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`(最终可导入节点)。