現代のネットワーク、特に企業や学校ではプロキシサーバーが欠かせません。セキュリティの強化やアクセスの管理、通信の高速化など、その役割は多岐にわたります。私が開発やサーバー管理を行う中で、コマンドライン(CLI)から直接プロキシを設定する場面が頻繁にありました。GUIを使わずに設定を自動化したいとき、この知識は必須です。
しかし、コマンドラインでのプロキシ設定は驚くほど複雑です。なぜなら、OSや使うツール、シェル環境によって設定方法がバラバラだからです。この「断片化」が、多くの技術者を悩ませる原因です。環境変数、アプリケーションごとのコマンド、設定ファイルの直接編集など、複数の方法が混在し、どれを使えば良いのか判断が難しいのが実情です。この記事では、この複雑なプロキシ設定を体系的に整理し、Windows、macOS、Linuxの各環境、さらにGitやDockerといった主要ツールでの設定方法を網羅的に解説します。
コマンドラインプロキシ設定の基本
具体的なコマンドを見る前に、プラットフォームを問わない共通の基本原則を理解することが重要です。これらの概念は、後で紹介するコマンドがなぜそのように機能するのかを理解する土台となります。
プロキシ設定の3つの主要な方法
コマンドライン環境でのプロキシ設定は、主に3つの方法に分類されます。これらは互いに影響し、優先順位が存在します。
環境変数
プロキシ設定を子プロセスに伝えるための、最も広く使われている方法です。「http_proxy」や「no_proxy」といった変数を設定すると、多くのコマンドラインツールが自動でプロキシを認識します。手軽な方法ですが、変数名の大文字・小文字の扱いや、ツールごとの対応状況に一貫性がないという課題があります。
アプリケーション固有のコマンド
Git、npm、Dockerなどのツールは、環境変数よりも優先される独自の内部設定を持っています。「git config」や「npm config」といったコマンドは、そのアプリケーションの動作に限定した、より信頼性の高いプロキシ設定を実現します。
設定ファイルの直接編集
システムサービスや、環境変数を認識しない一部のツールには、専用の設定ファイルを直接編集する方法が最も確実です。「.wgetrc」や「apt.conf」といったファイルを使えば、永続的で詳細な制御ができます。
プロキシ環境変数の詳細
環境変数は最も一般的な設定方法ですが、その仕様は曖昧で多くの問題の原因となります。ここではその詳細を解説します。
変数名と大文字・小文字のルール
「http_proxy」(小文字)と「HTTP_PROXY」(大文字)のどちらを使うべきか、これは長年の混乱の種です。歴史的な経緯から、curlなどの一部のツールは小文字の「http_proxy」のみを認識します。一方で、新しいツールの多くは両方をチェックします。
私が推奨するベストプラクティスは、小文字と大文字の両方の変数を同じ値で設定することです。これにより、古いツールから新しいツールまで、最大限の互換性を確保できます。
変数 | 目的 | 推奨されるケース | 注釈 |
http_proxy | HTTPトラフィック用プロキシ | 小文字 | 最も広く認識される変数。一部ツールは小文字のみをチェック。 |
HTTP_PROXY | HTTPトラフィック用プロキシ | 大文字 | 多くのツールがフォールバックとしてチェック。両方を設定するのが安全。 |
https_proxy | HTTPSトラフィック用プロキシ | 小文字 | 上記と同様に、両方のケースを設定することを推奨。 |
HTTPS_PROXY | HTTPSトラフィック用プロキシ | 大文字 | 多くのツールのフォールバック。 |
no_proxy / NO_PROXY | バイパスリスト | 小文字/大文字 | プロキシを経由しないホストを指定。ツールにより互換性が異なる。 |
プロキシ文字列の構造|認証と特殊文字
プロキシサーバーが認証を要求する場合、その情報をプロキシ設定の文字列に含める必要があります。完全なURL形式はprotocol://[username:password@]proxy.server:port
です。
ユーザー名やパスワードに「@」や「#」、「\」などの特殊文字が含まれていると、認証に失敗します。これは企業環境で頻繁に発生する問題です。この問題を解決するには、URLエンコーディングを使い、特殊文字をエスケープする必要があります。例えば、パスワードがmy@password
の場合、「@」を%40
に置き換え、my%40password
と記述します。
バイパスリスト|no_proxy変数
「no_proxy」環境変数は、プロキシを経由せずに直接アクセスするホストを指定するために使います。localhostや社内サーバーなどが典型例です。
しかし、「no_proxy」の構文は標準化されておらず、ツールによって実装が大きく異なります。一般的にはホスト名をカンマ区切りで列挙しますが、ドメインの前にドットを付けてサブドメイン全体を対象にする「.example.com」のような記法や、ワイルドカードとして「*」を使う記法などがあります。重要なのは、これらの構文が全てのツールで一貫してサポートされているわけではない点です。使用する主要なツールで動作を検証することが不可欠です。
OS別のシステムレベルプロキシ設定
基本概念を理解した上で、各OSレベルでのプロキシ設定方法を解説します。これらの設定は、多くのアプリケーションがデフォルトで参照する基準となります。
Windows環境|2つのプロキシ設定を理解する
Windowsのプロキシ設定は、WinINETプロキシとWinHTTPプロキシという2つの独立した設定が存在する点が非常に複雑です。この違いを理解しないと、多くの問題に直面します。
WinHTTPプロキシの設定 (netsh)
WinHTTPプロキシは、Windows Updateのようなシステムサービスが使用するプロキシです。管理者権限を持つコマンドプロンプトやPowerShellから「netsh」ユーティリティを使って設定します。
- プロキシの設定
Shell
netsh winhttp set proxy proxy-server="proxy.example.com:8080" bypass-list="<local>;*.internal.com"
- 設定の表示
Shell
netsh winhttp show proxy
- 設定のリセット
Shell
netsh winhttp reset proxy
- IE設定のインポート
Shell
netsh winhttp import proxy source=ie
このインポートコマンドは、ブラウザ用のWinINET設定をWinHTTPにコピーする便利な機能です。
PowerShellによるプロキシ設定
PowerShellを使えば、一時的な設定から永続的な設定まで柔軟に対応できます。
- 一時的な設定(環境変数)
PowerShell
$env:http_proxy="http://user:pass@proxy.example.com:8080"
$env:https_proxy="http://user:pass@proxy.example.com:8080"
- 永続的な設定(レジストリ操作)GUIの「インターネット オプション」と同じ設定をレジストリ操作で行います。
PowerShell
$regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
Set-ItemProperty -Path $regPath -Name ProxyEnable -Value 1
Set-ItemProperty -Path $regPath -Name ProxyServer -Value "proxy.example.com:8080"
macOS環境|networksetupとシェルプロファイル
macOSでは、システムレベルのネットワーク設定は主に「networksetup」ユーティリティで管理します。
networksetupユーティリティの使い方
特定のネットワークサービス、例えば「Wi-Fi」ごとにプロキシを設定します。
- ネットワークサービスの一覧表示
Shell
networksetup -listallnetworkservices
- Webプロキシ(HTTP/HTTPS)の設定
Shell
networksetup -setwebproxy "Wi-Fi" proxy.example.com 8080
networksetup -setsecurewebproxy "Wi-Fi" proxy.example.com 8080
- 設定の表示
Shell
networksetup -getwebproxy "Wi-Fi"
- プロキシの無効化
Shell
networksetup -setwebproxystate "Wi-Fi" off
- バイパスドメインの設定
Shell
networksetup -setproxybypassdomains "Wi-Fi" "*.local" "169.254/16"
シェルのための環境変数設定
ターミナルで動作する多くのツールは、networksetup
の設定より環境変数を優先します。永続的な設定のためには、シェルの設定ファイル(macOSでは~/.zshrc
)にexport
コマンドを記述します。
Bash
# ~/.zshrc に追記
export http_proxy="http://proxy.example.com:8080"
export https_proxy="http://proxy.example.com:8080"
export no_proxy="localhost,127.0.0.1,*.local"
Linux環境|環境変数の設定場所が重要
Linux環境のプロキシ設定は、ほぼ全面的に環境変数で管理されます。どこに設定を記述して永続化させるかが最も重要なポイントです。
ログインシェルと非ログインシェルの違い
SSHでのログイン時に読み込まれる~/.bash_profile
と、ターミナルを開くたびに読み込まれる~/.bashrc
の違いを理解する必要があります。設定に一貫性を持たせるため、私が推奨する方法は、全ての環境変数を~/.bash_profile
に記述し、そこから~/.bashrc
を読み込む構成にすることです。
~/.bash_profile
の記述例
Bash
# プロキシ設定
export http_proxy="http://proxy.example.com:8080"
export https_proxy="http://proxy.example.com:8080"
export no_proxy="localhost,127.0.0.1"
# .bashrc が存在すれば読み込む
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
システム全体の永続的な設定
全てのユーザーにプロキシ設定を適用する場合は、/etc/environment
ファイルを編集します。このファイルにはキー=値
の形式で記述します。
http_proxy="http://proxy.example.com:8080"
https_proxy="http://proxy.example.com:8080"
no_proxy="localhost,127.0.0.1"
アプリケーション固有のプロキシ設定
システムレベルの設定だけでは不十分なこともあります。多くの開発ツールは独自の設定方法を要求します。
バージョン管理システム|Git
Gitはプロキシ設定で多くの開発者がつまずくポイントです。Gitはhttp_proxy
環境変数を一切参照しません。そのため、git config
コマンドで独自に設定する必要があります。
- プロキシの設定(グローバル)
Shell
git config --global http.proxy http://user:pass@proxy.example.com:8080
git config --global https.proxy http://user:pass@proxy.example.com:8080
- 設定の表示
Shell
git config --global --get http.proxy
- 設定の解除
Shell
git config --global --unset http.proxy
ソフトウェアパッケージマネージャー
Linuxのパッケージマネージャーはsudo
と共に実行されるため、ユーザーの環境変数が引き継がれません。専用の設定ファイルが必要です。
APT (Debian/Ubuntu)
/etc/apt/apt.conf.d/
ディレクトリに設定ファイルを作成します。例えば80proxy.conf
というファイル名で、以下の内容を記述します。
Acquire::http::Proxy "http://proxy:8080/";
Acquire::https::Proxy "https://proxy:8080/";
YUM/DNF (RHEL/CentOS/Fedora)
メインの設定ファイル/etc/yum.conf
(または/etc/dnf/dnf.conf
)を編集し、[main]
ブロックに以下の行を追加します。
proxy=http://proxy.example.com:8080
proxy_username=user
proxy_password=pass
npm (Node.js)
npmはnpm config
コマンドでプロキシを設定します。設定内容はホームディレクトリの~/.npmrc
ファイルに保存されます。
Shell
npm config set proxy http://user:pass@proxy.example.com:8080
npm config set https-proxy http://user:pass@proxy.example.com:8080
コンテナ化|Docker
Dockerのプロキシ設定は特に複雑です。デーモン、クライアント、コンテナの3つのレイヤーで設定が必要になる場合があります。
Dockerデーモンの設定
docker pull
などを実行するDockerデーモン自体の設定です。systemdを利用しているLinux環境では、以下の手順で設定ファイルを作成するのが推奨される方法です。
- ディレクトリとファイルを作成します。sudo mkdir -p /etc/systemd/system/docker.service.dsudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
- ファイルに環境変数を記述します。
[Service] Environment="HTTP_PROXY=http://proxy.example.com:8080" Environment="HTTPS_PROXY=http://proxy.example.com:8080" Environment="NO_PROXY=localhost,127.0.0.1"
- 設定を再読み込みし、Dockerを再起動します。sudo systemctl daemon-reloadsudo systemctl restart docker
Dockerクライアントと実行コンテナの設定
docker build
やdocker run
時にプロキシ設定をコンテナに渡すには、ホームディレクトリの~/.docker/config.json
ファイルを編集します。
JSON
{
"proxies": {
"default": {
"httpProxy": "http://proxy.example.com:8080",
"httpsProxy": "http://proxy.example.com:8080",
"noProxy": "localhost,127.0.0.1"
}
}
}
この設定により、ビルド時やコンテナ実行時にプロキシ関連の環境変数が自動でコンテナ内に設定されます。
検証とトラブルシューティング
設定が正しく機能しているかを確認し、問題の原因を特定するための知識は不可欠です。
検証テクニック
設定が意図通りに機能しているかを確認するためのコマンドです。
- 環境変数の確認|
echo $http_proxy
(Linux/macOS) やecho %http_proxy%
(Windows) - システム設定の確認|
netsh winhttp show proxy
(Windows) やnetworksetup -getwebproxy "Wi-Fi"
(macOS) - 接続テスト|
curl https://httpbin.org/ip
を実行し、表示されるIPがプロキシサーバーのものであることを確認します。
よくある問題と解決策
私が経験した典型的なトラブルとその解決策を紹介します。
407 Proxy Authentication Required
このエラーは、認証情報が正しくないことを示します。ユーザー名やパスワードに特殊文字が含まれていないか、URLエンコーディングが正しく行われているかを確認してください。
SSL/TLSエラー
企業ネットワークでは、HTTPS通信を検査する「SSLインスペクション」が導入されていることがあります。この環境では、プロキシが提示する証明書が信頼されていないため、証明書検証エラーが発生します。解決策は、企業のルートCA証明書をシステムの信頼ストアに追加することです。最終手段としてSSL検証を無効にする方法もありますが、セキュリティリスクを伴います。
sudoと環境変数
sudo apt update
などが失敗する場合、sudo
が環境変数を引き継いでいないことが原因です。各パッケージマネージャー専用の設定ファイルを使用する方法で解決します。
まとめ
コマンドラインによるプロキシ設定は、OSとアプリケーションが織りなす複雑な階層構造の理解が鍵です。普遍的な標準がないため、環境変数、アプリ固有コマンド、設定ファイルを状況に応じて使い分ける必要があります。特に、WindowsのWinHTTPとWinINETの二重構造や、Git、Dockerといったツールの独自要件は、多くの技術者が直面する共通の課題です。
この記事で解説したように、各レイヤーの役割を体系的に理解し、正しいツールと構文を選べば、これらの課題は克服できます。認証情報を扱う際のセキュリティリスクを常に念頭に置き、安全な対策を講じることが堅牢なシステム運用には不可欠です。最後に、主要なコマンドを一覧表にまとめました。日々の業務で役立ててください。
マスターコマンドリファレンス表
OS / ツール | プロキシ設定コマンド | プロキシ表示コマンド | プロキシ解除コマンド |
Windows (システム) | netsh winhttp set proxy... | netsh winhttp show proxy | netsh winhttp reset proxy |
macOS (システム) | networksetup -setwebproxy... | networksetup -getwebproxy... | networksetup -setwebproxystate... off |
Linux (シェル) | export http_proxy="..." | echo $http_proxy | unset http_proxy |
Git | git config --global http.proxy... | git config --global --get http.proxy | git config --global --unset http.proxy |
Docker (デーモン) | daemon.json またはsystemdファイルを編集 | systemctl show --property=Environment docker | 設定を削除して再起動 |
npm | npm config set proxy... | npm config get proxy | npm config rm proxy |
APT | /etc/apt/apt.conf.d/... を編集 | cat /etc/apt/apt.conf.d/... | 設定ファイルを削除 |
YUM/DNF | /etc/yum.conf を編集 | cat /etc/yum.conf | 設定行を削除 |