curlをプロキシで使用する方法: -x構文、認証、SOCKS5とデバッグレシピ

1つのフラグでcurlを任意のプロキシ経由にルーティングできます。その後、認証、CONNECTトンネル、SOCKS5 DNS、環境変数が実際に機能するかどうかを決定します。必要なすべてのレシピが、コピー&ペーストできる状態で用意されています。

curlをプロキシで使用するには、-xという単一のフラグを使用します。しかし、そのフラグと動作するスクレイピングコマンドの間には、Stack Overflowで最も多くのトラフィックを生む5つの詳細があります。それは、認証情報の構文、CONNECTトンネル、SOCKS5 DNSの動作、リクエストを密かに乗っ取る環境変数、そして見た目が似ているエラーコードです。これは完全なコピー&ペーストリファレンスです: すべての構文バリエーション、すべての認証方法、そして実際に再利用するレシピ。

-xフラグ: curlプロキシ構文

# route one request through an HTTP proxy
curl -x http://gate.quantumproxies.io:8000 https://ifconfig.me

# identical, long form
curl --proxy http://gate.quantumproxies.io:8000 https://ifconfig.me

curlのドキュメントから直接引用した知っておくべき2つのデフォルト: スキームを省略するとcurlはHTTPプロキシを仮定し、ポートを省略すると1080を仮定します — これはほとんどの実際のプロキシと一致しない純粋に歴史的な選択ですので、ポートは常に明示的に書いてください。スキームプレフィックスはプロキシプロトコルを選択します: 標準のHTTPプロキシにはhttp://、プロキシ自体へのホップを暗号化するにはhttps://、SOCKSにはsocks5://またはsocks5h://

curlプロキシ認証: 認証情報を送信する3つの方法

# 1) credentials inline in the proxy URL
curl -x http://USER:PASS@gate.quantumproxies.io:8000 https://ifconfig.me

# 2) separate flag -- keeps the URL readable
curl -x http://gate.quantumproxies.io:8000 -U USER:PASS https://ifconfig.me

# 3) special characters must be percent-encoded (p@ss! -> p%40ss%21)
curl -x "http://USER:p%40ss%21@gate.quantumproxies.io:8000" https://ifconfig.me

-U(大文字)はプロキシ認証です。小文字の-uはターゲットサイトに対する認証です — これを混同するのは古典的なミスです。407 Proxy Authentication Requiredは常にプロキシがあなたの認証情報を拒否したことを意味し、ターゲットではありません。タイプミス、エンコードされていない記号、またはプロバイダーがユーザー:パスの代わりにIPホワイトリスト認証を期待しているかを確認してください。QuantumProxiesの住宅プロキシでは両方のモードが機能します — マシンのIPをホワイトリストに登録し、認証情報を完全に省略するか、URLにユーザー:パスを埋め込んでください。完全な407チェックリストは407トラブルシューティングガイドにあります。

curl -xがHTTPSターゲットにプロキシを通じてCONNECTトンネルを確立するフローダイアグラム
HTTPSターゲットの場合、curlはプロキシにCONNECTトンネルを要求し、その中でエンドツーエンドのTLSを実行します — プロキシは読めないバイトを中継します。

HTTPSターゲットとCONNECTトンネル

ターゲットURLがhttps://の場合、curlはプロキシにページの取得を要求しません。CONNECT host:443リクエストを送り、プロキシは生のTCPトンネルを開き、curlはその中でターゲットと直接TLSハンドシェイクを行います。これがHTTPプロキシがHTTPSトラフィックを暗号化を壊さずに運ぶことができる理由です — プロキシは読めない暗号文を転送します。-v出力ではCONNECT行の後に200 Connection establishedが表示されます。それ以外のものはそのステップでの失敗点です。HTTPプロキシを通じて非HTTPプロトコルを使用する場合、-p--proxytunnel)は同じトンネル動作を強制します。

SOCKS5: 1文字でDNSの場所が変わる

# SOCKS5, hostname resolved on YOUR machine
curl -x socks5://USER:PASS@gate.quantumproxies.io:1080 https://ifconfig.me

# SOCKS5h, hostname resolved BY THE PROXY -- use this for scraping
curl -x socks5h://USER:PASS@gate.quantumproxies.io:1080 https://ifconfig.me

# dedicated flag, same as socks5h
curl --socks5-hostname gate.quantumproxies.io:1080 -U USER:PASS https://ifconfig.me

通常のsocks5://では、マシンがローカルでDNSルックアップを行います — ターゲットのホスト名がローカルのリゾルバに漏れ、出口と地理的に一致しないIPを取得する可能性があります。socks5h://は解決をプロキシに押し付けるため、DNSの回答は出口のネットワークから来ます。すべてのQuantumProxiesプランには、HTTPと同じゲートウェイでSOCKS5が含まれています。特定のツールが必要とするプロトコルが不明な場合、SOCKS5とHTTPの比較がそれを解説します。

curl socks5とsocks5hプロキシスキームの比較、ローカルとプロキシ側のDNS解決の違いを示す
socks5h://は出口でDNSを解決します — ローカルのホスト名漏れや地理的な不一致はありません。スクレイピングにはこれをデフォルトにしてください。

環境変数と.curlrc

# proxy every curl (and most CLI tools) in this shell
export http_proxy="http://USER:PASS@gate.quantumproxies.io:8000"
export https_proxy="http://USER:PASS@gate.quantumproxies.io:8000"
export NO_PROXY="localhost,127.0.0.1,.internal.example"

curl https://ifconfig.me                 # proxied automatically
curl --noproxy "*" https://ifconfig.me   # bypass for one call

# permanent default: add to ~/.curlrc
# proxy = "http://USER:PASS@gate.quantumproxies.io:8000"

curlのmanページに記載された一つの癖が最終的には誰にでも引っかかります: 変数は大文字でも小文字でも構いませんが、小文字が優先されます。ただし、http_proxyは小文字のみでcurlが認識します — HTTP_PROXYはセキュリティ上の理由で意図的に無視されます。Windowsでは-x構文はcmdとPowerShellで同一です; 変数はset http_proxy=...または$env:http_proxy="..."で設定し、設定ファイルは%APPDATA%\_curlrcです。これらの変数は他のツールにも影響を与えることを忘れないでください — CIでの忘れられたエクスポートは謎のトラフィックの古典的な原因です。

-vでデバッグ: ハンドシェイクを読む、占いではなく

-vを追加すると、curlはプロキシとの会話全体をナレーションします。見たものを原因に一致させてください:

プロキシを信頼する前にテストする

30秒のチェックが後の数時間の混乱したデバッグを防ぎます。まず、匿名性を確認します: プロキシを通じてhttps://httpbin.org/headersにアクセスし、ターゲットが実際に受け取るものを確認します — クリーンなゲートウェイはプロキシングを広告するViaX-Forwarded-Forヘッダーを追加しませんが、安価または無料のプロキシは頻繁に両方を注入します。次に、-wタイミング変数でオーバーヘッドを測定します(以下のレシピ参照): 住宅ホップは通常、直接リクエストに比べて数百ミリ秒を追加しますが、これは正常です; 数秒の接続時間は、回避すべき混雑した出口を意味します。これらのチェックをCIに組み込み、プロキシに依存するパイプラインで誤ったエンドポイントを静かに燃やす前にキャッチします — また、応答が有用であったかどうかに関係なく、使用量はGB単位で請求されるため、帯域幅予算も燃やします。

クイックレシピ

# confirm the exit IP
curl -x http://USER:PASS@gate.quantumproxies.io:8000 https://ifconfig.me

# geo-target: choose the exit country in the username
curl -x "http://USER-country-de:PASS@gate.quantumproxies.io:8000" https://ifconfig.me

# sticky session: keep the same exit IP across calls
curl -x "http://USER-session-a1b2c3:PASS@gate.quantumproxies.io:8000" https://example.com

# POST JSON through the proxy
curl -x http://USER:PASS@gate.quantumproxies.io:8000 \
  -H "Content-Type: application/json" -d '{"q":"test"}' https://httpbin.org/post

# fetch a page: follow redirects, browser UA, save to file
curl -x http://USER:PASS@gate.quantumproxies.io:8000 -L -A "Mozilla/5.0" \
  -o page.html https://example.com

# measure the proxy overhead
curl -x http://USER:PASS@gate.quantumproxies.io:8000 -s -o /dev/null \
  -w "connect: %{time_connect}s  total: %{time_total}s\n" https://example.com

ユーザー名サフィックスのトリックは、ゲートウェイが認証情報からターゲティングを解析するために機能します: 200以上の場所での国選択、デフォルトでのリクエストごとの回転、フローが1つのアイデンティティを必要とする場合のスティッキーセッション。ワンライナーがスクリプトに成長したとき、同じエンドポイントがPythonに直接ドロップされます — Python Requestsプロキシガイドがcurlが終了するところから正確に引き継ぎます。

よくある質問

curlでSOCKS5プロキシを使用するにはどうすればよいですか?

SOCKSスキームで-xに渡します: curl -x socks5h://user:pass@host:port https://target。DNSがマシンではなくプロキシで解決されるようにsocks5h://を優先してください。古い--socks5--socks5-hostnameフラグもまだ機能し、同じことを行います。

curlがプロキシを無視するようにするにはどうすればよいですか?

1つのリクエストの場合、--noproxy "*"を追加します。シェルの場合、http_proxyhttps_proxyを解除します。特定のホストを永久に除外するには、NO_PROXYにカンマ区切りのドメインとしてリストします。curlがプロキシを使用しているのにそれを要求していない場合、環境変数または~/.curlrcの行がほぼ確実に原因です。

curlが407 Proxy Authentication Requiredを返すのはなぜですか?

プロキシがあなたの認証情報を拒否しました。ユーザーとパスワードを確認し、-U-uではなく、これはサイトを対象としています)を使用したことを確認し、@!のような特殊文字をパーセントエンコードしてください。プロバイダーがIPホワイトリストで認証する場合、ダッシュボードでマシンのIPを認可し、認証情報を全く送信しないでください。

curlプロキシ構文はWindowsで動作しますか?

はい — -x-U、SOCKSスキームは同一です。curlはWindows 10以降に付属しています。環境だけが異なります: cmdではset、PowerShellでは$env:で変数を設定し、永続的な設定には%APPDATA%\_curlrcを使用します。

curlの永続的なプロキシを設定するにはどうすればよいですか?

~/.curlrc(またはWindowsでは_curlrc)にproxy = "http://user:pass@host:port"行を追加すると、すべてのcurl呼び出しがそれを使用します。あるいは、シェルプロファイルからhttp_proxyhttps_proxyをエクスポートして他のツールもカバーします。コマンドラインの-xは常に両方を上書きするので、一度限りの例外も簡単に維持できます。

これがすべての表面です: -xとスキーム、正しくエンコードされた認証情報、SOCKSを使用する場合はsocks5h、意図的に設定した環境変数、そして何かがうまくいかないときは-v。上記のコマンドはすべてのゲートウェイでそのまま実行されます — クリーンな住宅出口と組み合わせると、curlは本当に有能なスクレイピングツールになります。

これらのレシピをQuantumProxiesの住宅プロキシでテストしてください