Socks5Proxy

cURLプロキシ使用方法、HTTPとSOCKS5プロキシをコマンドラインで確認

このガイドではcURLでSocks5ProxyのHTTPプロキシとSOCKS5プロキシに接続する方法、ユーザー名・パスワード認証、応答時間測定、リスト全体を一度に確認するシェルスクリプトを説明します。

cURLでプロキシをテストする利点は何ですか?

cURLはほぼ全てのサーバーと開発環境にインストールされているため、プロキシが正しく動作するかを最も早く確認できるツールです。コードやブラウザ設定で問題が発生した際にcURLで同じ行をテストすると、プロキシの問題かコードの問題かをすぐに判別できます。

例ではIP 198.51.100.23、HTTPポート8000、SOCKS5ポート1080、ユーザー名spx_user、パスワードspx_passを使用します。

HTTPプロキシはどうやって接続しますか?

-x(または--proxy)オプションにプロキシアドレスを指定します。ユーザー名とパスワードはアドレス内に含めるか、-Uオプションで別途指定できます。HTTPSアドレスをリクエストすると、cURLはCONNECTでトンネルを作成し、その中で暗号化されたリクエストを行います。

# user and password inside the proxy URL
curl -x http://spx_user:spx_pass@198.51.100.23:8000 https://api.ipify.org

# or with -U
curl -x http://198.51.100.23:8000 -U spx_user:spx_pass https://api.ipify.org

SOCKS5プロキシはどのように接続しますか?

--socks5-hostnameはドメイン名解決をプロキシ側で行います。自サーバーのDNSリクエストが外部に漏れず、プロキシがある国基準で名前解決されます。--socks5は名前解決を自サーバーで行った後、IPのみをプロキシに送信します。ほとんどの場合--socks5-hostnameを推奨します。

アドレス形式socks5h://を-xに指定しても同じ結果です。

# DNS is resolved by the proxy
curl --socks5-hostname 198.51.100.23:1080 --proxy-user spx_user:spx_pass https://api.ipify.org

# same thing with a proxy URL
curl -x socks5h://spx_user:spx_pass@198.51.100.23:1080 https://api.ipify.org

応答時間とステータスを同時に確認するにはどうすればよいですか?

-wオプションで接続時間、最初のバイトまでの時間、全体時間、レスポンスコードを1行で出力できます。複数国のプロキシ速度を比較したり、対象サイトが遅いかプロキシが遅いかを判別する際に便利です。

-o /dev/nullで本文を破棄し、-sで進捗表示をオフにすると、結果のみをクリーンに表示できます。

curl -s -o /dev/null \
  -x http://spx_user:spx_pass@198.51.100.23:8000 \
  -w "code=%{http_code} connect=%{time_connect}s ttfb=%{time_starttransfer}s total=%{time_total}s\n" \
  https://example.com/

リスト全体を一括確認する方法

APIでリストを受け取って行ごとにcURLを実行すると、すべてのプロキシの状態を一度に確認できます。以下のスクリプトはip:port:user:pass形式のリストを受け取り、各行のレスポンスIPとかかった時間を出力します。時間制限を設定して、レスポンスがない行で止まらないようにしました。

#!/bin/sh
KEY="YOUR_API_KEY"
curl -s -H "Authorization: Bearer $KEY" \
  "https://socks5proxy.io/api/v1/proxies/download?format=ip:port:user:pass&protocol=http" > proxies.txt

while IFS=: read -r ip port user pass; do
  out=$(curl -s -m 15 -x "http://$user:$pass@$ip:$port" -w " %{time_total}s" https://api.ipify.org)
  echo "$ip:$port $out"
done < proxies.txt

API自体もcURLで呼び出せますか?

はい。残高確認、アクティブプランリスト、プロキシリストはすべてAuthorization: Bearerヘッダー1つで呼び出せます。JSONレスポンスはjqなどのツールで必要な項目だけ抽出して確認できます。

curl -H "Authorization: Bearer YOUR_API_KEY" https://socks5proxy.io/api/v1/account
curl -H "Authorization: Bearer YOUR_API_KEY" "https://socks5proxy.io/api/v1/proxies?country=us&protocol=socks5"

環境変数でプロキシを設定することもできますか?

はい。cURLや多くのコマンドラインツールはhttp_proxy、https_proxy、all_proxy環境変数を読み取ります。シェルで一度設定しておくと、そのシェルで実行するcURL、wget、pipなどのツールがすべて同じプロキシを使用します。SOCKS5はall_proxyにsocks5h://アドレスを指定します。

プロキシ経由しないアドレスはno_proxyにカンマ区切りで記述してください。内部サーバーやlocalhostまでプロキシ経由で通信するのを防げます。

export https_proxy="http://spx_user:spx_pass@198.51.100.23:8000"
export http_proxy="$https_proxy"
export no_proxy="localhost,127.0.0.1"
curl https://api.ipify.org

# SOCKS5 for every tool that reads all_proxy
export all_proxy="socks5h://spx_user:spx_pass@198.51.100.23:1080"

HTTPプロキシとSOCKS5プロキシの結果を比較するにはどうすればいいですか?

同じIPの2つのポートで同じアドレスにリクエストを送り、応答IPと時間を比較すると、自分の環境でどの方法が速いかわかります。ほとんど同じですが、ターゲットサーバーが遠い場合やDNS確認が遅い環境では差が出る可能性があります。

応答IPは両方式で同じである必要があります。異なる場合は別の行のポートを混在させた可能性があるため、リストを再確認してください。

for p in "http://spx_user:spx_pass@198.51.100.23:8000" "socks5h://spx_user:spx_pass@198.51.100.23:1080"; do
  curl -s -m 15 -x "$p" -w "  %{time_total}s\n" https://api.ipify.org
done

サーバーでIP認証用のIPを確認するにはどうすればよいですか?

IP認証に登録する値は、自分のサーバーがインターネットに出るときに使用する公認IPv4です。プロキシなしでcurl -4 https://api.ipify.orgを実行すると、その値をすぐに確認できます。この値をダッシュボードのIP認証欄に登録すると、そのサーバーではユーザー名とパスワードなしで接続されます。

curl -4 -s https://api.ipify.org

HTTPSサイトでプロキシが内容を見ることはできますか?

HTTPプロキシでHTTPSアドレスをリクエストすると、cURLはまずCONNECTで目的のサーバーまでトンネルを作成し、その中で目的のサーバーと直接暗号化接続を確立します。プロキシはどのサーバーに接続するかだけを知り、やり取りする内容は暗号化されているため見ることができません。-vオプションで実行すると、CONNECT段階とその後の暗号化接続過程が順番に表示されます。

SOCKS5も同様です。プロキシは接続をそのまま転送し、暗号化はcURLと対象サーバーの間で行われます。そのため、証明書確認オプション(-k)は使用しない方が安全です。プロキシ経由でも対象サーバーの証明書がそのまま確認されるためです。

--socks5-hostnameを使用すると、接続先ドメイン名もプロキシが解決するため、自サーバーのDNSリクエスト履歴にも残りません。

curl -v -o /dev/null -x http://spx_user:spx_pass@198.51.100.23:8000 https://example.com/ 2>&1 | grep -E "CONNECT|HTTP/|SSL connection"

cURLエラーメッセージはどのように読みますか?

Received HTTP code 407 from proxy after CONNECTは認証失敗です。ユーザー名とパスワード、またはIP認証に登録したサーバーIPを確認してください。パスワードに@や:が含まれる場合はアドレス内に入れず、-Uや--proxy-userで指定する必要があります。

Failed to connectまたはConnection timed outはポートが一致しないか、サーバーのファイアウォールが出ていく接続をブロックしている場合です。HTTPアドレスにはHTTPポートを、SOCKS5にはSOCKS5ポートを使用し、出ていく方向のポートが開いているか確認してください。-vオプションを付けると接続過程が段階的に表示されるため、原因を特定しやすくなります。

cURLプロキシ使用方法、-xとSOCKS5接続確認 | Socks5Proxy