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 代理(推荐)

socks5hsocks5 的区别在于 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 泄漏)

代理不生效排查

  1. 检查代理地址和端口是否正确
  2. 确认代理协议类型(HTTP / SOCKS5)
  3. 检查是否存在 no_proxy 环境变量将目标地址排除
  4. 使用 -v 查看详细连接日志
  5. 确认代理服务器本身是否正常运行