Files
pangolin/docs/vpn-testing-research.md
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

7.6 KiB
Raw Permalink Blame History

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 近端衰减 <10–20% 算优;远端单独看
延迟 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. 参考来源