Files
pangolin/docs/vpn-testing-research.md
T
wangjia 98ba2b411e test: VPN 黑盒测试工具改用 Python(零依赖)+ HTML 报告 + 国内外站点矩阵
- scripts/vpn_test.py:替换 vpn_test.sh。纯标准库(socket/ssl/urllib),覆盖国内外
  常见站点矩阵(google/youtube/github/x/fb/ig/wiki/cloudflare/openai/reddit;
  百度/腾讯/淘宝/京东/B站/微博/网易/知乎/阿里云),测连通+延迟+TTFB+DNS+出口IP+吞吐,
  本机连通性(tun/系统扩展),生成自包含 HTML 报告(-o)。
- 延迟标准 = TLS 握手耗时(ssl 握手,纯链路往返),报告里标注 "TTL=按 TLS 计算、非 IP TTL";
  TTFB 作参考。禁用 ping/tcp_connect(经 TUN 本地应答失真)。
- 删除 scripts/vpn_test.sh;文档引用同步更新为 .py。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JEHzjEcFzvGwgbxT6Wbt6c
2026-06-22 09:43:46 +08:00

125 lines
7.6 KiB
Markdown
Raw 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.
# VPN 测试调研(测什么 / 怎么测 / Pangolin 测试工具设计)
> 目的:在动手写测试工具前,先搞清楚 VPN 该测哪些维度、行业与中国/GFW 场景怎么测,
> 再据此设计 Pangolin 自己的测试工具。日期 2026-06-22。
---
## TL;DR
VPN 测试 = **连得上 + 连得对 + 连得快 + 连得稳 + 不泄漏 + (中国场景)穿得过且不被封**
六大类:**连通性 / 正确性(出口·DNS·分流)/ 泄漏 / 性能(延迟·吞吐·丢包)/ 稳定性(掉线·重连·killswitch)/ 抗封锁(GFW)**。
Pangolin 是面向大陆、REALITY+sing-box、macOS 自研客户端,**抗封锁 + 国内分流正确性 + 晚高峰吞吐**是和通用评测最不同、最该重点测的。
---
## 1. 行业通用 VPN 评测怎么测
主流评测站(Security.org、Cloudwards、PCMag 等)的共识方法论:
| 维度 | 测什么 | 怎么测 / 工具 | 通过标准 |
|---|---|---|---|
| **速度/吞吐** | 下载、上传、相对基线的衰减 | Ookla/iperf,**多服务器距离**(本地/美/英/亚)、**多时段**(早/晚高峰)、先测裸连基线再测开 VPN | 近端衰减 <1020% 算优;远端单独看 |
| **延迟** | RTT(ping)、首包延迟 | ping / curl `time_connect` | 越低越好;近端 +几十 ms 可接受 |
| **DNS 正确性** | 域名能否解析、解析延迟 | `dig`/`nslookup`、curl `time_namelookup` | 能解析、不超时 |
| **IP 泄漏** | 真实 IP 是否暴露(IPv4/IPv6) | 访问 ipify/ifconfig.me/ipleak.net,对比开关 VPN 出口 | 出口必须是节点 IP,**不能是本机真实 IP** |
| **DNS 泄漏** | DNS 查询是否走了本地 ISP | dnsleaktest.com、Wireshark 抓 53 端口去向 | 查询只经隧道/指定 DNS |
| **WebRTC 泄漏** | 浏览器 WebRTC 暴露真实 IP | browserleaks.com/webrtc | 不暴露 |
| **IPv6 泄漏** | IPv6 绕过隧道 | test-ipv6.com | 无 v6 泄漏(或 v6 也走隧道) |
| **Kill Switch** | 隧道意外断开时是否阻断流量 | 强杀扩展/断网,看是否还能裸连出网 | 断开瞬间流量被掐 |
| **流媒体/可达性** | 能否访问目标站点 | 实访 Netflix/YouTube/Google 等 | 能正常打开/播放 |
| **稳定性** | 长时连接掉线率、重连 | 长跑数小时,周期性请求 | 不频繁掉线;掉了能自动重连 |
| **抓包审计** | 是否有明文/异常外联 | Wireshark/tcpdump | 无明文、无意外外联 |
要点:**先测基线(不开 VPN)再测开 VPN 做对比**;**多次/多时段**取分布而非单点。
---
## 2. 中国 / GFW 场景特有的测法(Pangolin 重点)
通用评测不覆盖、但对面向大陆的 VPN 是生死线:
- **抗 GFW 封锁(核心)**
- GFW 一旦判定某连接是代理,会对 **(client IP, server IP, server port) 三元组封 120180 秒**(期间丢所有包)。测试:连一段时间后看是否突然全断、过几分钟又能连——这是被三元组封的特征。
- **主动探测(active probing)**:GFW 会主动连你的端口探测。REALITY 的防御是把探测流量转发给真实伪装站(如 apple.com)。测试:用普通 TLS 客户端(curl/openssl)连节点的 REALITY 端口,应表现得**像真实伪装站**(返回真站证书/内容),而不是暴露代理特征。
- **全加密流量检测**:GFW 对"高熵全加密"流量有启发式封锁。REALITY/VLESS 借真证书规避。测试:长期存活率(连续几天能否一直连)。
- **晚高峰吞吐**:国内出海带宽晚高峰(20:00–24:00)严重劣化。**必须按时段测吞吐**(白天 vs 晚高峰),单测白天没意义。
- **MTU / 分片**:运营商(尤其移动 5G)对大包/分片敏感,会借此识别。业界经验 **MTU clamp 到 1350(IPv6 1280)** 降低被识别和卡顿。测试:大包传输是否卡顿、丢包率。⚠️ 我们 TUN 配的是 `mtu 9000`(sing-box 默认),需评估对 REALITY-over-TCP 的实际影响。
- **国内分流正确性(#5)**:`geoip-cn`/`geosite-cn` 命中应**直连**(不走隧道),国外才走隧道。测试:访问国内站(如 baidu)出口应是**本地 IP**,国外站出口是**节点 IP**——分流错了要么国内变慢、要么国外漏走直连。
- **协议可达性矩阵**:REALITY(TCP 443)、Hysteria2(UDP 443)分别在不同网络(电信/联通/移动、家宽/5G)下的可达性。
参考:GFW 对全加密/QUIC 的检测与封锁机制见 gfw.report 的 USENIX 论文。
---
## 3. Pangolin 该测什么(结合架构分层)
架构:macOS 客户端(NEPacketTunnelProvider 系统扩展 + 内嵌 libbox/sing-box)→ REALITY(TCP)/Hy2(UDP)→ 节点 → 出海。控制面 :8080 下发配置。
### A. 连通性(能不能起来)
- 系统扩展 `activated enabled`(`systemextensionsctl list`)。
- 隧道接口起来(utun + `172.19.0.1`)、NEVPNStatus = connected。
- 控制面可达(:8080)、REALITY 数据口可达(节点 endpoint 端口)。
- **首次连接耗时**(含批准)、**重连耗时**。
### B. 正确性(连得对)
- **出口 IP = 节点 IP**(`curl ipify`),证明真走隧道。
- **DNS 解析正常**(域名能开;`hijack-dns` 生效——这次的坑)。
- **国内分流**:国内站出口=本地、国外站出口=节点(开 smartRoute 时)。
-**IP/DNS/IPv6 泄漏**
### C. 性能(连得快)
- 延迟:到节点 RTT、隧道内到常见站 RTT。
- 吞吐:下载/上传速度,**白天 vs 晚高峰**,对比裸连基线。
- 丢包率、DNS 解析延迟。
### D. 稳定性(连得稳)
- 长跑掉线率、自动重连。
- Kill switch(`strict_route` 已开):强杀扩展后流量是否被掐。
- 节点 agent 热重载(SIGHUP)后客户端是否平滑。
### E. 抗封锁(穿得过)
- REALITY 端口被动探测表现(伪装站特征)。
- 长期存活率(多日)。
- 三元组封锁特征监测。
---
## 4. 测试工具设计建议
分三层,**先做能自动化、回报最高的"客户端侧黑盒探测脚本"**:
### 工具一:`scripts/vpn_test.py`(客户端侧黑盒,优先做)
在已连接的机器(本机/cara)上跑,一条命令出报告。覆盖 B+C 大部分:
- **出口 IP**:`curl ipify`,判定 = 节点 / = 本地 / 超时。
- **DNS**:解析 github/google + `time_namelookup`;开/关分流分别测国内外站出口。
- **可达性矩阵**:对一组目标(google/youtube/github/baidu…)测 HTTP 码 + 耗时。
- **延迟**:`curl time_connect` 到节点和若干站。
- **吞吐**:下载固定大小文件测 `speed_download`(用 cloudflare speed / 自建测速点)。
- **泄漏**:IPv6 出口、DNS 出口对比。
- 输出:表格 + 时间戳,可重复跑做时段对比。
- 复用本会话已验证的 `ssh cara '...'` 远程跑法。
### 工具二:节点侧探针(可选)
- REALITY 端口被动探测模拟(openssl 连 443 看是否像伪装站)。
- 三元组封锁监测(从国内 vantage 持续发包看存活)。
### 工具三:客户端内置自检(产品化,后续)
- app 内"诊断"按钮:跑连通/出口/DNS 自检,给用户一键报告(也利于支持排障)。
### 输出与判定
- 每项给 **PASS/WARN/FAIL** + 实测值 + 阈值。
- 支持 **基线对比**(先 `--baseline` 裸连存一份,再开 VPN 对比衰减)。
- 支持 **多时段**(cron 跑,产出趋势)。
---
## 5. 参考来源
- Security.org《Best VPN Services of 2026: 50+ VPNs Tested》— 速度/泄漏/流媒体方法论:https://www.security.org/vpn/best/
- Cloudwards《VPN Test: DNS Leaks, IP Address Leaks, Speed Issues》:https://www.cloudwards.net/vpn-test-guide/
- DoVPN《IP Leak Test Guide》:https://dovpn.com/ip-leak-test-guide/
- gfw.report — GFW 对全加密流量的检测(USENIX'23):https://gfw.report/publications/usenixsecurity23/en/
- gfw.report — GFW 对 QUIC/SNI 的封锁(USENIX'25):https://gfw.report/publications/usenixsecurity25/en/
- VLESS-REALITY 部署/绕过实践:https://greatfirewallguide.com/lab/vless-reality-vision