Files

186 lines
7.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# fast-xray
节点配置要求见 [docs/NODE_CONFIGURATION.md](docs/NODE_CONFIGURATION.md)。
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["客户端<br/>fast-xray"]
subgraph CF["Cloudflare 任播网络"]
direction TB
IP1["CF IP A"]
IP2["CF IP B"]
IP3["CF IP …(最优)"]
end
Origin["源站<br/>VLESS 服务端"]
Dest["目标<br/>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`
只要一个够快的 IP,用 `easy`——边发现边测速,第一个达标即停:
```bash
fast-xray easy --node-file node.txt --speed 5
```
各阶段也可单独运行用于调试或定制。
## 流水线
```mermaid
flowchart LR
CF["CF IP 段"] -->|ping| A["ip.txt<br/>N 个有效 IP"]
A -->|latency| B["latency.csv<br/>最快 M 个"]
B -->|speed| C["speed.csv<br/>最优 K 个"]
C -->|export| R["result.txt<br/>可导入节点"]
```
| 阶段 | 输入 | 处理 | 输出 |
| --- | --- | --- | --- |
| `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 使用各阶段默认的超时、并发、丢包等参数;需精调时单独运行子命令。
### easy — `fast-xray easy [NODE] --speed <MB/s> [OPTIONS]`
只要一个够快的 IP 就停。后台持续用 `ping + latency` 补充有效 IP 队列(低于 30 时补到 50);前台用 5 个独立 worker 并发筛,谁测完谁立刻取下一个,互不等待。并发下直接达到 `--speed` 的直接命中;有潜力的(≥ `目标/5`)记入确认队列,等手头这批并发跑完后再**逐个单独(无并发)**测速确认真实速度,第一个达标的即为结果,直接输出可复制的节点。
先直连国内镜像(清华 TUNA)做一次 8 秒的不走代理下载测速,作为带宽上限:`--speed` 高于它直接判定不可能;镜像偶发不可用则跳过、照常搜索。搜索中每累计 100 次失败会重测一次直连速度,本机链路变慢时按新值下调默认目标(显式 `--speed` 则不动)。
| 参数 | 默认 | 说明 |
| --- | --- | --- |
| `[NODE]` / `--node-file` | — | 节点 URL,或从文件读取 |
| `--speed` | 直连×80% | 目标下载速度 MB/s,返回首个达标 IP;不填则取直连测速的 80% |
| `--max` | 100 | 最多遍历多少个**有效** IP(通过 ping + latency);用尽仍无达标即「找不到」 |
| `-6, --ipv6` | off | 同时搜索 IPv6 |
| `-o, --output` | result | 输出目录(写 result.txt) |
固定参数:ping 并发 100、≤200ms;latency 并发 10、≤200ms;测速 5 路并发筛、有潜力的单独确认、每次上限 5s;有效队列水位 30/50。
### 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 | 丢包率上限 01 |
| `-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`(最终可导入节点)。