在 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!
為什麼不用鏡像加速?
- AhFei 在初接觸 Linux 時,看到網路上都是配置鏡像的方法,但奇怪的是,這些鏡像源對我的機器加速效果不能說完全沒有,只能說肉眼分辨不出來。所以給我的印象,鏡像加速就是垃圾。
- 釜底抽薪的手段。清風山岡、明月大江。代理加速,一招鮮,吃遍天,就是好用就是適用廣。
接著,怎麼安裝魔法軟體、編輯配置、得到 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#
安裝:
sudo apt install -y privoxy
配置:
sudo vim /etc/privoxy/config
更改 listen-address
和 forward-socks5t
,具體說明:
listen-address
是稍後本機 HTTP 代理監聽端口,默認是監聽 127.0.0.1 的 8118 端口
# 如果是國內機子,應該設置只允許本機訪問
listen-address 127.0.0.1:8118
# 如果是家裡的伺服器,可以放開,方便局域網其他機器使用
listen-address 0.0.0.0:8118
8118 端口當然可以隨意修改,不被其他程序佔用就行
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-socks5t
和 forward-socks5
是兩種不同的代理協議。
- forward-socks5t:這是一種支持透明傳輸的 SOCKS5 代理協議。使用該協議時,代理伺服器將客戶端發出的 TCP 資料包原樣轉發到目標伺服器,而目標伺服器返回的響應也會直接傳送回客戶端。這種方式實現了透明代理,使得客戶端和目標伺服器之間的連接對雙方來說都是完全透明的,彼此無感知。
- forward-socks5:這是一種普通的 SOCKS5 代理協議。在使用該協議時,客戶端與代理伺服器之間建立連接後,客戶端需要發送特定的命令請求代理伺服器與目標伺服器建立連接。代理伺服器將客戶端請求的資料中繼給目標伺服器,並將目標伺服器返回的響應發送回客戶端。這種方式下,客戶端意識到自己正在通過代理進行通信,而目標伺服器也知道請求來自代理伺服器。
因此,區別主要在於透明傳輸和普通代理之間的差異。當需要隱藏客戶端和目標伺服器之間的代理存在,使其對雙方透明時,可以選擇使用 forward-socks5t
。而如果客戶端和目標伺服器意識到代理的存在,並且有特定的交互協議進行通信,那麼可以選擇使用 forward-socks5
。
設置環境變量#
先說原理,這個方法之所以能讓某些軟體走代理,而對另一些不生效,是因為,生效的那些軟體,會在運行時檢查環境變量裡有沒有設置代理,有的話自然就走了。
也就是說,這種方式,本身並不會改變機器的網路結構,能否起作用,全在於軟體支持不支持。
支持的軟體,一般應該會提供選項,手動指明代理,這樣其實更可控一些。比如:
pip3(若有環境變量 http_proxy,不需要用這個)
pip3 install --proxy="http://127.0.0.1:8118" packageName
只設置兩個環境變量:HTTP_PROXY
和 HTTPS_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
- 創建 dockerd 相關的 systemd 目錄,這種 .d 目錄下的配置將覆蓋默認配置
sudo mkdir -p /etc/systemd/system/docker.service.d
- 新建配置文件
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=*`,那麼所有請求都將不通過代理伺服器
- 重新加載配置文件,重啟 Dockerd 才能生效
sudo systemctl daemon-reload
sudo systemctl restart docker
- 檢查確認環境變量已經正確配置:
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"
}
}
}
這個是用戶級的配置,除了 proxies
,docker 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]
接收新文章的推送,如果能留言互動就更好了。