Verification

在将真实流量交给免费代理之前对其进行验证

3 min read Published Updated 470 words

免费代理的失败率远高于成功率。公共列表会循环成千上万个候选代理,你的任务是从中找出当前存活、速度足够快且没有恶意的那一小部分。五项测试,每项成本低廉,按顺序执行。

测试一:TCP 可达性

curl --connect-timeout 5 --proxy http://1.2.3.4:8080 \
     -s -o /dev/null -w "%{http_code}\n" \
     https://api.ipify.org

非零退出码或空白响应意味着代理已失效。在任何时刻,大约 60–80% 的免费列表都会在此测试中失败。立即跳过,不要重试。

测试二:出口 IP 验证

同样的调用会返回请求所源自的公网 IP。如果它等于 1.2.3.4(即代理的地址),则代理正确转发了流量。如果它等于你的本地 IP,则代理已损坏或处于透明模式:它接受了连接,但并未真正通过自身进行中继。即使 TCP 连接成功,也应视为失败。

测试三:头部透明性

curl --proxy http://1.2.3.4:8080 https://httpbin.org/headers

响应会回显目标收到的头部信息。查找包含你真实 IP 的 X-Forwarded-ForViaForwarded。如果找到,则代理处于透明或匿名模式,而非精英模式。对于通过 CONNECT 的 HTTPS 连接,这无关紧要——目标只能看到 TLS 握手,没有应用层头部——但对于明文 HTTP,这决定了代理是否适合用途。

测试四:负载下的延迟

单次测时噪声较大。通过代理连续发送十个请求,取中位数。超过两秒的延迟对于交互式工作不可用。低于 500 毫秒则与不使用代理相当。介于两者之间的延迟,代理适合批量抓取,但不适合浏览。

测试五:TLS 指纹完整性

通过代理连接到一个已知的 TLS 端点,并验证证书链与不使用代理时获取的证书链是否一致。不一致意味着代理正在拦截 TLS——执行中间人攻击,你的“加密”流量从代理之后实际上并未加密。在配置正确的 SOCKS 代理上很少出现(它们无法看到 TLS),但在配置错误的企业 HTTPS 代理以及偶尔出现的恶意公共节点上会出现。openssl s_client -proxy 1.2.3.4:8080 -connect example.com:443 会打印证书链。

实用工作流程

拉取列表,按国家和协议过滤,将五项测试分散到大约 50 个工作线程的并行池中,保留通过者。从 100 个原始候选代理中,一次典型运行可得到 5–15 个可用条目。HTTP 和 HTTPS 的衰减率大约为 30–60 分钟,SOCKS 稍长——按此节奏安排刷新,并将存活集合输入到你的爬虫或浏览器配置中。缓存测试结果,持续一个批次的生命周期,并在下一批次重新测试。