Proxy環境下でLinuxを使うときのまとめ
個人的な備忘録。
インターネットアクセスにプロキシが必要な環境において、
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
# 以下を追記
# 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_proxy
やhttps_proxy
を設定する記事や解説は大量に出てくるが、no_proxy
は結構見落としがちなトラップである。
no_proxy
の設定を忘れると、例えばcurl http://localhost:3000
などとしたときにプロキシサーバーを経由しようとするのでアクセスに失敗する。
(参考)
2. システムのパッケージマネージャー用の設定
apt
やdnf
などでシステムにパッケージをインストールする場合、
rootユーザーで実行したりsudo
をつけて実行することから分かるように、
一般ユーザーのプロセスで動く訳ではないので1. 一般ユーザーの環境変数の設定
は有効ではない。
このため、パッケージマネージャーの設定ファイルに対して別途プロキシ周りの設定を追加していく。
2-1. Ubuntu(Debian系)
(自分で試しているのはUbuntuのみだが、後述の参考リンクの感じだとDebianはじめ他のDebian系distributionでも同様と思われる)
/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系
FedoraやCentOS, Rocky LinuxやAlmaLinuxなど。
プロキシ環境下で動かす機会はあまり無さそうだがAmazonLinuxなども。
最近のものだとdnf
コマンド、少し古いとyum
コマンドでパッケージ管理を行うが、
それぞれで編集が必要なファイルが異なる。
yum
の場合、/etc/yum.conf
の[main]
セクションに以下の内容を追記する。
[main]
# (...他の諸々の設定)
# プロキシURLはhttp://<id>:<password>@x.x.x.x:<port>のような内容
proxy=<プロキシURL>
dnf
の場合、/etc/dnf/dnf.conf
の[main]
セクションに以下の内容を追記する。
[main]
# (...他の諸々の設定)
# プロキシURLはhttp://<id>:<password>@x.x.x.x:<port>のような内容
proxy=<プロキシURL>
(参考)
2-3. その他
個人的に使いそうなリンクなどを適当に追記していく
- ArchLinux(pacman)
- msys2
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周りの解説もされている)
以下のような内容を追記する
# 以下のような内容を追記
# プロキシURL: http://<id>:<password>@x.x.x.x:<port> のような内容
export http_proxy="<プロキシURL>"
export https_proxy=$http_proxy
これでdocker pull
などが正常に動くようになる
(参考)
- Qiita - Proxy環境下のDockerトラブルシューティング
- Qiita - Proxy環境でdockerを外に繋ぐ方法
- DockerのProxy初期設定
- 【プロキシ対応】Docker Desktop for Windowsを使わず、WSL2 / Ubuntu に apt で Docker を入れる
3-1-2. systemdを使う場合
/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
(参考)
- Configure the daemon with systemd
- Qiita - Proxy環境下のDockerトラブルシューティング
- Qiita - Proxy環境でdockerを外に繋ぐ方法
- https://www.sneppets.com/cloud/docker/docker-error-response-from-daemon-get-https-registry-1-docker-io-v2-dial-tcp-lookup-registry-1-docker-io-no-such-host/
3-2. コンテナ用の設定
3-1.はあくまでデーモン用の設定でありコンテナに設定が渡される訳では無いため、
コンテナ内からインターネットアクセスを行う、といったことを行うにはまた別に設定が必要。
設定方法は公式ドキュメントにほぼそのまま書いてあり、
を参照すればOK。
docker docsにおける設定例:
{
"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
プロキシとの格闘の続き(?)として、
を書いた。
プロキシの中からSaaS版のGitHub/BitBucket/GitLabにssh接続したいレアな状況で役立つかもしれない(?)
Discussion