AhFei

AhFei

简洁的写作需要勇气

Linuxプロキシ加速:aptとDockerの解決策

Windows やモバイル端末では、プロキシの実装方法は非常に直感的で、特定のソフトウェアを起動すれば機能します。しかし、Linux のプロキシはユーザーインターフェースがなく、実行ボタンもないため、手をこまねいてしまいます。

国内のマシンでのミラーの遅さや頻繁な切断にうんざりしていて、apt の更新に半時間もかかることがあり、AhFei もかつては苦しんでいました。

この記事の内容は、99% のプロキシ加速のニーズを解決できるはずです。国内のマシンで GitHub プロジェクトをどうやってダウンロードするのか?また、国内のマシンで apt を使ってソフトウェアを迅速に更新し、Docker でイメージを引き出すにはどうすればよいのでしょうか?

対応システム:Debian 系ディストリビューション、Ubuntu や Armbian を含む

私は何か間違えたかもしれませんので、何か間違っていたら教えてください!


なぜミラー加速を使わないのか?

  1. AhFei が初めて Linux に触れたとき、ネット上にはミラーの設定方法がたくさんありましたが、奇妙なことに、これらのミラーソースは私のマシンに対して加速効果があるとは言えず、肉眼で識別できない程度でした。だから、私にはミラー加速はゴミのように思えました。
  2. 根本的な手段。清風山岡、明月大江。プロキシ加速、一発で全てを解決するのが良い使い方であり、広く適用できます。

次に、魔法のソフトウェアをインストールし、設定を編集し、SOCKS5 および HTTP プロキシアドレスを取得する方法については、各プロジェクトの公式チュートリアルを参照してください。この記事は加速のための方法に特化しており、技術交流を目的としており、魔法の方法には触れません

仮に SOCKS プロキシアドレスが 127.0.0.1:1080、HTTP プロキシアドレスが 127.0.0.1:8118 だとします。


プロキシが正常に動作しているかを確認する方法:(cip.ccというサイトは、あなたのマシンの IP を返します)

# SOCKSプロキシ
curl -x socks5://127.0.0.1:1080 cip.cc
# HTTPプロキシ
curl -x 127.0.0.1:10809 cip.cc

パスワード付きの場合:

curl -x socks5://Username:[email protected]:10808 cip.cc

SOCKS を HTTP プロキシに変換#

このセクションがある理由は、一部の魔法の方法が HTTP プロキシを提供せず、SOCKS を HTTP に変換する必要があるためです。apt や Docker などで使用するためです。

すでに HTTP プロキシがある場合は、スキップできます。

privoxy#

公式サイト: Privoxy - Home Page

インストール:

sudo apt install -y privoxy

設定:

sudo vim /etc/privoxy/config

listen-addressforward-socks5tを変更します。具体的な説明:

  1. listen-addressは後でローカル HTTP プロキシがリッスンするポートで、デフォルトは 127.0.0.1 の 8118 ポートです。
# 国内のマシンの場合、ローカルアクセスのみを許可するように設定すべきです
listen-address  127.0.0.1:8118
# 家のサーバーの場合は、他のローカルネットワークのマシンが使用できるように開放できます
listen-address  0.0.0.0:8118

8118 ポートはもちろん自由に変更できます。他のプログラムに占有されていなければ大丈夫です。

  1. forward-socks5tは privoxy がリッスンする SOCKS プロキシで、上記の HTTP ポートリッスンをこの SOCKS プロキシに転送するための橋渡しです。最後の.を忘れないでください。
forward-socks5t  /  127.0.0.1:1080 .
# パスワード付き
forward-socks5  /  Username:[email protected]:1080 .

再起動して適用:

sudo systemctl restart privoxy.service
sleep 3
sudo systemctl status privoxy.service

forward-socks5tforward-socks5は 2 つの異なるプロキシプロトコルです。

  1. forward-socks5t:これは透明な転送をサポートする SOCKS5 プロキシプロトコルです。このプロトコルを使用すると、プロキシサーバーはクライアントが送信した TCP パケットをそのままターゲットサーバーに転送し、ターゲットサーバーからの応答も直接クライアントに送信されます。この方法は透明なプロキシを実現し、クライアントとターゲットサーバー間の接続は両者にとって完全に透明で、互いに認識しません。
  2. forward-socks5:これは通常の SOCKS5 プロキシプロトコルです。このプロトコルを使用する場合、クライアントはプロキシサーバーとの接続を確立した後、特定のコマンドを送信してプロキシサーバーにターゲットサーバーとの接続を確立するよう要求する必要があります。プロキシサーバーはクライアントの要求データをターゲットサーバーに中継し、ターゲットサーバーからの応答をクライアントに送信します。この方法では、クライアントは自分がプロキシを介して通信していることを認識し、ターゲットサーバーもリクエストがプロキシサーバーから来ていることを知っています。

したがって、違いは主に透明な転送と通常のプロキシの違いにあります。クライアントとターゲットサーバー間のプロキシの存在を隠す必要がある場合は、forward-socks5tを使用できます。一方、クライアントとターゲットサーバーがプロキシの存在を認識し、特定のインタラクションプロトコルで通信する場合は、forward-socks5を使用できます。

環境変数の設定#

まず原理を説明します。この方法が特定のソフトウェアにプロキシを通させ、他のソフトウェアには効果がない理由は、効果のあるソフトウェアが実行時に環境変数にプロキシが設定されているかを確認し、あれば当然プロキシを通るからです。

つまり、この方法自体はマシンのネットワーク構造を変更するものではなく、効果があるかどうかはソフトウェアがサポートしているかどうかに依存します。

サポートされているソフトウェアは、一般的に手動でプロキシを指定するオプションを提供するため、より制御が可能です。例えば:

pip3(環境変数 http_proxy があれば、これを使用する必要はありません)

pip3 install --proxy="http://127.0.0.1:8118" packageName

2 つの環境変数のみを設定します:HTTP_PROXYHTTPS_PROXY

export http_proxy="http://127.0.0.1:8118"   # httpトラフィックが通るプロキシ
export https_proxy="http://127.0.0.1:8118"
export no_proxy=127.0.0.1,localhost,192.168.*   # プロキシを通さないネットワークセグメント

プロキシを解除する:

unset http_proxy https_proxy no_proxy

プロキシが機能しているかをテストする:

curl cip.cc

認証付きのプロキシ:

export http_proxy="Username:Password@proxy-server-ip:8118"
export https_proxy="Username:Password@proxy-server-ip:8118"

上記のコマンドは使いにくいため、エイリアスを使用してコマンドを簡略化できます。

vim ~/.bashrc

追加(プロキシのアドレスを変更することに注意):

alias ftz='export http_proxy="127.0.0.1:8118" https_proxy="127.0.0.1:8118" no_proxy=127.0.0.1,localhost,192.168.*'
alias ctz='unset http_proxy https_proxy no_proxy'

すぐに設定を有効にする:

source ~/.bashrc

これで、サーバーに接続した後、ターミナルで

  • ftz(プロキシを有効にする)と入力すれば、ターミナルにプロキシが設定されます。
  • ctz(プロキシを無効にする)と入力すれば、ターミナルのプロキシが解除されます。

また、ftz の後、このプロキシは現在のターミナルでのみ有効で、退出して再ログインするとプロキシは無効になります。これにより、より良い制御が可能です。

apt プロキシ#

Apt は HTTP Proxy 環境変数を使用しません。独立した設定ファイルを使用します。

/etc/apt/apt.conf.d/に新しい設定ファイルを作成します:

sudo vim /etc/apt/apt.conf.d/proxy.conf
Acquire {
  HTTP::proxy "http://127.0.0.1:8118";
  HTTPS::proxy "http://127.0.0.1:8118";
}

確認:

sudo apt update

Docker イメージプロキシ#

イメージの取得と管理はすべて docker daemon が担当し、docker daemon は systemd によって管理されているため、systemd の設定から始めて docker daemon にプロキシを設定します。

公式ドキュメント: Configure the daemon with systemd | Docker Docs

  1. dockerd 関連の systemd ディレクトリを作成します。この.d ディレクトリ内の設定はデフォルトの設定を上書きします。
sudo mkdir -p /etc/systemd/system/docker.service.d
  1. 新しい設定ファイルhttp-proxy.confを作成します。
sudo vim /etc/systemd/system/docker.service.d/proxy.conf

設定を追加します。前述のように:

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:8118/"
Environment="HTTPS_PROXY=http://127.0.0.1:8118/"
Environment="NO_PROXY=127.0.0.1,localhost,192.168.*,*.example.com"
# `NO_PROXY=*`の場合、すべてのリクエストはプロキシサーバーを通過しません
  1. 設定ファイルを再読み込みし、Dockerd を再起動して適用します。
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 環境変数が正しく設定されているか確認します:
sudo systemctl show --property=Environment docker

イメージを取得して加速効果を試してみてください。

Docker コンテナプロキシ#

コンテナの実行段階でインターネットにプロキシを通す必要がある場合、環境変数を追加するだけで済みます。例えば docker-compose を使用する場合、その設定ファイルの環境変数に以下の 3 つを追加します。

    environment:
        - http_proxy="192.168.1.11:10809"
        - https_proxy="192.168.1.11:10809"
        - no_proxy="localhost,127.0.0.1,.example.com"

その原理は、上記の「環境変数を設定する」ということです。したがって、効果があるかどうかは、内部で実行されるサービスが環境変数を取得するかどうかに依存します。

これはあまり役に立たないように感じますが、国内の emby がスクレイピングできない場合にこれを使って解決できます。しかし、このようなグローバル変数は他の機能に影響を与える可能性があります。


コンテナがデフォルトでプロキシを使用する場合、~/.docker/config.jsonを設定することもできます。

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://proxy.example.com:8080",
     "httpsProxy": "http://proxy.example.com:8080",
     "noProxy": "localhost,127.0.0.1,.example.com"
   }
 }
}

これはユーザーレベルの設定で、proxiesの他に、docker loginなどの関連情報も含まれます。また、情報表示の形式やプラグインのパラメータなども設定できます。

注意docker rundocker buildはデフォルトでネットワークが隔離されています。プロキシがlocalhost:3128のようなものである場合、無効になります。このようなローカルのプロキシは、--network hostを追加しないと正常に使用できません。

Docker Build プロキシ#

docker buildの本質は、コンテナを起動することですが、環境は若干異なり、ユーザーレベルの設定は無効です。ビルド時には、http_proxyなどのパラメータを注入する必要があります。

docker build . \
    --build-arg "HTTP_PROXY=http://proxy.example.com:8080/" \
    --build-arg "HTTPS_PROXY=http://proxy.example.com:8080/" \
    --build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \
    -t your/image:tag

原文リンク: https://technique.vfly2.com/2023/11/linux-proxy-acceleration-for-apt-docker/

版权声明:本博客所有文章除特別声明外,均为 AhFei 原创,采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 技焉洲 (technique.vfly2.com)

保持更新 ٩(・̤̀ᵕ・̤́๑)ᵒᵏᵎᵎᵎᵎ 清晰恒益的实用技能,欢迎使用 RSS 订阅,或在支持 ActivityPub 的平台关注 @[email protected] 接收新文章的推送,如果能留言互动就更好了。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。