环境变量由程序读取,不会自动接管整个终端
环境变量把代理地址传给支持它的程序,不会把所有网络请求强制转进客户端。不同工具支持的名称和优先级可能不同;这里先以 curl 为例,其他程序还要看自己的代理设置。
| curl 使用的变量 | 用途 | 填写示例 |
|---|---|---|
| http_proxy | HTTP 目标的代理入口 | http://127.0.0.1:2080 |
| https_proxy | HTTPS 目标的代理入口 | http://127.0.0.1:2080 |
| ALL_PROXY | 没有协议专用变量时的候选入口 | socks5h://127.0.0.1:2080 |
| no_proxy / NO_PROXY | 哪些目标不使用显式代理 | localhost,127.0.0.1,::1 |
curl 的协议专用变量优先于 ALL_PROXY;它只接受小写的 http_proxy,这是与 CGI 环境有关的安全设计,不能把大写 HTTP_PROXY 当成通用替代。其他工具是否相同,需要单独核对。
Bash 和 zsh:先只改当前会话
export http_proxy="http://127.0.0.1:2080"
export https_proxy="http://127.0.0.1:2080"
export no_proxy="localhost,127.0.0.1,::1"
curl --verbose --head --connect-timeout 5 --max-time 20 https://example.com把 2080 换成客户端实际的 HTTP 或混合端口。export 影响当前 shell 及之后由它启动的子进程,不会改动已经运行的程序,也不会自动写入启动文件。
看详细输出是否先连接本机入口,并对照客户端日志。如果已有 ALL_PROXY 或其他协议变量,先记录原值,避免把旧设置误当成这次操作的结果。测试结束后可移除本次新增的变量:
unset http_proxy https_proxy no_proxy原来已有这些变量时,恢复原值更合适。确认工作流需要长期代理后,再编辑自己实际使用的 shell 启动文件;不要同时在多个文件里重复设置。
PowerShell:设置当前进程的环境变量
$env:http_proxy = "http://127.0.0.1:2080"
$env:https_proxy = "http://127.0.0.1:2080"
$env:no_proxy = "localhost,127.0.0.1,::1"
curl.exe --verbose --head --connect-timeout 5 --max-time 20 https://example.com这里使用 curl.exe 调用 curl 本身。$env: 修改当前 PowerShell 进程的环境,并传给之后启动的子进程;它不是给所有已打开的程序统一设置代理。
Remove-Item Env:http_proxy, Env:https_proxy, Env:no_proxy -ErrorAction SilentlyContinue移除变量只适用于本次临时新增的值。若原来就有设置,应恢复之前记录的内容。关闭当前窗口也会结束这一会话中的临时修改。
NO_PROXY 排除的是目标,不是代理服务器
访问本机服务、内网接口或开发环境时,通常希望请求绕过显式代理。NO_PROXY 按目标主机匹配,不是把代理服务器地址写进去就能排除所有流量。
| curl 中的写法 | 含义或限制 |
|---|---|
| localhost,127.0.0.1,::1 | 排除这些本机目标 |
| .example.com | 按 curl 的域名匹配规则排除该域及其子域 |
| * | 全部目标都不使用显式代理 |
| 192.168.0.0/16 | curl 7.86.0 起支持 CIDR;其他工具未必支持 |
排除变量的大小写、域名后缀和 CIDR 支持并非所有软件一致。开发工具仍然走错路径时,用一个明确的目标测试,核对该工具的文档,不要只看变量名字是否存在。
为什么新终端能用,编辑器或容器不行
- 编辑器从桌面启动时,通常不会继承另一个终端后加的变量。检查编辑器自身及其集成终端的环境。
- 后台服务启动时就取得了环境;修改当前终端,不会更新已经运行的服务进程。
- 容器里的 127.0.0.1 指向容器自身。要连接宿主机代理,应使用该容器环境支持的宿主机地址,并检查监听范围。
- 提权工具可能过滤环境变量。不要为图方便盲目保留所有变量;按需要给具体程序设置代理。
如果程序不支持环境变量,检查它的代理参数或配置文件。需要接管更多应用时可研究 TUN 的路由范围,但也要验证例外、DNS 和实际出站。
用一条请求验证,再决定是否保存
选一个不在 NO_PROXY 中的目标,用 curl 的详细输出确认本机入口,然后在客户端查到对应连接、命中规则和最终出站。这三处能对上,再把设置用于实际下载工具。
关闭代理客户端后,保留的环境变量仍会指向原端口。下次出现“浏览器正常、终端连接被拒绝”,先看变量是否还在;移除它们只改变支持变量的程序,不会关闭 TUN 或系统代理。
常见问题
https_proxy 的值必须以 https:// 开头吗?
不需要。变量对应 HTTPS 目标;它的值描述代理入口。普通 HTTP 入口可以通过 CONNECT 转发 HTTPS,因此常见值仍是 http://127.0.0.1:端口。
只设置 ALL_PROXY 就够了吗?
对支持该变量的程序可能够用,但协议专用变量通常会优先,其他工具也可能不读取 ALL_PROXY。先查具体程序支持哪些设置,再验证请求。
参考资料
原理和协议定义可查以下标准与官方文档。文中的流程图由 AFQKit 绘制。