概要
Proxy(プロキシ)環境でcurlを実行する方法を、用途別にまとめます。
1回だけ使うなら--proxy、シェル全体で使うなら環境変数、常に同じ設定を使うなら
.curlrcが基本です。
curl --proxy http://proxy.example.com:8080 https://example.com
-xは--proxyの短縮形です。
curl -x http://proxy.example.com:8080 https://example.com
設定方法の選び方
| 方法 | 適した用途 | 設定が影響する範囲 |
|---|---|---|
-x / --proxy |
1回だけ試す、スクリプトで明示する | そのコマンドだけ |
http_proxyなどの環境変数 |
複数のCLIツールで共有する | 現在のプロセスと子プロセス |
~/.curlrc |
curlで常に同じ設定を使う | そのユーザーのcurl |
トラブル時に設定元を切り分けやすいのは、コマンドで明示する方法です。
コマンドオプションでProxyを指定する
HTTP Proxyを経由してHTTPSのURLへアクセスする例です。
curl --proxy http://proxy.example.com:8080 https://example.com
ProxyのURLにはスキーム、ホスト名、ポートを指定します。スキームを省略した場合、
curlはHTTP Proxyとして扱いますが、意図を明確にするためhttp://まで書くのがおすすめです。
Proxy認証を指定する
ユーザー名とパスワードが必要なProxyでは--proxy-user(短縮形は-U)を使います。
curl \
--proxy http://proxy.example.com:8080 \
--proxy-user 'username:password' \
https://example.com
認証方式を自動選択する場合は--proxy-anyauthを追加します。
curl \
--proxy http://proxy.example.com:8080 \
--proxy-anyauth \
--proxy-user 'username:password' \
https://example.com
パスワードをコマンドラインへ直接書くと、シェル履歴やプロセス情報から漏れる可能性があります。 実運用では組織のシークレット管理方法を使い、少なくとも履歴へ平文を残さないようにします。
SOCKS Proxyを使う
SOCKS5 Proxyを使い、ホスト名の解決もProxy側で行う例です。
curl --proxy socks5h://proxy.example.com:1080 https://example.com
socks5h://のhは、接続先ホスト名をローカルではなくProxy側で解決する指定です。
同じ設定は--socks5-hostnameでも指定できます。
環境変数でProxyを設定する
複数回実行する場合は環境変数が便利です。
export http_proxy=http://proxy.example.com:8080
export https_proxy=http://proxy.example.com:8080
export no_proxy=localhost,127.0.0.1,.example.internal
設定後は通常どおり実行します。
curl https://example.com
主な環境変数は次のとおりです。
| 環境変数 | 用途 |
|---|---|
http_proxy |
HTTP URL用のProxy |
https_proxy |
HTTPS URL用のProxy |
all_proxy |
プロトコル別設定がない場合の共通Proxy |
no_proxy |
Proxyを経由しない接続先 |
大文字の環境変数も多くの環境で使えますが、curlのhttp_proxyはセキュリティ上の理由から
小文字だけが有効です。大文字・小文字の両方が設定されている場合は小文字が優先されます。
表記を揃えるなら、上の例のように小文字へ統一すると混乱しにくくなります。
no_proxyで社内・ローカル接続を除外する
カンマ区切りでホスト名、ドメイン、IPアドレスを指定します。
export no_proxy=localhost,127.0.0.1,.example.internal,192.168.0.0/16
localhostはそのホストだけを除外.example.internalは配下のホストを除外192.168.0.0/16のCIDR表記はcurl 7.86.0以降で利用可能*だけを指定すると、すべての接続でProxyを無効化
一時的にProxyを通さない場合は、コマンドオプションでも指定できます。
curl --noproxy '*' https://example.com
環境変数を解除する
unset http_proxy https_proxy all_proxy no_proxy
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY
現在の設定を確認する場合は、値に認証情報が含まれていないことを確認してから表示します。
env | grep -i _proxy
PowerShellで設定する
Windows PowerShellでは次のように設定します。
$env:http_proxy = "http://proxy.example.com:8080"
$env:https_proxy = "http://proxy.example.com:8080"
$env:no_proxy = "localhost,127.0.0.1,.example.internal"
現在のPowerShellセッションから削除する例です。
Remove-Item Env:http_proxy
Remove-Item Env:https_proxy
Remove-Item Env:no_proxy
.curlrcに設定する
ユーザー単位の既定値は~/.curlrcへ記述します。
proxy = "http://proxy.example.com:8080"
noproxy = "localhost,127.0.0.1,.example.internal"
既定の設定ファイルは、主に次の順で探索されます。
$CURL_HOME/.curlrc$XDG_CONFIG_HOME/curlrc$HOME/.curlrc
Windowsでは%USERPROFILE%や%APPDATA%なども探索対象です。/etc/curlrcはcurl標準の
自動探索対象ではありません。任意の設定ファイルを使う場合は--config(-K)で明示します。
curl --config /path/to/curl.conf https://example.com
認証情報を.curlrcへ平文で保存する場合は漏えいリスクがあります。やむを得ず保存する場合でも
ファイルの権限を所有者だけに制限します。
chmod 600 ~/.curlrc
.curlrcを読み込まずに実行する場合は、-qを最初の引数に指定します。
curl -q --proxy http://proxy.example.com:8080 https://example.com
設定の優先順位とProxyの無効化
--proxyはProxy用の環境変数を上書きします。コマンド単位でProxy設定を空にすることも
できます。
curl --proxy "" https://example.com
設定が競合しているときは、次の順で切り分けます。
env | grep -i _proxyで環境変数を確認するCURL_HOME、XDG_CONFIG_HOME、HOME配下のcurl設定を確認するcurl -qで設定ファイルを無効にして再実行する--proxyまたは--noproxyをコマンドで明示する
Proxy経由になっているか確認する
--verbose(-v)を付けると、接続先、Proxyの利用、CONNECT処理、TLSハンドシェイクなどを
確認できます。
curl --verbose --head https://example.com
ログにはリクエストヘッダーや認証情報などの機密データが含まれる可能性があります。 共有する前に必ずマスキングしてください。
curl 8.7.0以降では、proxy_usedを使ってProxy利用の有無だけを出力できます。
curl \
--silent \
--output /dev/null \
--write-out 'proxy_used=%{proxy_used}\n' \
https://example.com
1ならProxy経由、0なら直接接続です。
よくあるエラーと対処
407 Proxy Authentication Required
Proxy認証が必要です。--proxy-userで認証情報を指定し、Basic以外の方式を使う環境では
--proxy-anyauth、--proxy-ntlm、--proxy-negotiateなど組織指定の方式を確認します。
Could not resolve proxy
Proxyのホスト名が解決できていません。スペル、DNS、VPN接続、Proxy URLのスキームとポートを 確認します。
Failed to connect to ... port ...
ProxyへTCP接続できていません。ポート番号、ファイアウォール、VPN、Proxyサービスの稼働状況を 確認します。
証明書エラー(curl: (60))
社内ProxyがTLS通信を検査している場合、組織のCA証明書が必要になることがあります。
接続先サーバーの検証には--cacert、HTTPS Proxy自体の検証には--proxy-cacertを使います。
curl --cacert company-ca.pem https://example.com
-k / --insecureは証明書検証を無効化するため、恒久的な対処には使わないでください。
まとめ
- 1回だけなら
curl --proxy URL 接続先URL - 継続利用なら
http_proxy、https_proxy、no_proxy - curl専用の既定値なら
~/.curlrc - 認証情報をコマンド履歴や設定ファイルへ平文で残さない
curl -q -vで設定ファイルを除外しながら接続経路を確認する- 社内CAが必要な環境では証明書を正しく登録し、
--insecureで回避しない