AhFei

AhFei

简洁的写作需要勇气

Linux代理加速:apt 和 Docker 的解決方案

在 Windows 和手機端,實現代理的方式很直觀,某個軟體,開啟運行,就能發揮一些作用。但 Linux 代理,沒有使用者介面,沒有運行按鈕,無從下手。

受夠了國內機器拉鏡像龜速,經常斷聯;apt 更新一次半小時過去了,AhFei 曾經也深受折磨。

本文的內容應該能解決 99% 的代理加速需求。怎麼在國內機器上下載 GitHub 項目?又怎麼在國內機器上使用 apt 快速更新軟體和使用 Docker 拉取鏡像?

適用系統:Debian 系發行版,包括 Ubuntu 和 Armbian

I might have made some mistakes, please let me know if I’ve gotten anything wrong!


為什麼不用鏡像加速?

  1. AhFei 在初接觸 Linux 時,看到網路上都是配置鏡像的方法,但奇怪的是,這些鏡像源對我的機器加速效果不能說完全沒有,只能說肉眼分辨不出來。所以給我的印象,鏡像加速就是垃圾。
  2. 釜底抽薪的手段。清風山岡、明月大江。代理加速,一招鮮,吃遍天,就是好用就是適用廣。

接著,怎麼安裝魔法軟體、編輯配置、得到 SOCKS5 和 HTTP 代理地址,請查看各大項目官方教程中,在 Linux 上怎麼安裝客戶端來解決。本文只為如何用於加速而寫,技術交流,不涉及任何魔法方法

假設 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 是兩種不同的代理協議。

  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

只設置兩個環境變量: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"

上面的命令使用不便,可以使用 alias 簡化命令

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 的話,其配置文件裡的環境變量,增加下面三部分即可。

    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"
   }
 }
}

這個是用戶級的配置,除了 proxiesdocker login 等相關信息也會在其中。而且還可以配置信息展示的格式、插件參數等。

注意:無論是 docker run 還是 docker 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] 接收新文章的推送,如果能留言互動就更好了。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。