Linux 网络代理指南:解决下载慢、访问受限的开发痛点
解释:-E (preserve environment) 会把在当前终端的 proxy 等环境变量传给 root 用户,这样 apt 就能走代理了。https_proxy / http_proxy / ftp_proxy 有值?场景 3:访问 Google HTTP (http://google.com)使用 https_proxy / http_proxy / ftp_proxy。场景 4:访问
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。
总结流程图如下:
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. 系统服务(永久配置)
- 系统级配置
- 修改 /etc/profile 或 /etc/environment。
sudo nano /etc/environment
- 写入下面内容,根据自己实际的 代理地址 和 端口号 以及 内网地址 进行替换!!!
# 设置代理地址(注意: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"
- 然后重启系统或者执行下面命令。
a. 系统级配置适用于所有用户和服务,影响全系统所有服务(包括 apt)
source /etc/environment
- 验证代理配置
env | grep -i proxy
3.1.2. 全局环境变量(永久配置)
- 用户级配置:
- 编辑 ~/.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"
- 或者直接命令行输入:
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
- 生效:
source ~/.bashrc
- 验证代理配置
env | grep -i proxy

3.1.3. 临时环境变量 - 推荐
- 注意:关闭终端或注销后,临时代理会失效。
- 临时代理可根据需求配置代理(http_proxy, https_proxy, all_proxy, no_proxy)
- 以及大小写(比如:http_proxy, HTTP_PROXY)
- 直接在命令行输入,根据自己实际的 代理地址 和 端口号 以及 内网地址 进行替换!!!
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"
- 验证代理配置
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+)通常能识别,但逻辑较弱。 |
- 大小写:APT 主要查找的是小写的 http_proxy。请务必使用小写。
- all_proxy 无效:这是最容易踩的坑。如果只配了 all_proxy,curl 能通,但 apt 还是连不上。
- 如何在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 单独配置代理(永久配置)
- 全局代理
- 创建 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......
- 部分代理
- 创建 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. 容器化与虚拟化代理
待补充…
更多推荐

所有评论(0)