cURL 设置代理最常用的写法,是用 -x 指定代理地址,用 -U 单独填写代理账号和密码。例如,通过带账密认证的 HTTP 代理访问 HTTPS 网站:
curl -x http://proxy.example.com:7778 \
-U 'username:password' \
https://example.com/
代理协议由 -x 后面的地址决定,最后的 https://example.com/ 是目标 URL。两者不是同一个概念。下面先用一张表选择正确写法。
| 使用需求 | 代理地址写法 | 关键区别 |
|---|---|---|
| HTTP 代理 | http://host:port |
客户端到代理使用 HTTP |
| HTTPS 代理 | https://host:port |
客户端到代理这一段使用 TLS |
| SOCKS5,本机解析目标域名 | socks5://host:port |
DNS 查询由运行 cURL 的机器完成 |
| SOCKS5,代理解析目标域名 | socks5h://host:port |
目标主机名交给 SOCKS5 代理解析 |
如果还不确定业务应该使用哪一种代理,可先了解 HTTP、HTTPS 与 SOCKS5 的区别和适用场景。本文只讲 cURL 中如何配置、验证和排错,不重复展开代理协议原理。
下文多行命令按 Bash/zsh 格式展示;Windows PowerShell 可合并为一行,并优先使用 curl.exe 避免系统别名影响。
一、cURL 的代理参数怎么写?
-x 是 --proxy 的短写,用来指定代理协议、Host 和 Port;-U 是 --proxy-user 的短写,用来提供代理用户名和密码。cURL 的完整结构可以拆成:
curl -x [代理协议://代理Host:代理Port] \
-U '[代理用户名:代理密码]' \
[目标URL]
| 命令部分 | 控制什么 | 常见错误 |
|---|---|---|
-x / --proxy |
客户端连接哪个代理、使用什么代理协议 | 把目标网站地址误填成代理地址 |
-U / --proxy-user |
向代理服务器提交认证凭证 | 误用 -u,把凭证发给目标站 |
| 目标 URL | 代理建立后真正访问的资源 | 根据目标 URL 的 HTTPS 误判代理本身也是 HTTPS |
cURL 官方手册说明,代理地址未写协议前缀时默认按 HTTP 代理处理。为了减少歧义,实际配置时建议始终写出 http://、https://、socks5:// 或 socks5h://。
二、cURL 怎么设置 HTTP / HTTPS 代理?
1. HTTP 代理基本写法
curl -x http://proxy.example.com:7778 \
https://example.com/
如果代理使用纯 IP 白名单认证,并且当前公网来源已进入白名单,通常不需要再填写 -U;具体仍以服务商的认证规则为准。
2. HTTP 代理带用户名密码
curl -x http://proxy.example.com:7778 \
-U 'username:password' \
https://example.com/
这时 username:password 用于代理认证,不是目标网站的登录账号。测试命令中不要放真实生产凭证,也不要把带认证信息的终端截图直接发到公开工单。
3. HTTP 代理访问 HTTPS 网站是什么意思?
curl -x http://proxy.example.com:7778 \
https://example.com/
这条命令仍然使用 HTTP 代理。http://proxy.example.com 决定客户端如何连接代理;https://example.com 决定目标网站使用 HTTPS。对于 HTTPS 目标,HTTP 代理通常通过 CONNECT 建立隧道,但这不会把“客户端到普通 HTTP 代理”自动变成 HTTPS 代理连接。需要进一步理解这条边界时,可查看 HTTP 代理访问 HTTPS 网站的工作方式。
4. 真正的 HTTPS Proxy 怎么写?
只有服务商明确提供支持 TLS 的 HTTPS Proxy 端点时,代理地址才应写成 https://。服务商所说的“支持访问 HTTPS 网站”,并不等于代理端点本身就是 HTTPS Proxy。
curl -x https://proxy.example.com:7778 \
-U 'username:password' \
https://example.com/
这里代理地址本身以 https:// 开头,cURL 到代理服务器这一段使用 TLS。使用 HTTPS 代理时,cURL 会验证代理证书中的主机名和签发链;内部 CA 或自签证书环境应正确配置代理 CA,例如使用 --proxy-cacert,而不是把 --proxy-insecure 当成长期解决方案。相关选项可参考 cURL 的 HTTPS Proxy 说明。如果 https:// 代理直接提示协议不支持,可先执行 curl -V 查看当前 cURL 版本和 TLS 后端;HTTPS Proxy 是否可用与当前构建有关。
三、cURL 怎么设置 SOCKS5 代理?
1. SOCKS5 基本写法
curl -x socks5://proxy.example.com:1080 \
https://example.com/
2. SOCKS5 用户名密码认证
curl -x socks5://proxy.example.com:1080 \
-U 'username:password' \
https://example.com/
SOCKS5 有自己的认证流程,不使用 HTTP 的 407、Proxy-Authenticate 或 Proxy-Authorization 机制。遇到 SOCKS5 认证失败时,应检查端点、账号密码和客户端支持情况,不要把所有认证错误都按 HTTP 407 处理。
3. --socks5 写法
curl --socks5 proxy.example.com:1080 \
https://example.com/
--socks5 host:port 与 -x socks5://host:port 都表示使用 SOCKS5,并由本机解析目标域名。为了让不同协议的命令形式保持一致,本文后续主要使用 -x 写法。
四、socks5:// 和 socks5h:// 有什么区别?
两者的区别只在目标域名由谁解析。代理服务器自身的域名 proxy.example.com 仍要由本机找到;变化的是目标域名 example.com 的解析位置。
# 目标域名由本机解析
curl -x socks5://proxy.example.com:1080 \
https://example.com/
# 目标域名交给 SOCKS5 代理解析
curl -x socks5h://proxy.example.com:1080 \
https://example.com/
| 写法 | 目标域名解析位置 | 适合情况 |
|---|---|---|
socks5:// |
本机 DNS | 本地可以正确解析目标域名,并希望沿用本地解析结果 |
socks5h:// |
SOCKS5 代理 | 需要由代理所在网络解析目标域名,或本地无法得到合适结果 |
cURL 官方参数说明将 socks5h:// 视为 --socks5-hostname 的等价写法。选择时只需围绕DNS解析位置,不必把这一小节扩展成所有DNS或浏览器泄漏问题。
socks5:// 由本机解析目标域名,socks5h:// 把目标域名交给代理解析。五、cURL 代理账号密码怎么填写?
1. 推荐使用 -U
推荐通过 -U 'username:password' 单独提供代理凭证,而不是把账号密码嵌入代理 URL。这样阅读和排错更清楚。命令行凭证仍可能短暂出现在进程列表或保留在 Shell 历史中;生产环境应使用受控配置文件或密钥管理方式,不要长期把密码明文写进脚本。
-U 和 -u 不一样
| 参数 | 认证对象 | 用途 |
|---|---|---|
-U / --proxy-user |
代理服务器 | 提交代理账号密码 |
-u / --user |
目标网站或 API | 提交目标服务的用户凭证 |
3. Basic 之外的 HTTP 代理认证
cURL 对 HTTP 代理默认使用 Basic。代理要求其他认证方案时,可使用 --proxy-anyauth 让 cURL 根据代理返回的挑战选择支持的方式,或按明确要求使用 --proxy-digest、--proxy-ntlm、--proxy-negotiate。这些选项针对 HTTP 代理认证,不是 SOCKS5 认证参数。
使用普通 HTTP 代理时,Basic 认证本身不负责加密代理凭证;如果客户端到代理服务器之间的链路不可信,应结合 HTTPS Proxy 或受保护的网络环境使用。
4. 用户名或密码包含特殊字符怎么办?
使用 -U 'username:password' 时,优先让凭证与代理 URL 分开,并按当前 Shell 的规则正确引用。如果把凭证直接嵌入代理 URL,@、:、#、% 等字符可能需要百分号编码。本文不重复完整编码表;如果已经出现 407,可进入 407 Proxy Authentication Required 专项排查。
六、怎么用 cURL 检查代理出口 IP?
验证代理是否真正生效,不要只看命令是否返回 200。最直接的方法是先查询一次直连公网 IP,再用同一台机器经过代理查询,并比较结果。
1. 不走代理查询公网 IP
curl https://api.ipify.org
2. 使用代理再次查询
curl -x http://proxy.example.com:7778 \
-U 'username:password' \
https://api.ipify.org
3. 比较两次结果
正常使用独立代理出口时,代理请求返回的公网地址通常应与直连公网 IP 不同,并与购买或提取的代理地区相符。需要检查国家、城市和 ASN 时,可以把测试地址换成返回地理与网络信息的查询接口;不同 GEO 数据库可能存在差异,验收时应固定同一查询来源。仍分不清本地 IP、公网 IP 和代理出口时,可参考 电脑IP查询与代理出口判断方法。
| 代理类型或目标 | 怎么重复测试 | 预期结果 |
|---|---|---|
| 固定代理 | 间隔执行多次,并在业务周期内复测 | 出口 IP 保持为分配的固定地址 |
| Sticky Session | 按服务商规则保持同一 Session 参数 | 会话有效期内出口保持一致 |
| 轮换代理 | 按套餐轮换规则发起多次新请求或新会话 | 出口按规则发生变化,而不是始终返回本地 IP |
| 指定国家或城市 | 检查 IP、国家、城市和 ASN | 结果与选定位置及服务商说明一致 |
如果使用 IPWeb 动态代理,账号中的地区、时效和 Session 参数应以 IPWeb 动态代理使用指南为准,不要根据其他服务商的用户名格式直接套用。
七、怎么用环境变量设置 cURL 代理?
需要让一组 cURL 命令默认经过代理时,可以使用代理环境变量。下面是 POSIX Shell 示例:
export http_proxy="http://proxy.example.com:7778"
export HTTPS_PROXY="http://proxy.example.com:7778"
export ALL_PROXY="socks5h://proxy.example.com:1080"
export NO_PROXY="localhost,127.0.0.1,.example.com"
| 变量 | 作用 | 容易误解的地方 |
|---|---|---|
http_proxy |
访问 HTTP 目标时使用的代理 | cURL 出于安全原因只接受小写的 http_proxy |
HTTPS_PROXY |
访问 HTTPS 目标时使用的代理 | 变量名中的 HTTPS 描述目标协议;变量值仍可指向 http:// 代理 |
ALL_PROXY |
没有更具体协议变量时使用的通用代理 | 协议专用变量存在时优先使用专用变量 |
NO_PROXY |
列出不经过代理的主机、域名或地址范围 | 可能影响环境变量代理的使用范围,应结合当前命令参数一起检查 |
http_proxy 是特殊情况:cURL 出于安全原因不接受大写的 HTTP_PROXY;其他代理变量通常可以使用大小写形式。团队环境中最好统一命名规则,避免 Shell、CI/CD 和不同工具之间出现配置差异。
NO_PROXY / no_proxy 用于定义不经过代理的目标。如果发现部分域名没有按预期走代理,应检查当前环境中的代理变量和排除规则。需要明确覆盖排除列表时,可使用 --noproxy ""。如果命令同时使用显式代理参数和环境变量,建议通过 curl -v 确认实际连接方向。环境变量的大小写和匹配规则可在 cURL 代理环境变量文档中核对。
如果明明配置了代理但出口没有变化,检查当前 Shell 中遗留的代理变量、NO_PROXY、启动脚本和 CI/CD 环境;使用 curl -v 可以观察实际连接方向,但分享输出前必须脱敏代理用户名、认证头和其他敏感字段。
八、cURL 代理失败怎么排查?
| 错误或现象 | 优先检查 | 下一步 |
|---|---|---|
407 Proxy Authentication Required |
-U、账号密码、认证方案、来源 IP 白名单 |
先做最小请求;持续 407 时查看 完整的 407 代理认证排查流程 |
Could not resolve proxy |
Proxy Host 拼写、本机 DNS | 单独确认代理主机名能够解析 |
Failed to connect |
Host、Port、防火墙和代理服务状态 | 确认端口开放,并核对服务商当前端点 |
| Timeout | 本地网络、代理可达性、目标网站响应 | 区分连接代理超时,还是代理连接目标站超时 |
| HTTPS Proxy 证书错误 | Proxy CA、证书链和代理主机名 | 配置正确 CA,不把跳过验证作为正式方案 |
| SOCKS5 域名访问异常 | socks5:// 与 socks5h:// |
根据目标域名应由本机还是代理解析进行切换 |
| 配置代理但出口 IP 没变化 | NO_PROXY、环境变量、当前参数和查询方式 |
比较直连与代理查询,并确认目标未命中绕过规则 |
排障时一次只改一个变量,并记录代理协议、Host、Port、认证方式、目标 URL、完整错误和发生时间。这样才能判断恢复来自哪项修改,而不是靠反复换命令碰运气。
九、cURL 代理常见问题
1. curl -x 是什么意思?
-x 是 --proxy 的短写,用来指定代理协议、代理主机和端口。它后面填写代理地址,命令最后才是目标 URL。
2. -U 和 -u 有什么区别?
-U 向代理服务器提交账号密码,-u 向目标网站或 API 提交账号密码。大小写不能混用。
3. HTTP 代理能不能访问 HTTPS 网站?
可以,前提是代理支持所需的隧道转发。代理地址仍写成 http://,目标 URL 写成 https://;目标使用 HTTPS 不会把代理自动变成 HTTPS Proxy。
4. HTTPS Proxy 和 HTTPS 网站有什么区别?
HTTPS Proxy 描述客户端到代理这一段使用 TLS;HTTPS 网站描述客户端通过代理访问的目标使用 HTTPS。两段连接可以分别判断,不能只看目标 URL。
5. socks5 和 socks5h 有什么区别?
socks5:// 由本机解析目标域名,socks5h:// 把目标域名交给代理解析。它们不是两个不同版本的 SOCKS 协议。
6. 配了代理为什么出口 IP 没有变化?
先确认命令实际使用了 -x,目标没有命中 NO_PROXY,并用同一查询接口分别测试直连和代理结果。如果只有部分程序出口不变,应检查它们是否继承了不同的环境变量或根本没有调用 cURL。
完成配置后,至少确认三项结果:cURL 实际连接的代理端点、代理后的公网出口,以及重复请求时的出口表现。使用 Sticky Session 或轮换代理时,再按对应的 Session 与轮换规则复测。不要只以“命令没有报错”作为代理已经正确生效的标准。