相信每一个刚接触 Ubuntu 的开发者,在配置开发环境时都经历过这样的绝望时刻:
明明已经在终端里敲了 export http_proxy=...,用 curl 测试也通了,结果一敲 sudo apt update,依然是满屏的 Connection timed out。
别怀疑自己,你不是一个人!
配置 Ubuntu 终端代理看似简单,但由于 Linux 严格的权限和环境变量隔离机制,里面其实暗藏玄机。今天,我们就把 Ubuntu 下的代理配置扒得干干净净,从当前终端到 apt 专用,再到 sudo 提权避坑,一篇文章给你安排得明明白白。
🟢 第一阶段:常规终端代理配置
大部分时候,我们只需要让当前的命令行(比如 wget、curl 或运行的某个脚本)走代理。根据你的需求,这里分为“临时生效”和“永久生效”两种。
1. 临时生效(关掉终端就消失)
如果你只是临时下载个东西,不想污染系统环境,直接在终端里执行 export 即可。
# HTTP/HTTPS 代理 (请将 127.0.0.1:7890 替换为你实际的代理地址)
export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"
# 如果你使用的是 SOCKS5 代理
export http_proxy="socks5://127.0.0.1:7891"
export https_proxy="socks5://127.0.0.1:7891"
export all_proxy="socks5://127.0.0.1:7891"
# 别忘了配置国内/局域网地址不走代理
export no_proxy="localhost, 127.0.0.1, ::1, 192.168.*, 10.*"
2. 长效生效与高阶技巧(推荐配合 Alias 使用)
每次打开终端都要敲一长串代码太折磨人了。我们可以把它写进用户的 shell 配置文件中(~/.bashrc 或 ~/.zshrc)。
💡 高阶玩法: 强烈建议不要直接写死 export,而是写成快捷命令(Alias),这样你可以随时在终端里“一键开启”和“一键关闭”代理。
打开你的配置文件:
nano ~/.bashrc
在最末尾加入这两行:
# 开启代理的快捷命令
alias proxyon="export http_proxy='http://127.0.0.1:7890'; export https_proxy='http://127.0.0.1:7890'; export all_proxy='socks5://127.0.0.1:7891'; echo '🚀 Proxy Status: ON'"
# 关闭代理的快捷命令
alias proxyoff="unset http_proxy https_proxy all_proxy; echo '🛑 Proxy Status: OFF'"
保存退出后,执行 source ~/.bashrc 刷新。
以后想用代理了,只要在终端敲 proxyon,不想用了敲 proxyoff,优雅且高效!
🔴 第二阶段:为什么 sudo 和 apt 连不上网?(踩坑重灾区)
当你执行完上面的操作,兴奋地敲下 sudo apt update 时,你会发现网络依然是不通的。
为什么?
因为 Linux 的安全机制。为了防止普通用户通过恶意修改环境变量来影响系统级的 root 进程,当你在命令前加上 sudo 提权时,系统会默认清除掉你作为普通用户设置的所有环境变量(包括你的代理配置)。
因此,你的 http_proxy 根本传不到 root 环境里!要解决这个问题,我们有上、中、下三种策:
🛠️ 解决方案 1:使用 sudo -E(最快捷,下策)
-E 参数(Preserve Environment)的作用是告诉 sudo:“不要重置环境变量,保留我现在的配置”。
只要你当前启用了代理,加上 -E 就能把代理带给 root:
sudo -E apt update
sudo -E apt install wget
缺点:每次都要多敲一个 -E,容易忘。
🛠️ 解决方案 2:直接配置 sudoers 文件(最一劳永逸,中策)
如果你希望以后所有的 sudo 命令都能自动继承代理,可以修改 sudoers 配置文件。
⚠️ 注意:修改此文件极其敏感,请务必使用 visudo 命令,它会在保存时检查语法错误,防止你把系统改崩。
sudo visudo
找到 Defaults env_reset 这一行,在它的正下方加上一行,把代理变量加入白名单:
Defaults env_keep += "http_proxy https_proxy ftp_proxy all_proxy no_proxy"
保存退出。以后你只要启用了普通用户的代理,sudo 就会自动共享网络。
🛠️ 解决方案 3:为 APT 专门写死代理(最推荐,上策)
如果是为了下载系统软件,最稳妥的做法是让 apt 工具独立走代理,不依赖环境变量。
创建一个专门针对 apt 的代理配置文件:
sudo nano /etc/apt/apt.conf.d/proxy.conf
写入以下两行(注意结尾的分号一定不能漏!):
Acquire::http::Proxy "http://127.0.0.1:7890/";
Acquire::https::Proxy "http://127.0.0.1:7890/";
以后无论你的终端处于什么状态,sudo apt update 都会永远老老实实地走代理。
🟡 第三阶段:验证与测试
配置了这么多,怎么确认代理真的生效了?不要用 ping(因为 ping 走的是 ICMP 协议,大部分代理工具只代理 TCP/UDP)。
用 curl 查看网页响应头才是唯一真理:
curl -I https://www.google.com
如果你看到类似 HTTP/1.1 200 OK 或者 HTTP/2 200 的返回信息,恭喜你,你的 Ubuntu 已经成功打通了任督二脉!
结语
Linux 的网络配置有着极其严谨的逻辑。理解了 sudo 剥离环境变量的原理,以后再遇到类似的环境配置问题,你就懂得如何对症下药了。
如果这篇文章对你有帮助,欢迎点赞收藏,告别“代理玄学”!
版权属于:soarli
本文链接:https://blog.soarli.top/archives/898.html
转载时须注明出处及本声明。