8.

HTTP プロキシ完全ガイド(環境変数 / npm / git / apt / curl の設定)

編集
この記事の要点
  • 環境変数: HTTP_PROXY / HTTPS_PROXY / NO_PROXY(大文字版と小文字版があり、ツールによる)
  • npm: npm config set proxy http://host:port / npm config set https-proxy http://host:port
  • git: git config --global http.proxy http://host:port
  • apt: /etc/apt/apt.conf.d/95proxyAcquire::http::Proxy "http://...";
  • 認証付き: http://user:pass@host:port。パスワードの特殊文字は URL エンコード必須

プロキシとは

プロキシ (Proxy) は、クライアントとサーバーの間に立って通信を中継するサーバーです。社内 LAN や教育機関のネットワークでは、外部インターネットへのアクセスは必ずプロキシ経由という設定が一般的で、各種ツールにプロキシ設定をしないと「タイムアウト」「Could not resolve host」などのエラーで通信できません。

種類用途
Forward Proxyクライアント側プロキシ。一般的な「会社のプロキシ」
Reverse Proxyサーバー側。Nginx / HAProxy 等。ロードバランシングや SSL 終端
Transparent Proxyクライアント設定不要で透過的に挟む
SOCKS ProxyHTTP 以外も中継可能(SSH の -D オプション等)

環境変数によるプロキシ設定(基本)

多くの CLI ツールは以下の環境変数を見ます:

# Linux / Mac (bash/zsh)
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.com

# 小文字版も併設するとより確実(ツールにより参照が違う)
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.com

# 永続化(bashrc)
cat >> ~/.bashrc <<'EOF'
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.com
EOF
source ~/.bashrc

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.com"

# 永続化(ユーザー環境変数)
[Environment]::SetEnvironmentVariable("HTTP_PROXY",  "http://proxy.example.com:8080", "User")
[Environment]::SetEnvironmentVariable("HTTPS_PROXY", "http://proxy.example.com:8080", "User")

NO_PROXY の書き方

「社内 LAN は直接アクセス、外部だけプロキシ経由」という運用に必須です:

# カンマ区切り、ドメインの先頭 . はサブドメインマッチ
export NO_PROXY="localhost,127.0.0.1,::1,10.0.0.0/8,192.168.0.0/16,.example.com,.local"

# 注意点
# - スペース禁止("a, b" → "b" が無効になることがある)
# - CIDR は対応ツール限定
# - ワイルドカード * 対応もツール依存

npm のプロキシ設定

# 設定
npm config set proxy       http://proxy.example.com:8080
npm config set https-proxy http://proxy.example.com:8080
npm config set registry    https://registry.npmjs.org/

# 確認
npm config list
npm config get proxy

# 削除
npm config delete proxy
npm config delete https-proxy

# 認証付き(パスワードはエンコード)
npm config set https-proxy http://user:pa%24sword@proxy.example.com:8080

# .npmrc に直書き(プロジェクトルート)
cat > .npmrc <<'EOF'
proxy=http://proxy.example.com:8080
https-proxy=http://proxy.example.com:8080
strict-ssl=false
EOF

git のプロキシ設定

# グローバル設定
git config --global http.proxy  http://proxy.example.com:8080
git config --global https.proxy http://proxy.example.com:8080

# 確認
git config --global --get http.proxy

# 削除
git config --global --unset http.proxy
git config --global --unset https.proxy

# 特定 URL だけプロキシを使う
git config --global http.https://github.com.proxy http://proxy.example.com:8080

# SSH 経由のプロキシ(ProxyJump / nc)
cat >> ~/.ssh/config <<'EOF'
Host github.com
  ProxyCommand nc -X connect -x proxy.example.com:8080 %h %p
  Hostname ssh.github.com
  Port 443
  User git
EOF

apt / yum / dnf のプロキシ

# apt (Debian / Ubuntu)
sudo tee /etc/apt/apt.conf.d/95proxy <<'EOF'
Acquire::http::Proxy  "http://proxy.example.com:8080";
Acquire::https::Proxy "http://proxy.example.com:8080";
EOF

# yum (RHEL/CentOS 7)
sudo tee -a /etc/yum.conf <<'EOF'
proxy=http://proxy.example.com:8080
proxy_username=user
proxy_password=pass
EOF

# dnf (RHEL/CentOS 8+)
sudo tee -a /etc/dnf/dnf.conf <<'EOF'
proxy=http://proxy.example.com:8080
EOF

curl / wget のプロキシ

# curl: 環境変数を見るので export しておけば不要
curl https://example.com

# 明示指定
curl -x http://proxy.example.com:8080 https://example.com
curl --proxy http://user:pass@proxy.example.com:8080 https://example.com

# .curlrc に書く
cat > ~/.curlrc <<'EOF'
proxy = "http://proxy.example.com:8080"
EOF

# wget
wget -e use_proxy=yes -e http_proxy=http://proxy.example.com:8080 https://example.com

# .wgetrc に書く
cat > ~/.wgetrc <<'EOF'
http_proxy = http://proxy.example.com:8080
https_proxy = http://proxy.example.com:8080
use_proxy = on
EOF

Docker のプロキシ

# Docker daemon のプロキシ (Linux)
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<'EOF'
[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,.example.com"
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

# コンテナビルド時に渡す
docker build --build-arg HTTP_PROXY=$HTTP_PROXY --build-arg HTTPS_PROXY=$HTTPS_PROXY .

# コンテナ内で使う
docker run -e HTTP_PROXY=$HTTP_PROXY -e HTTPS_PROXY=$HTTPS_PROXY ubuntu apt update

認証付きプロキシと特殊文字

# 書式: http://USER:PASS@HOST:PORT
export HTTP_PROXY=http://alice:secret@proxy.example.com:8080

# パスワードに @ ! # $ % 等が含まれる場合は URL エンコード必須
# @ → %40, ! → %21, # → %23, $ → %24, % → %25, & → %26
# pa@ss!word  →  pa%40ss%21word

# Python でエンコード
python3 -c "from urllib.parse import quote; print(quote('pa@ss!word'))"
# → pa%40ss%21word

PAC ファイル (Proxy Auto-Config)

会社支給 PC で「http://wpad.example.com/proxy.pac」のようなアドレスを指定されている場合は PAC ファイル方式。CLI ツールは PAC を直接サポートしないので、PAC の中身を読んで該当する HTTP プロキシを抜き出して環境変数に設定します:

# PAC ファイルを取得して中身を見る
curl http://wpad.example.com/proxy.pac

# 中身(例)
# function FindProxyForURL(url, host) {
#   if (isInNet(host, "10.0.0.0", "255.0.0.0")) return "DIRECT";
#   return "PROXY proxy.example.com:8080";
# }

# CLI 用は「PROXY」行のサーバーを取り出して環境変数化
export HTTP_PROXY=http://proxy.example.com:8080

プロキシ確認とトラブルシュート

# プロキシ越しの自己 IP を確認
curl https://ifconfig.io
curl -x http://proxy.example.com:8080 https://ifconfig.io

# 接続確認
curl -v https://www.google.com 2>&1 | grep -i proxy

# プロキシまでの疎通
nc -vz proxy.example.com 8080
telnet proxy.example.com 8080

# 各ツールが今どのプロキシを見ているか
echo $HTTP_PROXY
echo $HTTPS_PROXY
npm config get proxy
git config --get http.proxy

FAQ

Q: プロキシ経由で SSL 証明書エラーが出る
A: 企業プロキシが SSL 検査(中間者)している可能性。社内 CA 証明書を OS の信頼ストアに追加すれば解決します。

Q: 環境変数を設定したのに sudo すると効かない
A: sudo はデフォルトで環境変数を引き継ぎません。sudo -E または visudoDefaults env_keep += "HTTP_PROXY HTTPS_PROXY"

Q: VS Code / Chrome / Edge のプロキシ
A: 多くは OS のシステムプロキシ設定を継承。明示設定したい場合は VS Code は http.proxy、Chrome は --proxy-server 起動オプション。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ネットワークの範囲と種類
  2. ネットワーク機器
  3. OSI参照モデル
  4. プロトコル
  5. ポート番号
  6. IPアドレス
  7. MACアドレス
  8. プロキシ