プロキシ

cURLでプロキシを使う方法(-x、認証、SOCKS5、ローテーション)

2026年8月24日4分で読めます

ターミナルの前にいて、いますぐコピー&ペーストで cURL リクエストをプロキシ経由にする一行のコマンドが欲しい、そんな状況ですね。このガイドはまさにそれを提供します。curl のプロキシフラグ、3つのプロトコルすべて、認証、環境変数、恒久的な設定、ローテーション、そして実際のエラーと修正の対応表 - これらを 2026年8月に curl 8.x でテストしました。水増しもなければ、ベンダーの販売導線もありません。すでに cURL を知っていて、プロキシの構文と他のページが飛ばす落とし穴だけが欲しいなら、ここが正しい場所です。

最終更新:2026年8月24日。curl 8.x でテスト済み。これらのフラグは最近の curl リリースで安定していますが、お使いのものを確認するには curl --version を実行してください。

TL;DR:一行コマンド

プロキシを cURL に渡すには -x(またはその同一の別名 --proxy)を使います:

curl -x http://USER:PASS@HOST:PORT https://example.com

-x--proxy は同じフラグです。scheme を省くと cURL は http:// と見なし、ポートを省くと 1080 と見なします。以下のコマンドはすべて、その一行の変形にすぎません。

始める前に必要なもの

ここのどのコマンドを実行するにも、あらゆるプロキシ事業者がダッシュボードで渡してくれる4つの値が必要です:

HOST:PORT            # the endpoint, e.g. p.webshare.io:80
USERNAME:PASSWORD    # your proxy credentials

その4つの値が、cURL に必要なすべてです。テスト用の稼働中エンドポイントがないなら、読み進める前に1つ入手してください - 背後に本物のプロキシがなければコマンドは無意味です。Webshare には本物の無料プラン(プロキシ10個、カード不要)があり、まさにこの種のテストのためにすぐ取得でき、-x にそのまま入る素の host:port:user:pass 文字列を渡してくれます。数分で テスト用の無料プロキシを入手できます。(Webshare はアフィリエイトパートナーです。当サイトの アフィリエイト開示をご覧ください。これは支払う価格にも以下のコマンドにも影響しません。)

私自身の curl テストでは、ローテーションゲートウェイの行を手作業で組み立てるのではなく、Webshare のダッシュボードから sticky-session エンドポイントをそのまま貼り付けます。そうすればホスト、ポート、認証情報が、-x に入る1つの準備済み文字列として揃います。これを特定の curl バージョンに固定してはいません - 相応に新しい curl ならどれもこれらのフラグを同じように扱います - なので、お使いのシステムに付属するものを使ってください。

cURL プロキシの基本構文:-x / --proxy フラグ

2つの形式は互換なので、覚えやすい方を選んでください:

# These two lines are identical
curl -x http://HOST:PORT https://example.com
curl --proxy http://HOST:PORT https://example.com

cURL は人を驚かせる2つのデフォルトを補います。scheme を省くと HTTP プロキシと見なし、ポートを省くと 1080 と見なします:

# No scheme -> HTTP proxy is assumed
curl -x HOST:PORT https://example.com

# No port -> 1080 is assumed (so this targets HOST:1080)
curl -x http://HOST https://example.com

スクリプトでは明示的にしましょう。http://HOST:PORT をフルで書けば、後で「なぜポート1080に当たっているのか?」という驚きを避けられます。

cURL での HTTP、HTTPS、SOCKS5 プロキシ

HOST:PORT の前に置く scheme が、cURL にプロキシとの通信方法を伝えます。これはターゲット URL が https かどうかとは別の話です。

プロキシの種類フラグの例
HTTP プロキシ-x http://HOST:PORT
HTTPS プロキシ(プロキシへの TLS)-x https://HOST:PORT
SOCKS5、ローカル DNS-x socks5://HOST:PORT
SOCKS5、リモート DNS-x socks5h://HOST:PORT

HTTP と HTTPS プロキシ

# Reach an https site through a plain HTTP proxy - this is normal
curl -x http://HOST:PORT https://example.com

# Proxy that itself speaks TLS
curl -x https://HOST:PORT https://example.com

TLS が2段階ある点に注意してください。-x の値の中の http://https:// は、あなたからプロキシまでのホップを表します。ターゲット URL の https:// は、プロキシからサイトまでのホップです。ほとんどのデータセンタープロキシは、https ページを取得しているときでも http:// scheme を使うので、そこから始めてください。

SOCKS5 と socks5:// 対 socks5h:// の違い

curl -x socks5://HOST:PORT https://example.com
curl --socks5 HOST:PORT https://example.com     # same thing

# Let the PROXY resolve the hostname (remote DNS)
curl -x socks5h://HOST:PORT https://example.com

ここが、ほとんどのガイドが飛ばす細部です。socks5:// では、cURL がターゲットのホスト名をあなたのマシンで解決し、プロキシには IP アドレスを送ります。socks5h:// では、cURL がホスト名を送り、プロキシが DNS 解決を行います。ローカルの DNS リークを避けたい場合や、プロキシのネットワーク上にしか存在しない名前を解決したい場合など、DNS を出口で起こしたいときはいつでも socks5h:// を使ってください。

cURL プロキシ認証(-U / --proxy-user)

ほとんどの有料プロキシはユーザー名とパスワードを要求します。渡す方法は2つあります:

# Dedicated flag (-U is short for --proxy-user)
curl -x http://HOST:PORT -U USER:PASS https://example.com
curl -x http://HOST:PORT --proxy-user USER:PASS https://example.com

# Credentials embedded in the proxy URL
curl -x http://USER:PASS@HOST:PORT https://example.com

ほとんどの 407 エラーを引き起こす落とし穴:認証情報を URL に埋め込むとき、パスワード中の特殊文字はすべて URL エンコードしなければなりません。さもないと cURL が文字列を読み違え、プロキシに拒否されます。@%40:%3A#%23、というようにエンコードします:

# Password is  p@ss:word  ->  encode it in the URL
curl -x "http://user:p%40ss%3Aword@HOST:PORT" https://example.com

# Or sidestep encoding entirely with -U (quote it for the shell)
curl -x http://HOST:PORT -U 'user:p@ss:word' https://example.com

-U の形式は最初のコロンでしか分割しないので、パスワード内のコロンはそこでは問題ありません。--proxy-user は HTTP だけでなく SOCKS5 認証にも使えます。

環境変数でプロキシを設定する(HTTP_PROXY / HTTPS_PROXY)

シェルで一度プロキシを設定すれば、そのセッションのすべての cURL 呼び出しがそれを使います。構文はシェルによって異なり、クロスプラットフォームのチュートリアルはたいていここで間違えます。

# Unix / macOS (bash, zsh)
export http_proxy="http://USER:PASS@HOST:PORT"
export https_proxy="http://USER:PASS@HOST:PORT"
export NO_PROXY="localhost,127.0.0.1,.internal.example.com"
curl https://example.com
# Windows PowerShell (curl is an alias here - call curl.exe)
$env:HTTP_PROXY = "http://USER:PASS@HOST:PORT"
$env:HTTPS_PROXY = "http://USER:PASS@HOST:PORT"
curl.exe https://example.com
:: Windows cmd.exe
set HTTP_PROXY=http://USER:PASS@HOST:PORT
set HTTPS_PROXY=http://USER:PASS@HOST:PORT
curl https://example.com

知っておくべきことが2つあります。素の HTTP 変数については、cURL は小文字の http_proxy しか読みません(意図的なセキュリティ上の選択です)。HTTPS_PROXYNO_PROXY は大文字小文字どちらでも機能します。そして NO_PROXY(または呼び出しごとの --noproxy フラグ)は、プロキシを迂回すべきホストを列挙します。リクエストごとの -x は、環境が設定した内容を常に上書きします:

# Ignore the env proxy for these hosts
curl --noproxy example.com,localhost https://example.com

# -x wins over the environment variables for this one call
curl -x http://OTHER_HOST:PORT https://example.com

cURL に常にプロキシを使わせる(.curlrc)

常に使うプロキシなら、cURL の設定ファイルに書いておけば二度とフラグを打たずに済みます。Unix と macOS では ~/.curlrc、Windows ではホームディレクトリの _curlrc、または %APPDATA%\_curlrc です。1行追加します:

# ~/.curlrc  (or  %APPDATA%\_curlrc  on Windows)
proxy = "http://USER:PASS@HOST:PORT"

これで、すべての cURL コマンドが自動的にそのプロキシを通ります。ファイルを編集せずに1回の呼び出しだけ迂回するには、その場でプロキシを無効化します:

curl --noproxy '*' https://example.com   # ignore the config proxy
curl -x '' https://example.com           # empty proxy = direct connection

リクエストごとにプロキシをローテーションする

2つの誠実なパターンが、ほぼすべてのローテーションのニーズをカバーします。1つ目は、事業者のローテーションゲートウェイを使うものです - リクエストごとに新しい出口 IP を渡してくれる単一のエンドポイントなので、ループの中で呼び出すだけです:

# Rotating gateway endpoint (Webshare exposes one at p.webshare.io:80;
# check your dashboard for the exact host and rotation setting)
for i in $(seq 1 5); do
  curl -s -x http://USER:[email protected]:80 https://ipinfo.io/ip
done

2つ目は、自前のプロキシ一覧ファイルを1行に1つの -x でループすることで、完全に制御できます。Webshare をはじめ、ほとんどの事業者は一覧を host:port:user:pass 形式でエクスポートでき、きれいにパースできます:

# proxies.txt: one  host:port:user:pass  per line
while IFS=: read -r host port user pass; do
  curl -s -x "http://$user:$pass@$host:$port" https://ipinfo.io/ip
done < proxies.txt

スクレイピングは責任を持って行いましょう。公開データだけを取得し、各サイトの robots.txt と利用規約を尊重し、リクエスト頻度を抑え、ログインの背後にあるものには手を出さないでください。これは一般的な良い慣行であって、法的助言ではありません - ご自身のプロジェクトと管轄区域の規則を確認してください。ローテーションがワークフローの中心なら、ローテーションプロキシウェブスクレイピング用プロキシに関する当サイトのガイドが、コード断片よりも踏み込んで解説しています。

cURL がプロキシを使っているか検証する(自分の IP を確認)

プロキシが効いたと決めつけないでください。サイトが実際に見た IP を echo サービスに尋ねましょう:

# Should print the proxy's exit IP, not yours
curl -x http://USER:PASS@HOST:PORT https://ipinfo.io/ip
curl -x http://USER:PASS@HOST:PORT http://httpbin.org/ip

# See the proxy handshake and CONNECT line
curl -v -x http://USER:PASS@HOST:PORT https://example.com

結果を直接の呼び出し(プロキシなしの curl https://ipinfo.io/ip)と比べてください。2つの IP が違えばプロキシは機能しています。同じなら、cURL はまだ直接出て行っており、あなたの -x または環境変数が適用されていません。-v の出力はプロキシへの CONNECT 行を示し、これが経路を確認する最も速い方法です。

よくある cURL プロキシのエラーと修正方法

エラー考えられる原因修正方法
407 Proxy Authentication Required認証情報の欠落または誤り、あるいは URL に埋め込んだパスワード中の特殊文字がエンコードされていない-U 'user:pass' を追加するか、パスワードを URL エンコードする(@ -> %40: -> %3A
curl: (7) Couldn't connect to proxyホスト、ポート、または scheme の誤りHOST:PORT を再確認する。http://socks5:// を試す。プロキシが稼働し到達可能か確認する
curl: (56) / HTTPS プロキシ経由の SSL 証明書エラープロキシの TLS 証明書が信頼されていないテスト目的に限り、--proxy-insecure を追加するか --proxy-cacert を CA に向ける。本番では証明書を正しく修正する
SOCKS5 でサイトがローカル DNS で解決されるリモート DNS を使いたいのに socks5:// を使っているsocks5h:// に切り替えて、プロキシにホスト名を解決させる
リクエストがハングするか、決して返らない死んだプロキシ、または遅いターゲット--connect-timeout 10--max-time 30 を追加して素早く失敗させる

「curl プロキシが動かない」という報告の10件中9件は最初の行、つまりエンコードされていないパスワードによる 407 です。ほかの何よりも先に -U に手を伸ばしてください。

cURL ではどのプロキシの種類を使うべきか?

cURL はどのプロキシも同じように扱うので、選択はツールではなくターゲットの問題です。誠実な3行の指針:

  • データセンタープロキシ - 最も速く最も安いが検知されやすいので、防御の薄い公開サイトの大量スクレイピングに最適。
  • 住宅用プロキシ - 本物の家庭ユーザーに見えるためブロックされにくいが、割高で通常は GB 課金。
  • ISP(静的住宅用)プロキシ - 中間の選択肢:データセンター並みの速度に、住宅用に見える安定した IP。

curl -x にそのまま入る素のエンドポイントと、試すための無料プランだけが欲しい開発者には、Webshare が手軽なコスパの選択肢です - 低コストで開発者に優しく、格闘すべきラッパーのない host:port:user:pass 文字列。唯一の選択肢ではありません:Bright DataOxylabsIPRoyal はいずれも、必要ならより大規模または特化した住宅用ネットワークを運営しています(Oxylabs が Webshare を所有している点に注意。独立した競合ではなく関連会社として扱ってください)。Webshare の無料プロキシから始めることもできますし、市場全体を比較するなら当サイトのベストプロキシサービスハブをご覧ください。

よくある質問

cURL は SOCKS5 プロキシに対応していますか?

はい。-x socks5://HOST:PORT または --socks5 HOST:PORT を使います。ターゲットのホスト名を、あなたのマシンではなくプロキシに解決させたいとき(リモート DNS)は socks5h:// に切り替えます。

HTTPS リクエストだけにプロキシを設定するには?

https_proxy(または HTTPS_PROXY)環境変数を設定し、http_proxy は未設定のままにすれば、https トラフィックだけがルーティングされます。単発の呼び出しなら、https コマンドに -x を1つ足すだけで十分です。

1回のリクエストだけ cURL にプロキシを無視させるには?

curl --noproxy '*' URL または curl -x '' URL を使います。どちらも、その単発の呼び出しについて環境変数や .curlrc のプロキシを上書きし、直接接続します。

cURL プロキシが 407 を返すのはなぜ?

407 はプロキシが認証情報を拒否したことを意味します。ユーザー名とパスワードを渡さなかったか、URL に埋め込んだパスワード中の特殊文字が URL エンコードされていなかったかのどちらかです。-U 'user:pass' を追加するか、パスワードをエンコードしてください(@%40 になります)。

cURL で IP をローテーションできますか?

はい、2つの方法があります:事業者のローテーションゲートウェイのエンドポイントをループで呼び出してリクエストごとに新しい IP を得る方法と、自前のプロキシ一覧ファイルを1行に1つの -x でループする方法です。Python での同じ作業については、Python requests でプロキシを使うをご覧ください。

J

Jasmine

著者 · Jasmine Daily

Jasmine Dailyを綴る書き手。思ったこと、経験したこと、日々の瞬間を書き留めています。正直に、急がず、完璧でなくても。

Jasmine Daily

まだ読みものが待っています。

この記事が心に響いたなら、ジャーナルのほかのページものぞいてみてください。

次に読む

関連する投稿