HaizakiKu/quic-prober

GitHub: HaizakiKu/quic-prober

模拟 GFW 风格主动探测以检测 QUIC 代理服务器是否可被识别的命令行自检工具。

Stars: 0 | Forks: 0

# quic-prober 一个命令行工具,用于模拟 GFW 风格的针对 QUIC 代理服务器的主动探测。 向目标服务器和参考的真实 QUIC 服务器发送结构化的探测数据包,对比它们的响应,并揭示可能使目标被检测到的行为差异。 ``` quic-prober ──── probes ────→ Target (Hysteria2 / TUIC / etc.) ──── probes ────→ Reference (cloudflare.com) ←─── compare & report ─────────────────────── ``` ## 探测 | 探测 | 测试内容 | |-------|---------------| | `http3` | 完整的 HTTP/3 GET — 状态码、标头、响应时间 | | `tls` | 仅 TLS 握手 — ALPN、密码套件、证书链、ECH | | `replay` | 重放的 QUIC Initial 数据包 — 重放保护 | | `null` | 无流的 QUIC 握手 — 空闲行为和关闭代码 | | `random` | 11 种数据包大小(1–1500 字节)的随机 UDP — 垃圾拒绝 | | `malformed` | 5 个格式错误的 QUIC Initial — 错误处理一致性 | ## 安装 ``` go install github.com/HaizakiKu/quic-prober@latest ``` 或从源码构建: ``` git clone https://github.com/HaizakiKu/quic-prober cd quic-prober go build -o quic-prober . ``` **要求:** Go 1.24+ ## 用法 ``` # 基础扫描 quic-prober --target your-server.com:443 # 多个参考服务器,多数投票共识 quic-prober --target your-server.com:443 \ --reference cloudflare.com:443,google.com:443 \ --reference-mode majority # 仅运行特定 probe quic-prober --target your-server.com:443 --probes http3,tls # JSON 输出 quic-prober --target your-server.com:443 --json | jq . # 显示每个参考的原始结果 quic-prober --target your-server.com:443 --verbose ``` ### 标志 ``` --target host:port Target server (required) --reference host:port Comma-separated reference servers (default: cloudflare.com:443) --reference-mode string How to merge multiple references (default: any) any normal if ANY reference shows it majority normal if >50% of references show it all normal only if ALL references show it --probes string Comma-separated probe list (default: all) http3, tls, replay, null, random, malformed --random-sizes string Packet sizes for random probe (default: 1,8,16,32,64,128,256,512,1024,1400,1500) --timeout int Per-probe timeout in seconds (default: 10) --probe-interval int Milliseconds between probes (default: 2000) --verbose bool Print raw result for each reference server --json bool Output results as JSON to stdout ``` 在探测运行之前,会通过快速的 QUIC 握手检查目标的可达性。如果 DNS 失败或主机在 `--timeout` 秒内未响应,运行将提前中止。 ## 示例输出 ``` quic-prober v0.1.0 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Target: your-server.com:443 Reference: cloudflare.com:443 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [✅ PASS] TLS Handshake ALPN h3 ✓, cipher 0x1301 ✓, cert: CN=your-server.com [⚠️ WARN] HTTP/3 GET / Status 200 OK ✓ Missing "Server" header → configure masquerade reverse proxy to add Server header [✅ PASS] Replay probe Both servers: no-response ✓ [✅ PASS] Null connection No unprompted streams, idle timeout matches reference ✓ [✅ PASS] Random UDP (11 sizes, 1–1500 bytes) No response to random UDP ✓ [✅ PASS] Malformed QUIC Initial (5 variants) All malformed variants: no application data returned ✓ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Overall: ⚠️ LOW-MEDIUM RISK 5 passed, 1 warning(s). ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` ### 退出代码 | 代码 | 含义 | |------|---------| | `0` | 所有探测均通过 | | `1` | 出现一个或多个警告 | | `2` | 出现一个或多个失败 | ## 评分机制 每次探测都会将目标的行为与合并后的参考结果进行比较。 - **FAIL** — 目标的行为方式不是真实 QUIC 服务器应有的。可被 GFW 主动探测检测到。 - **WARN** — 目标与参考服务器在可疑方面存在差异。可能需要关注。 - **PASS** — 在此探测中,目标与真实的 QUIC 服务器无法区分。 常见的失败原因及修复方法: | 探测 | 失败 | 修复 | |-------|---------|-----| | `http3` | 状态码不是 200 | 配置伪装 Web 服务器 | | `http3` | 缺少 `Server` 标头 | 在反向代理配置中添加该标头 | | `tls` | ALPN 不是 `h3` | 在服务器上启用 QUIC/HTTP3 | | `tls` | 自签名证书 | 使用 CA 签名的证书 | | `replay` | 接受重放的 Initial | 确保 QUIC 重放保护已激活 | | `null` | 未经请求就推送流 | 禁用未经请求的服务器推送 | | `random` | 响应随机 UDP | 检查防火墙 / QUIC 实现 | ## 技术栈 - **QUIC / HTTP3** — [`quic-go`](https://github.com/quic-go/quic-go) - **TLS** — `crypto/tls` 标准库 - **原始 UDP** — `net` 标准库 - **QUIC Initial 数据包** — 根据 RFC 9001 从头构建(AES-128-GCM + 标头保护) ## 免责声明 此工具仅供**授权测试使用**。请仅在您拥有或获得明确测试许可的服务器上使用它。某些畸形数据包探测可能会在未修补的服务器实现中触发意外行为。对于因未经授权或不当使用造成的任何损害,作者概不负责。
标签:EVTX分析, Go, QUIC, Ruby工具, 代理服务, 动态分析, 抗审查, 数据泄露防护, 日志审计, 网络探测, 防御绕过