1. 现状与痛点

1.1. 国内开发者痛点问题

在国内开发环境下,工具如 apt、pip、curl、git、wget 等经常需要访问国外资源,但国内访问这些资源时常会遇到 下载慢、连接失败或超时 的问题,这不仅影响开发效率。
配置 Linux 网络代理 是解决这一问题的关键方案,可以让开发者顺畅访问各种服务与资源。

  • 客观限制:开发工具访问国外资源不稳定。
  • 常见现象
    • 连接超时:Connection Timed Out,依赖无法下载
    • DNS 污染:域名解析错误,导致访问失败
    • 间歇性阻断:下载大文件中断或速度极慢

1.2. 为什么要配置网络代理

  • 网络连通性:访问特定技术文档、官方论坛、Google 等受限资源
  • 开发效率加速
    • 依赖拉取:加速 npm install, pip install, docker pull 等操作
    • 代码同步:提高 git clone/push 到 GitHub/GitLab 的速度与稳定性
  • 网络调试:API 调试

2. 网络代理协议

  • HTTP/HTTPS 代理:最通用,适用于大多数下载工具和包管理器。
  • SOCKS5 代理:功能更强,支持 UDP,更底层的代理,但部分软件不支持,需转换。

2.1. 代理变量说明

变量名 作用范围 (协议) 典型值示例 核心区别与注意点
http_proxy 仅处理 HTTP 请求 http://123.1.2.3:6789
socks5://456.4.5.6:6789
只管明文流量
访问 http网站它生效。访问 https 网站时它会被忽略。
https_proxy 仅处理 HTTPS 请求 同上 管加密流量
这是最常用的,因为现在绝大多数网站都是 HTTPS。
注意:它的值通常也写 http://(见下文详解)。
ftp_proxy 仅处理 FTP 文件传输 同上 历史遗留
用于 ftp 协议。现在很少用了
all_proxy 通用名单
(HTTP, HTTPS, FTP 等)
同上 懒人专用
如果上面的变量没设置,部分工具(如 curl)会尝试读取这个变量。通常建议填 SOCKS 协议。
no_proxy 豁免名单
(不走代理的地址)
localhost,123.1.2.3,::1 优先级最高。在这里面的地址,系统会强制直连,忽略上面所有的代理设置。

2.2. 代理变量优先级

总的优先级原则可以概括为:豁免名单 > 专用变量 > 通用名单

优先级 变量类型 变量名 行为逻辑
1st 豁免名单 no_proxy 一票否决权。只要目标地址在这里面,系统直接忽略下面所有代理设置,强制直连。
2nd 专用变量 http_proxy, https_proxy, ftp_proxy 专款专用。如果是 HTTPS 请求,优先看 https_proxy。如果有值,就用它,不会再去退而求其次找 all_proxy。
3rd 通用名单 all_proxy 捡漏王。只有当上面的“专用变量”没设置(为空)时,程序才会尝试使用 all_proxy。

2.3. 代理变量应用示例

假设有以下混乱的配置,看看实际如何工作:

export no_proxy="localhost,127.0.0.1,baidu.com"
export http_proxy="http://1.1.1.1:80"        # 代理A
export https_proxy="http://2.2.2.2:80"       # 代理B
export all_proxy="socks5://3.3.3.3:80"       # 代理C

场景1:访问百度 (http://baidu.com)

  • 判断:命中 no_proxy。
  • 结果直连 (不走任何代理)。
  • 原因:no_proxy 优先级最高。

场景 2:访问 Google HTTPS (https://google.com)

  • 判断:1. 不在 no_proxy;2. 协议是 HTTPS,检查 https_proxy ➔ 发现是 代理B
  • 结果:走 代理B
  • 原因:专用变量优先级高于 all_proxy。代理C 被忽略。

场景 3:访问 Google HTTP (http://google.com)

  • 判断:1. 不在 no_proxy;2. 协议是 HTTP,检查 http_proxy ➔ 发现是 代理A
  • 结果:走 代理A

场景 4:访问 FTP (ftp://ftp.gnu.org)

  • 判断:1. 不在 no_proxy;2. 协议是 FTP,检查 ftp_proxy ➔ 没设置;3. 退回检查 all_proxy ➔ 发现是 代理C
  • 结果:走 代理C

总结流程图如下:

发起 curl 链接请求
在 no_proxy 中有值?
直连
结束
https_proxy / http_proxy / ftp_proxy 有值?
使用 https_proxy / http_proxy / ftp_proxy
结束
all_proxy 有值?
使用 all_proxy
结束
直连
结束

3. 如何配置网络代理

  • 假设代理地址
  • HTTP/HTTPS 代理:http://123.1.2.3:6789
  • SOCKS5 代理:socks5://456.4.5.6:6789

3.1. 核心基础:环境变量配置

这是最通用、最基础的配置方式,所有遵循 Linux 标准的应用都会读取这些变量。更多详细内容参考:Linux环境变量与管理

  • 环境变量大小写

在 Linux 中,环境变量通常是区分大小写的

  • 标准:大多数工具(curl, wget, apt)识别 小写 (http_proxy)
  • 例外:有些编程语言(Python requests, Go)或老旧工具可能也会检查 大写 (HTTP_PROXY)
  • 最佳实践同时设置大小写,确保万无一失

3.1.1. 系统服务(永久配置)

  • 系统级配置
  1. 修改 /etc/profile 或 /etc/environment。
sudo nano /etc/environment
  1. 写入下面内容,根据自己实际的 代理地址端口号 以及 内网地址 进行替换!!!
# 设置代理地址(注意:https_proxy 的值也是 http 开头)
export http_proxy="http://123.1.2.3:6789"
export https_proxy="http://123.1.2.3:6789"
export all_proxy="socks5://456.4.5.6:6789"
# 设置大写版本(兼容性保障)
export HTTP_PROXY="http://123.1.2.3:6789"
export HTTPS_PROXY="http://123.1.2.3:6789"
export ALL_PROXY="socks5://456.4.5.6:6789"
# 设置不走代理的地址(防止内网不通、死循环)
export no_proxy="localhost,123.1.2.3,::1,192.168.0.0/16"
export NO_PROXY="localhost,123.1.2.3,::1,192.168.0.0/16"
  1. 然后重启系统或者执行下面命令。
    a. 系统级配置适用于所有用户和服务,影响全系统所有服务(包括 apt)
source /etc/environment
  1. 验证代理配置
env | grep -i proxy

3.1.2. 全局环境变量(永久配置)

  • 用户级配置:
  1. 编辑 ~/.bashrc 或 ~/.zshrc
sudo nano ~/.bashrc
  • 写入下面内容,根据自己实际的 代理地址端口号 以及 内网地址 进行替换!!!
# 设置代理地址(注意:https_proxy 的值也是 http 开头)
export http_proxy="http://123.1.2.3:6789"
export https_proxy="http://123.1.2.3:6789"
export all_proxy="socks5://456.4.5.6:6789"
# 设置大写版本(兼容性保障)
export HTTP_PROXY="http://123.1.2.3:6789"
export HTTPS_PROXY="http://123.1.2.3:6789"
export ALL_PROXY="socks5://456.4.5.6:6789"
# 设置不走代理的地址(防止内网不通、死循环)
export no_proxy="localhost,123.1.2.3,::1,192.168.0.0/16"
export NO_PROXY="localhost,123.1.2.3,::1,192.168.0.0/16"
  1. 或者直接命令行输入:
    a. 根据自己实际的 代理地址端口号 以及 内网地址 进行替换!!!
# 设置代理地址(注意:https_proxy 的值也是 http 开头)
echo 'export http_proxy="http://123.1.2.3:6789"' >> ~/.bashrc
echo 'export https_proxy="http://123.1.2.3:6789"' >> ~/.bashrc
echo 'export all_proxy="socks5://456.4.5.6:6789"' >> ~/.bashrc
# 设置大写版本(兼容性保障)
echo 'export HTTP_PROXY="http://123.1.2.3:6789"' >> ~/.bashrc
echo 'export HTTPS_PROXY="http://123.1.2.3:6789"' >> ~/.bashrc
echo 'export ALL_PROXY="socks5://456.4.5.6:6789"' >> ~/.bashrc
# 设置不走代理的地址(防止内网不通、死循环)
echo 'export no_proxy="localhost,123.1.2.3,::1,192.168.0.0/16"' >> ~/.bashrc
echo 'export NO_PROXY="localhost,123.1.2.3,::1,192.168.0.0/16"' >> ~/.bashrc
  1. 生效:
source ~/.bashrc
  1. 验证代理配置
env | grep -i proxy

在这里插入图片描述

3.1.3. 临时环境变量 - 推荐

  • 注意:关闭终端或注销后,临时代理会失效。
  1. 临时代理可根据需求配置代理(http_proxy, https_proxy, all_proxy, no_proxy)
  2. 以及大小写(比如:http_proxy, HTTP_PROXY)
  3. 直接在命令行输入,根据自己实际的 代理地址端口号 以及 内网地址 进行替换!!!
export https_proxy="http://123.123.123.123:6789"
export http_proxy="http://123.123.123.123:6789"
export all_proxy="socks5://456.4.5.6:6789"
export no_proxy="localhost,123.1.2.3,::1,192.168.0.0/16"
  1. 验证代理配置
env | grep -i proxy

在这里插入图片描述

3.1.4. 如何清理代理配置

3.1.4.1. 删除配置文件
  • 删除/etc/environment 文件的代理配置
  • 删除~/.bashrc 文件的代理配置
3.1.4.2. 清除当前终端

临时清除当前会话(立即生效):

unset http_proxy https_proxy all_proxy no_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY

验证代理配置:

env | grep -i proxy

3.2. 系统包管理器代理配置

系统更新和软件安装通常需要独立的代理配置,有时不完全遵循环境变量。

3.2.1. Debian/Ubuntu 系列 (APT)

不同于 curl 或 wget 的通用性,APT(apt-get, apt)对代理变量的读取机制更为严苛且独立,不完全遵循常规的环境变量逻辑。

变量名 APT 是否支持? 大小写敏感性 备注
http_proxy 支持 推荐小写 APT 主要识别小写。
https_proxy 支持 推荐小写 用于 HTTPS 源。
ftp_proxy 支持 推荐小写 用于 FTP 源(现在很少见)。
all_proxy 不支持 - APT 完全无视这个变量。必须分开配置 http/https。
no_proxy ⚠️ 有限支持 推荐小写 旧版 APT 对此支持很差,新版(Ubuntu 20.04+)通常能识别,但逻辑较弱。
  1. 大小写:APT 主要查找的是小写的 http_proxy。请务必使用小写
  2. all_proxy 无效:这是最容易踩的坑。如果只配了 all_proxy,curl 能通,但 apt 还是连不上。
  3. 如何在apt配置文件里实现 no_proxy?
    a. apt.conf 里没有 Acquire::No::Proxy 这种东西。如果你想让某个源直连,必须用“作用域”写法:
# 全局走代理
Acquire::http::Proxy "http://127.0.0.1:7897";

# 特例:针对 internal.com 直连 (DIRECT)
Acquire::http::Proxy::internal.com "DIRECT";
3.2.1.1. APT 单独配置代理(永久配置)
  • 全局代理
  1. 创建 apt 代理配置
sudo nano /etc/apt/apt.conf.d/80proxy
  • 写入下面内容,根据自己实际的 代理地址端口号 以及 内网地址 进行替换!!!
Acquire::http::Proxy "http://123.123.123.123:6789";
Acquire::https::Proxy "http://123.123.123.123:6789";
  • 或者一句命令(需要 sudo)
echo 'Acquire::http::Proxy "http://123.123.123.123:6789"; Acquire::https::Proxy "http://123.123.123.123:6789";' | sudo tee /etc/apt/apt.conf.d/80proxy.conf
  • 解析:APT 请求永远尝试走123.123.123.123:6789
sudo apt update
  • 代理网络正常时 → 6789 端口正常 → APT 可以访问 → 例如 apt update 成功
  • 代理网络异常时 → 6789 无人监听 → APT 会连接失败 → 例如 apt update 会报错
Could not connect to xxxxxx......
  • 部分代理
  1. 创建 apt 代理配置
sudo nano /etc/apt/apt.conf.d/80-google-proxy
  • 写入下面内容,例如只代理 Google Artifact Registry:
  • 根据自己实际的 代理地址端口号 以及 内网地址 进行替换!!!
Acquire::https::us-central1-apt.pkg.dev::Proxy "http://123.123.123.123:6789";
  • 解析:不开代理时,只有这个源会失败;Ubuntu 官方仓库正常工作
    • 访问 us-central1-apt.pkg.dev → 走代理
    • 访问其他源(ubuntu 缓存源)→ 不走代理
  • 环境变量传递sudo -E
  • sudo 执行时环境变量丢失:虽然在当前用户配置好 http_proxy 等环境变量,但是当运行 sudo apt update 时,系统为了安全,会重置环境变量,导致 apt 在以 root 权限运行时并没有使用代理
    • 核心问题在于:sudo 命令默认不会继承当前用户的环境变量
      -需要使用 -E 参数告诉 sudo 保留当前用户的环境变量,APT 会读取当前 Shell 的环境变量。
sudo -E apt update

解释:-E (preserve environment) 会把在当前终端的 proxy 等环境变量传给 root 用户,这样 apt 就能走代理了。

  • 用环境变量控制apt代理(临时)
  • 不改 apt 配置,只在需要时加代理(方便调试)
sudo https_proxy=http://127.0.0.1:7897 http_proxy=http://127.0.0.1:7897 apt update
  • 总结一下:
配置方式 代理正常 代理失效 APT 是否受影响
全局代理(最常见) 正常 ❌ 报错
部分代理 正常 只该源失败 影响最小
环境变量传递sudo -E 正常 ❌ 报错
用环境变量临时代理 你想代理时才代理 不代理 不影响

3.3. 开发语言与工具代理配置

待补充…

3.4. 容器化与虚拟化代理

待补充…

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐