代理环境联网排查
服务器只允许通过代理出网时,联网异常往往不是网络不通,而是代理没走到、走错或代理要求认证。排查顺序是:先看当前进程拿到哪些代理变量,再用 curl 显式走或绕过代理做对照,最后确认内网地址是否被正确排除。整个过程不需要改任何系统配置就能定位方向。
基本信息
| 典型表现 | curl 超时、连接被拒、返回 407 或代理错误页 |
|---|---|
| 排查组合 | env 检查环境变量 + curl -v 看 CONNECT 行 + 显式指定代理对照 |
| 适用范围 | Linux / macOS 服务器,curl、wget、包管理器、容器运行时 |
| 核心区分 | 先判断是「没走代理」还是「代理本身不通」 |
常见根因
- shell 里根本没有设置代理变量,命令直连外网被防火墙丢弃
- 内网地址没有排除,请求被错误地送到代理,代理又访问不到内网
- 代理需要认证但凭据没带,服务端返回 407
- 包管理器与容器运行时各自有独立代理配置,不读 shell 环境变量
- 只有小写变量被设置,而某些工具只认大写形式
- HTTPS 场景代理必须支持 CONNECT 隧道,遇到不支持的代理会直接失败
现状检查
现状检查
env | grep -i proxy # 当前进程可见的代理变量
curl -v -sS https://example.com -o /dev/null 2>&1 | grep -E 'Connected|CONNECT|proxy' | head # 看是否走代理
curl -sS -o /dev/null -w '%{http_code}\n' https://example.com # 只看状态码
wget -S -O /dev/null https://example.com 2>&1 | head # wget 走的是自己的配置显式走与绕过
显式走与绕过
curl -sS -x http://proxy.corp:3128 -o /dev/null -w '%{http_code}\n' https://example.com # 显式走代理
curl -sS --noproxy '*' -o /dev/null -w '%{http_code}\n' http://10.0.0.9/health # 强制直连内网
export https_proxy=http://proxy.corp:3128; export http_proxy=http://proxy.corp:3128 # 大小写都设
export no_proxy=internal.example.com,10.0.0.9 # 内网不走代理(逐个主机名最稳)配置项对照
| 配置项 | 影响范围 | 注意 |
|---|---|---|
| http_proxy / https_proxy | shell 环境变量 | 大小写形式在不同工具中语义有差异 |
| no_proxy | 排除清单 | 各工具匹配规则不同,网段写法未必生效 |
| curl -x / --noproxy | 单次命令 | 临时对照实验的首选 |
| apt 的 apt.conf.d | Debian 系包管理 | 配置在 /etc/apt/apt.conf.d/ 下,不读环境变量 |
| dnf 的 dnf.conf | RHEL 系包管理 | 写在 /etc/dnf/dnf.conf 的 proxy 项 |
| docker 的 proxy | 容器运行时 | 需要单独的代理配置文件与守护进程重启 |
看到 407 基本都是代理要求认证;看到 CONNECT 建立失败或不支持 CONNECT,说明代理不允许 HTTPS 隧道,要联系代理管理员而不是在本机继续改配置。