curl 设置代理访问
概述
curl 是一个强大的命令行 HTTP 客户端工具,支持通过多种类型的代理发送请求。
本文介绍 curl 设置代理的常用方法和使用示例。
代理类型
curl 支持以下几种代理协议:
| 代理类型 | 前缀 | 说明 |
|---|---|---|
| HTTP 代理 | http:// |
最常见的代理类型 |
| HTTPS 代理 | https:// |
加密的 HTTP 代理 |
| SOCKS4 代理 | socks4:// |
不支持 UDP,不支持认证 |
| SOCKS5 代理 | socks5:// |
支持 UDP、IPv6 和认证 |
| SOCKS5h | socks5h:// |
DNS 解析由代理服务器完成 |
连接性测试
代理连接检测(TCP 连通性):
curl -v --connect-timeout 5 telnet://192.168.1.100:8080
基本用法
-x / --proxy 选项
-x 是 --proxy 的短选项,两者完全等价:
# 使用 HTTP 代理
curl -x http://192.168.1.100:8080 https://www.example.com
# 使用 --proxy 长选项(效果相同)
curl --proxy http://192.168.1.100:8080 https://www.example.com
SOCKS5 代理
curl -x socks5://192.168.1.100:1080 https://www.example.com
# 验证代理发信服务器
curl -v --connect-timeout 5 --proxy socks5://192.168.1.100:1080 telnet://smtp.163.com:25
SOCKS5h 代理(推荐)
socks5h 与 socks5 的区别在于 DNS 解析由代理服务器完成,可以避免 DNS 泄漏:
curl -x socks5h://192.168.1.100:1080 https://www.example.com
带认证的代理
如果代理需要用户名和密码:
# 在 URL 中指定用户名和密码
curl -x http://username:password@192.168.1.100:8080 https://www.example.com
# 使用 --proxy-user 单独指定
curl -x http://192.168.1.100:8080 --proxy-user username:password https://www.example.com
测试代理是否可用
基础连通性测试
# 测试 SOCKS5 代理
curl -x socks5://192.168.1.100:1080 https://www.baidu.com -v
# 测试 HTTP 代理
curl -x http://192.168.1.100:8080 https://www.baidu.com -v
只输出状态码(快速验证)
# 返回 200 表示代理可用
curl -x socks5://192.168.1.100:1080 \
-o /dev/null -s -w "%{http_code}\n" \
https://www.baidu.com
查看详细连接过程
curl -x socks5://192.168.1.100:1080 -v https://www.example.com
输出中可以看到代理握手过程:
* Uses proxy env variable no_proxy == 'localhost,127.0.0.1'
* SOCKS5 connect to IPv4 93.184.216.34 (locally resolved)
* SOCKS5 request granted.
* Connected to 192.168.1.100 (192.168.1.100) port 1080
环境变量方式
除了在命令行中指定,也可以通过环境变量全局设置代理,对所有 curl 请求生效:
# 设置 HTTP 代理
export http_proxy=http://192.168.1.100:8080
export HTTP_PROXY=http://192.168.1.100:8080
# 设置 HTTPS 代理
export https_proxy=http://192.168.1.100:8080
export HTTPS_PROXY=http://192.168.1.100:8080
# 设置 SOCKS5 代理
export all_proxy=socks5://192.168.1.100:1080
export ALL_PROXY=socks5://192.168.1.100:1080
# 之后直接使用 curl,无需 -x 参数
curl https://www.example.com
清除代理环境变量:
unset http_proxy https_proxy all_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY
忽略代理(no_proxy)
在设置了全局代理的情况下,部分地址不走代理:
# 环境变量方式
export no_proxy="localhost,127.0.0.1,192.168.0.0/16,*.internal.com"
# 命令行方式(临时忽略代理)
curl --noproxy "localhost,127.0.0.1" https://internal.example.com
写入配置文件
如果不想每次都输入代理参数,可以写入 curl 配置文件 ~/.curlrc:
# ~/.curlrc
proxy = socks5://192.168.1.100:1080
之后所有 curl 命令都会自动使用该代理。如需临时禁用:
curl --noproxy '*' https://www.example.com
常用参数速查
| 参数 | 说明 |
|---|---|
-x / --proxy |
指定代理地址 |
--proxy-user |
指定代理认证用户名密码 |
--noproxy |
指定不走代理的地址 |
--socks5 |
快捷指定 SOCKS5 代理(等价于 -x socks5://) |
--socks5-hostname |
快捷指定 SOCKS5h 代理(DNS 由代理解析) |
-v / --verbose |
显示详细连接过程 |
-s / --silent |
静默模式,不输出进度信息 |
-o /dev/null |
丢弃响应体 |
-w "%{http_code}" |
只输出 HTTP 状态码 |
常见问题
SOCKS5 vs SOCKS5h
socks5://:DNS 由本地解析,再将 IP 发送给代理socks5h://:域名直接发送给代理,由代理进行 DNS 解析(更安全,防止 DNS 泄漏)
代理不生效排查
- 检查代理地址和端口是否正确
- 确认代理协议类型(HTTP / SOCKS5)
- 检查是否存在
no_proxy环境变量将目标地址排除 - 使用
-v查看详细连接日志 - 确认代理服务器本身是否正常运行