😇

Proxy環境下でLinuxを使うときのまとめ

2023/03/26に公開

個人的な備忘録。

インターネットアクセスにプロキシが必要な環境において、
WSL2などを動かすのに割と設定が必要だったりトラップがあるのでまとめる。

0. 前提

プロキシサーバーへのアクセスには

  • IPv4アドレス(X.X.X.X) またはドメイン名などの場合もあるかも
  • ポート番号
  • 認証用ID(あれば)
  • 認証用パスワード(あれば)

あたりが必要であると仮定する。
この場合、プロキシサーバーへのアクセスに必要なURLは

  • http://<id>:<password>@X.X.X.X:<port番号>

といった形式になる。

以降、"プロキシURL"と書いた場合は上記のようなものを指すとする。

(参考)

記号を使う場合

1. 一般ユーザーの環境変数の設定

curlでファイルをダウンロードしたりWeb APIにリクエストを投げたり、
pipやnpmといったパッケージマネージャーで開発に必要なライブラリ/パッケージを管理したり、
などといった様々な場面で出てくるインターネットアクセスを伴う作業に必要な設定。

環境変数で設定しておくと各ツールやライブラリがそれを参照してよしなにやってくれることがほとんどで、一般的には~/.bashrc~/.zshrcなどに以下の設定を追記すればOK

~/.bashrc
# 以下を追記

# http://<id>:<password>@X.X.X.X:<port番号>
_PROXY=<プロキシURL>

# httpおよびhttpsを使う際に参照するプロキシのURLを指定する
export http_proxy=${_PROXY}
export https_proxy=${_PROXY}

# localhostやプロキシ内(社内イントラなど)に存在し、プロキシを経由させるべきでないものを指定する
export no_proxy=localhost,127.0.0.1

# linuxだとたいてい環境変数名は小文字で動作するが、稀に大文字を参照するものがあった気もするので一応設定
export HTTP_PROXY=${http_proxy}
export HTTPS_PROXY=${https_proxy}
export NO_PROXY=${no_proxy}

unset _PROXY

http_proxyhttps_proxyを設定する記事や解説は大量に出てくるが、no_proxyは結構見落としがちなトラップである。
no_proxyの設定を忘れると、例えばcurl http://localhost:3000などとしたときにプロキシサーバーを経由しようとするのでアクセスに失敗する。

(参考)

2. システムのパッケージマネージャー用の設定

aptdnfなどでシステムにパッケージをインストールする場合、
rootユーザーで実行したりsudoをつけて実行することから分かるように、
一般ユーザーのプロセスで動く訳ではないので1. 一般ユーザーの環境変数の設定
は有効ではない。

このため、パッケージマネージャーの設定ファイルに対して別途プロキシ周りの設定を追加していく。

2-1. Ubuntu(Debian系)

(自分で試しているのはUbuntuのみだが、後述の参考リンクの感じだとDebianはじめ他のDebian系distributionでも同様と思われる)

/etc/apt/apt.conf.d/01proxyを作成の上、以下のよう内容を記入する

/etc/apt/apt.conf.d/01proxy
# /etc/apt/apt.conf.d/01proxy

# <プロキシURL>はhttp://<id>:<password>@x.x.x.x:<port>のような形式
Acquire::http::Proxy "<プロキシURL>";
Acquire::https::Proxy "<プロキシURL>";

これでapt installだったりapt searchなどを行う際にプロキシを経由するようになり、正しく動作するようになる。

(参考)

2-2. RedHat系

FedoraCentOS, Rocky LinuxAlmaLinuxなど。
プロキシ環境下で動かす機会はあまり無さそうだがAmazonLinuxなども。

最近のものだとdnfコマンド、少し古いとyumコマンドでパッケージ管理を行うが、
それぞれで編集が必要なファイルが異なる。

yumの場合、/etc/yum.conf[main]セクションに以下の内容を追記する。

/etc/yum.conf
[main]
# (...他の諸々の設定)
# プロキシURLはhttp://<id>:<password>@x.x.x.x:<port>のような内容
proxy=<プロキシURL>

dnfの場合、/etc/dnf/dnf.conf[main]セクションに以下の内容を追記する。

/etc/dnf/dnf.conf
[main]
# (...他の諸々の設定)
# プロキシURLはhttp://<id>:<password>@x.x.x.x:<port>のような内容
proxy=<プロキシURL>

(参考)

2-3. その他

個人的に使いそうなリンクなどを適当に追記していく

3. Dockerを使うための設定

Dockerはデーモンが起動する、コンテナにホストOS側が設定を渡す、といったような感じで
1. 2. とはまた別に設定が必要になってくる。

動作の仕組みが理解できてくると聞けば納得出来るが、初見ではつらいトラップである。

3-1. Dockerデーモン向けの設定

例えば、docker pullしてコンテナイメージをリポジトリからダウンロードするときなどに必要。

3-1-1. Ubuntuなどの場合

(2023-03-27追記)systemdを有効にしている場合は/etc/default/dockerは働かず、3-1-2.と同じになるので、そちらを参照のこと。

docker docs記載のインストール手順に従って
docker-ceをインストールしていると仮定する。

この場合、/etc/default/dockerという設定ファイルが作成されており、その中でproxy周りの設定を行うことが出来る。
(コメントアウトされている中でproxy周りの解説もされている)

以下のような内容を追記する

/etc/default/docker
# 以下のような内容を追記

# プロキシURL: http://<id>:<password>@x.x.x.x:<port> のような内容
export http_proxy="<プロキシURL>"
export https_proxy=$http_proxy

これでdocker pullなどが正常に動くようになる

(参考)

3-1-2. systemdを使う場合

/etc/systemd/system/docker.service.d/http-proxy.confにプロキシの設定を行う。
(該当ファイルが無ければ新規作成する)

/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=<プロキシURL>"
Environment="HTTPS_PROXY=<プロキシURL>"
Environment="NO_PROXY="localhost,127.0.0.1,::1"

なお、ファイルを作成・記入しただけでは反映されないので、以下のように設定の読み込みとサービスの再起動を行う

sudo systemctl daemon-reload
sudo systemctl restart docker

(参考)

3-2. コンテナ用の設定

3-1.はあくまでデーモン用の設定でありコンテナに設定が渡される訳では無いため、
コンテナ内からインターネットアクセスを行う、といったことを行うにはまた別に設定が必要。

設定方法は公式ドキュメントにほぼそのまま書いてあり、

を参照すればOK。

docker docsにおける設定例:

~/.docker/config.json
{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://192.168.1.12:3128",
     "httpsProxy": "http://192.168.1.12:3128",
     "noProxy": "*.test.example.com,.example2.com,127.0.0.0/8"
   }
 }
}

httpProxyおよびhttpsProxyでこの記事内で散々書いてきたプロキシURLを設定し、
同様にnoProxyもlocalhostなど必要なものを環境変数no_proxyと同様に設定することで、
Dockerコンテナ内でも普通にインターネットアクセスが出来るようになる。

4. その他

追記: 2024-05-25

プロキシとの格闘の続き(?)として、

https://zenn.dev/junkor/articles/82aba65d2f0880

を書いた。
プロキシの中からSaaS版のGitHub/BitBucket/GitLabにssh接続したいレアな状況で役立つかもしれない(?)

GitHubで編集を提案

Discussion