在 Linux 上配置代理,需要为用户会话设置环境变量、为包管理配置 APT,并为 Systemd 服务指定代理设置,以确保所有系统组件都能通过代理访问外部网络。
许多 Linux 环境运行在企业防火墙之后,或出于安全、日志记录和访问控制的需要,必须让流量经由代理服务器转发。正确的代理配置对系统功能至关重要,涉及软件更新、用户应用的互联网访问以及后台服务的通信。本文详细说明在常见 Linux 组件中配置代理的方法。
环境变量
Shell 环境以及继承该环境的应用程序,通常依赖标准环境变量来完成代理配置。这些变量定义了 HTTP、HTTPS 和 FTP 流量的代理服务器地址,以及需要直连的例外项。
标准代理环境变量
HTTP_PROXY:HTTP 连接使用的代理。HTTPS_PROXY:HTTPS 连接使用的代理。FTP_PROXY:FTP 连接使用的代理。NO_PROXY:以逗号分隔的主机名、IP 地址或 CIDR 段列表,这些目标将绕过代理。示例:localhost,127.0.0.1,*.local,192.168.0.0/24。
在某些场景下这些变量区分大小写(例如 wget 常用小写的 http_proxy,而其他程序偏好大写的 HTTP_PROXY)。通行做法是同时设置大写和小写版本,以获得更广泛的兼容性。
临时的 Shell 会话配置
为当前 Shell 会话及由其启动的所有进程设置代理变量:
export HTTP_PROXY="http://proxy.example.com:8080"
export HTTPS_PROXY="http://proxy.example.com:8080"
export FTP_PROXY="http://proxy.example.com:8080"
export NO_PROXY="localhost,127.0.0.1,.example.com"
# 为兼容性起见,同时设置小写版本
export http_proxy="http://proxy.example.com:8080"
export https_proxy="http://proxy.example.com:8080"
export ftp_proxy="http://proxy.example.com:8080"
export no_proxy="localhost,127.0.0.1,.example.com"
请把 proxy.example.com:8080 替换为您的代理服务器地址和端口。如果需要认证,请附上凭据:http://user:[email protected]:8080。
针对用户的持久化配置
若希望代理设置在用户登录会话之间持久生效,请把 export 命令写入该用户的 Shell 配置文件。
- Bash:
~/.bashrc或~/.profile - Zsh:
~/.zshrc
~/.bashrc 示例:
# 代理设置
export HTTP_PROXY="http://proxy.example.com:8080"
export HTTPS_PROXY="http://proxy.example.com:8080"
export FTP_PROXY="http://proxy.example.com:8080"
export NO_PROXY="localhost,127.0.0.1,.example.com"
export http_proxy="http://proxy.example.com:8080"
export https_proxy="http://proxy.example.com:8080"
export ftp_proxy="http://proxy.example.com:8080"
export no_proxy="localhost,127.0.0.1,.example.com"
修改后请重新加载该文件,或退出并重新登录:source ~/.bashrc。
系统级持久化配置
若要设置影响所有用户和部分系统进程(但不直接覆盖所有 Systemd 服务)的系统级代理,请使用 /etc/environment 或 /etc/profile.d/ 中的文件。
/etc/environment
该文件在登录时由 PAM(Pluggable Authentication Modules)读取,作用于登录 Shell 启动的所有服务和应用。它只支持 KEY="value" 语法,不支持 export。
HTTP_PROXY="http://proxy.example.com:8080"
HTTPS_PROXY="http://proxy.example.com:8080"
FTP_PROXY="http://proxy.example.com:8080"
NO_PROXY="localhost,127.0.0.1,.example.com"
http_proxy="http://proxy.example.com:8080"
https_proxy="http://proxy.example.com:8080"
ftp_proxy="http://proxy.example.com:8080"
no_proxy="localhost,127.0.0.1,.example.com"
对 /etc/environment 的更改通常需要重启系统或重新登录,新会话才会生效。
/etc/profile.d/
放在 /etc/profile.d/ 中的脚本会被登录 Shell 加载。适合用来设置需要逻辑判断或 export 语句的环境变量。新建一个文件,例如 /etc/profile.d/proxy.sh:
#!/bin/bash
export HTTP_PROXY="http://proxy.example.com:8080"
export HTTPS_PROXY="http://proxy.example.com:8080"
export FTP_PROXY="http://proxy.example.com:8080"
export NO_PROXY="localhost,127.0.0.1,.example.com"
export http_proxy="http://proxy.example.com:8080"
export https_proxy="http://proxy.example.com:8080"
export ftp_proxy="http://proxy.example.com:8080"
export no_proxy="localhost,127.0.0.1,.example.com"
请确保该脚本可执行:sudo chmod +x /etc/profile.d/proxy.sh。
sudo 与代理变量
使用 sudo 时,出于安全考虑环境变量通常会被重置。要在 sudo 执行的命令中保留代理设置:
- 使用
sudo -E:保留当前的环境变量。
bash sudo -E apt update - 配置
sudoers:用sudo visudo编辑/etc/sudoers,添加或修改env_keep。
Defaults env_keep += "HTTP_PROXY HTTPS_PROXY FTP_PROXY NO_PROXY http_proxy https_proxy ftp_proxy no_proxy"
对于持久化的系统配置,这种方式通常比sudo -E更安全。
APT(Advanced Package Tool)
APT 是 Debian 系发行版(例如 Ubuntu)使用的包管理器,它需要独立于 Shell 环境变量的代理配置。
APT 代理配置文件
APT 的代理设置定义在 /etc/apt/apt.conf.d/ 目录下的配置文件中。新建一个文件,例如 /etc/apt/apt.conf.d/01proxy,内容如下:
Acquire::http::Proxy "http://proxy.example.com:8080/";
Acquire::https::Proxy "http://proxy.example.com:8080/";
# Acquire::ftp::Proxy "ftp://proxy.example.com:8080/"; # 如有需要请取消注释
请把 proxy.example.com:8080 替换为您的代理服务器地址和端口。
如果代理需要认证:
Acquire::http::Proxy "http://user:[email protected]:8080/";
Acquire::https::Proxy "http://user:[email protected]:8080/";
对于需要绕过 APT 代理的主机,请使用 Acquire::NoProxy:
Acquire::NoProxy "localhost,127.0.0.1,archive.ubuntu.com";
它不如全局 NO_PROXY 常用,但可以专门作用于 APT。
创建或修改该文件后,APT 会在后续操作(例如 apt update、apt install)中自动使用这些设置,无需重启服务。
Systemd 服务
Systemd 负责管理系统服务和应用。由 Systemd 启动的服务不会自动继承 Shell 配置文件或 /etc/environment 中设置的代理环境变量。每个需要代理访问的 Systemd 单元都必须显式配置。
为特定 Systemd 服务配置代理
要为单个 Systemd 服务配置代理设置,请创建 override 文件。这是推荐做法,可避免直接修改原始单元文件——那些文件在软件包更新时可能被覆盖。
-
创建 override 目录:
bash sudo systemctl edit <service_name>
该命令会打开/etc/systemd/system/<service_name>.service.d/override.conf的编辑器。 -
添加代理环境变量:
在编辑器中添加[Service]小节和Environment指令:ini [Service] Environment="HTTP_PROXY=http://proxy.example.com:8080" \ "HTTPS_PROXY=http://proxy.example.com:8080" \ "NO_PROXY=localhost,127.0.0.1" Environment="http_proxy=http://proxy.example.com:8080" \ "https_proxy=http://proxy.example.com:8080" \ "no_proxy=localhost,127.0.0.1"
每条Environment指令可以在引号内用空格分隔多个变量,也可以使用多行Environment。\用于 override 文件中的续行。 -
保存并退出: 保存文件后,Systemd 会自动重新加载守护进程并提示重启该服务,请确认重启。若未出现提示,请手动重新加载并重启:
bash sudo systemctl daemon-reload sudo systemctl restart <service_name>
全局 Systemd 代理配置
对于没有单独代理设置的服务,或需要一个系统级默认值时,可在 Systemd 的全局环境中配置代理。这会影响所有未显式覆盖这些变量的服务。
-
创建 drop-in 配置目录:
bash sudo mkdir -p /etc/systemd/system.conf.d/ -
创建代理配置文件:
bash sudo nano /etc/systemd/system.conf.d/proxy.conf -
添加代理环境变量:
ini [Manager] DefaultEnvironment="HTTP_PROXY=http://proxy.example.com:8080" DefaultEnvironment="HTTPS_PROXY=http://proxy.example.com:8080" DefaultEnvironment="NO_PROXY=localhost,127.0.0.1" DefaultEnvironment="http_proxy=http://proxy.example.com:8080" DefaultEnvironment="https_proxy=http://proxy.example.com:8080" DefaultEnvironment="no_proxy=localhost,127.0.0.1" -
重新加载 Systemd 守护进程并重启服务:
bash sudo systemctl daemon-reload sudo systemctl restart --all # 请谨慎使用,会重启所有用户服务和系统服务
要确保所有服务都应用这些全局更改,完整重启系统往往是最稳妥的方式。
验证
配置好代理后,请验证其是否生效:
- 环境变量:
bash env | grep -i proxy - APT:
bash apt config dump | grep -i proxy
尝试执行更新:sudo apt update。 - 常规网络访问:
bash curl -v http://ifconfig.me
如果流量经由代理转发,输出应显示代理服务器的 IP 地址;如果NO_PROXY生效,则显示您的外网 IP。 - Systemd 服务: 检查服务状态和日志,排查连接问题。
bash sudo systemctl status <service_name> sudo journalctl -u <service_name>
您也可以检查正在运行的服务进程的环境。先找到该服务的 PID,然后执行:
bash sudo cat /proc/<PID>/environ | tr '\0' '\n' | grep -i proxy
各种代理配置方法对比
| 方法 | 作用范围 | 是否持久 | 受影响的组件 | 配置示例 |
|---|---|---|---|---|
| Shell 环境(临时) | 当前 Shell 会话 | 否 | 从当前 Shell 启动的命令 | export HTTP_PROXY="..." |
用户配置文件(~/.bashrc) |
该用户的登录会话 | 是 | 用户应用、Shell 命令 | 在 ~/.bashrc 中添加 export 行 |
系统级(/etc/environment) |
所有登录会话及部分系统进程 | 是 | 登录 Shell、部分应用(非 Systemd) | 在 /etc/environment 中写 HTTP_PROXY="..." |
系统级(/etc/profile.d/) |
所有登录 Shell | 是 | 登录 Shell 及由其启动的应用 | 在 /etc/profile.d/ 放含 export 行的脚本 |
APT(/etc/apt/apt.conf.d/) |
仅 APT 包管理器 | 是 | apt、apt-get、aptitude |
在 01proxy 中写 Acquire::http::Proxy "..."; |
Systemd 服务 override(override.conf) |
指定的 Systemd 单元 | 是 | 单个 Systemd 服务 | 在 /etc/systemd/system/<service>.service.d/override.conf 中写 Environment="..." |
全局 Systemd(system.conf.d/) |
所有 Systemd 服务(默认值) | 是 | 未被覆盖的所有 Systemd 服务 | 在 /etc/systemd/system.conf.d/proxy.conf 中写 DefaultEnvironment="..." |
