curl 的 --preproxy 选项会先连接 SOCKS 代理,再到达 HTTP 或 HTTPS 代理。它支持的是这种特定链路,而非任意代理服务器列表。

路径为客户端 → SOCKS 端点 → HTTP 代理 → 目标。请替换命令中的两个文档示例端点:

curl --preproxy socks5h://203.0.113.10:1080 --proxy http://203.0.113.20:8080 --noproxy '' --connect-timeout 5 --max-time 20 --verbose https://example.com/

SOCKS 服务必须能连到 HTTP 代理的地址和端口,随后 HTTP 代理还必须接受目标请求。第二个代理如果使用主机名,第一个 SOCKS 模式会决定该主机名在哪里解析;数字地址端点则无需这次查询。

定位失败的跳点

先分别确认请求能经过每个端点;HTTP 这一跳可以用有时间限制的 HTTP 代理测试。即使两者单独可用,组合路线仍可能因第一个代理无法连到第二个而失败。

按照连接顺序阅读详细跟踪信息。连接第二个代理时发生的 SOCKS 失败,早于 HTTP 代理决定接受还是拒绝通往网站的 CONNECT。请记下失败的是哪一次握手。

额外一跳何时有用

如果经过授权的 HTTP 代理可以通过 SOCKS 路径访问,这种组合可能有用。但它也增加了一项服务和一条网络路线,可能失败或带来延迟。串联公共代理列表中的端点,不保证可靠性或匿名性,仍需信任处理连接的各方。

--preproxy 要求 curl 7.52.0 或更新版本;其他应用未必支持同样的组合。

相关文章