curlの --preproxy オプションは、HTTPまたはHTTPSプロキシに到達する前にSOCKSプロキシへ接続します。対応するのはこの特定のチェーンであり、任意のプロキシサーバー一覧ではありません。

経路はクライアント → 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プロキシがWebサイトへのCONNECTを受け入れるか拒否するかの判断より前に起こります。どのハンドシェイクが失敗したか記録します。

追加の一段が役立つ場合

利用を許可されたHTTPプロキシにSOCKS経路で到達できる場合、この構成は有用です。ただしサービスとネットワーク経路が一つ増え、障害や遅延の原因も増えます。公開プロキシ一覧の接続先を連結しても、信頼性や匿名性は保証されず、接続を扱う各者への信頼は必要です。

--preproxy にはcurl 7.52.0以降が必要です。他のアプリケーションが同じ構成に対応するとは限りません。

関連記事