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工具, 代理服务, 动态分析, 抗审查, 数据泄露防护, 日志审计, 网络探测, 防御绕过