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

本文的内容应该能解决国内 Linux 上 99% 的加速需求:克隆 GitHub 项目,使用 apt 更新软件和拉取 Docker 镜像。

为什么不用镜像加速?

  1. AhFei 在初接触 Linux 时,看到网络上都是通过配置镜像加速,但奇怪的是这些镜像源,对我的机器加速效果不能说完全没有,只能说肉眼分辨不出来。所以给我镜像加速无用的印象, 2024 年 6 月 6 号,国内 docker 镜像源全部中止,并且传言 npm、pip、apt 都会禁止。
  2. Linux代理 是釜底抽薪的手段。清风山冈、明月大江。代理加速,一招鲜,吃遍天,好用适用广。
  3. 自建镜像,需要额外安装,并且总不能 Docker、npm、apt、pip 全来一份吧。

本文只为如何用于加速而写,技术交流,不涉及任何魔法方法

适用系统:Debian 系发行版,包括 Ubuntu 和 Armbian


需要自行准备 HTTP 代理,如果只有 SOCKS,可以看文末将 SOCKS 转换为 HTTP 代理。

假设 HTTP 代理地址为 127.0.0.1:10809,验证一下代理是否正常运行:(cip.cc 这个网站会返回代理的 IP)

# HTTP 代理
curl -x 127.0.0.1:10809 cip.cc

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:10809";
  HTTPS::proxy "http://127.0.0.1:10809";
}

这样就好了,验证:

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. 新建配置文件 proxy.conf
sudo vim /etc/systemd/system/docker.service.d/proxy.conf

添加配置,类似前面的

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:10809/"
Environment="HTTPS_PROXY=http://127.0.0.1:10809/"
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

可以拉取镜像试试加速效果了

设置环境变量——加速下载 GitHub

只需要设置两个环境变量:HTTP_PROXY 和 HTTPS_PROXY

export http_proxy="http://127.0.0.1:10809"   # http 流量走的代理
export https_proxy="http://127.0.0.1:10809"
export no_proxy=127.0.0.1,localhost,192.168.*   # 不进行代理的网段

如果运行了一个 bash 脚本,即便终端执行了上面的命令,默认脚本不会走代理。因为环境变量仅在当前终端有效;可以编辑脚本文件,在里面开头,放上上面的三行,就可以让脚本在执行时,也走代理。

取消代理

unset http_proxy https_proxy no_proxy

测试一下

curl cip.cc

有验证的代理:

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

用 alias 设置别名

vim ~/.bashrc

添加(注意修改代理的地址)

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

立刻让配置生效:

source ~/.bashrc

这样以后连接上服务器,终端

  • 输入 ftz(放梯子)即可为终端设置代理
  • 输入 ctz(撤梯子)即可为终端取消代理

这个代理只在当前终端生效,如果退出,再登录,就没有代理了。这样可控性更好。


说下原理,这个方法之所以能让某些软件走代理,而对另一些不生效,是因为,生效的那些软件,会在运行时检查环境变量里有没有设置代理,有的话自然就走了。

也就是说,这种方式,本身并不会改变机器的网络结构,能否起作用,全在于软件支持不支持。

支持的软件,一般也应该会提供选项,手动指明代理,这样其实更可控一些。比如:

pip(若已经设置了环境变量 http_proxy,其实不需要指定)

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

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

SOCKS 转换 HTTP 代理

有此节的原因,是有的魔法方法不提供 HTTP 代理,必须要把 SOCKS 转成 HTTP 才能给 apt、Docker 等使用。

假设 SOCKS 代理地址为 127.0.0.1:1080,验证一下代理是否正常运行

# SOCKS 代理
curl -x socks5://127.0.0.1:1080 cip.cc
# 带密码的
curl -x socks5://Username:Password@127.0.0.1:1080 cip.cc

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:Password@127.0.0.1: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


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

原文链接: https://technique.vfly2.com/2023/11/linux-proxy-acceleration-for-apt-docker/

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

保持更新 ٩(•̤̀ᵕ•̤́๑)ᵒᵏᵎᵎᵎᵎ 清晰恒益的实用技能,欢迎使用 RSS 订阅,如果能留言互动就更好了。

可在 Telegram 群组 https://t.me/vfly2 交流依文章步骤遇到的问题。

推特上的分享让这篇文章一天就达到 300 人访问,博客建立以来的巅峰了,调整了文章顺序,简化了表达,更易读了。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇