代理设置是 cURL 在企业环境和网络调试中的重要功能。正确配置代理能突破网络限制、保护隐私和进行流量分析。
基本代理设置
bash# HTTP 代理 curl -x http://proxy.example.com:8080 https://api.example.com curl --proxy http://proxy.example.com:8080 https://api.example.com # HTTPS 代理 curl -x https://proxy.example.com:443 https://api.example.com # SOCKS 代理 curl -x socks5://proxy.example.com:1080 https://api.example.com curl -x socks5h://proxy.example.com:1080 https://api.example.com
代理认证
bash# 用户名密码认证 curl -x http://user:password@proxy.example.com:8080 https://api.example.com # 使用 -U 参数 curl -x http://proxy.example.com:8080 -U user:password https://api.example.com # NTLM 认证 curl -x http://proxy.example.com:8080 \ --proxy-ntlm \ -U user:password \ https://api.example.com # Digest 认证 curl -x http://proxy.example.com:8080 \ --proxy-digest \ -U user:password \ https://api.example.com
代理类型对比
| 代理类型 | 协议 | 特点 | 使用场景 |
|---|---|---|---|
| HTTP | http:// | 明文传输 | 简单代理、缓存 |
| HTTPS | https:// | 加密传输 | 安全代理 |
| SOCKS4 | socks4:// | TCP 转发 | 基础代理 |
| SOCKS5 | socks5:// | 支持UDP、认证 | 高级代理 |
| SOCKS5H | socks5h:// | DNS 远程解析 | 隐私保护 |
环境变量配置
bash# 设置环境变量 export http_proxy="http://proxy.example.com:8080" export https_proxy="http://proxy.example.com:8080" export HTTP_PROXY="http://proxy.example.com:8080" export HTTPS_PROXY="http://proxy.example.com:8080" export no_proxy="localhost,127.0.0.1,.example.com" # 使用环境变量 curl https://api.example.com # 忽略环境变量 curl --noproxy "*" https://api.example.com
代理绕过
bash# 绕过特定域名 curl --noproxy "localhost,127.0.0.1,internal.example.com" \ -x http://proxy.example.com:8080 \ https://api.example.com # 绕过所有代理 curl --noproxy "*" https://api.example.com
代理调试
bash# 查看代理连接过程 curl -v -x http://proxy.example.com:8080 https://api.example.com 2>&1 | grep -i proxy # 测试代理连通性 curl -v -x http://proxy.example.com:8080 http://www.google.com # 通过代理查看真实 IP curl -x http://proxy.example.com:8080 https://api.ipify.org
高级代理配置
bash# 代理自动配置(PAC) curl --proxy-header "User-Agent: MyApp/1.0" \ -x http://proxy.example.com:8080 \ https://api.example.com # 代理隧道(用于 HTTPS) curl -x http://proxy.example.com:8080 \ --proxy-tunnel \ https://api.example.com # 指定代理服务器的 TLS 版本 curl -x https://proxy.example.com:443 \ --proxy-tlsv1.2 \ https://api.example.com # 代理证书验证 curl -x https://proxy.example.com:443 \ --proxy-cacert /path/to/proxy-ca.crt \ https://api.example.com # 忽略代理证书验证 curl -x https://proxy.example.com:443 \ --proxy-insecure \ https://api.example.com
实战场景
bash# 场景 1:企业内网访问外网 curl -x http://corporate-proxy.company.com:8080 \ -U "domain\\username:password" \ https://api.github.com/user # 场景 2:使用 SSH 隧道作为代理 # 先建立隧道:ssh -D 1080 user@remote-server curl -x socks5://localhost:1080 https://api.example.com # 场景 3:负载测试通过代理 for i in {1..10}; do curl -x http://proxy.example.com:8080 \ -w "Request $i: %{http_code}\n" \ -o /dev/null -s \ https://api.example.com & done wait # 场景 4:抓包分析 # 配合 Charles/Fiddler 使用 curl -x http://localhost:8888 \ -k \ https://api.example.com
代理配置文件
bash# ~/.curlrc 配置文件 proxy = "http://proxy.example.com:8080" proxy-user = "username:password" noproxy = "localhost,127.0.0.1" # 使用配置文件 curl https://api.example.com # 忽略配置文件 curl -q https://api.example.com
常见问题解决
bash# 问题 1:代理连接超时 # 解决:增加超时时间 curl -x http://proxy.example.com:8080 \ --connect-timeout 30 \ https://api.example.com # 问题 2:代理认证失败 # 解决:检查认证方式和凭据 curl -v -x http://proxy.example.com:8080 \ --proxy-ntlm -U "domain\\user:pass" \ https://api.example.com # 问题 3:HTTPS 通过 HTTP 代理失败 # 解决:使用 CONNECT 方法(默认)或隧道 curl -x http://proxy.example.com:8080 \ --proxy-tunnel \ https://api.example.com # 问题 4:DNS 泄露 # 解决:使用 socks5h 让代理服务器解析 DNS curl -x socks5h://proxy.example.com:1080 \ https://api.example.com # 问题 5:代理服务器证书问题 # 解决:指定 CA 或忽略验证 curl -x https://proxy.example.com:443 \ --proxy-insecure \ https://api.example.com
完整代理示例
bash# 企业级代理配置 curl -x http://corporate-proxy.company.com:8080 \ --proxy-ntlm \ -U "COMPANY\\username:password" \ --proxy-header "User-Agent: CorporateApp/1.0" \ --noproxy "localhost,127.0.0.1,*.internal.company.com" \ --connect-timeout 30 \ --max-time 60 \ -H "Authorization: Bearer api_token" \ https://api.external-service.com/data