返回博客

如何使用 cURL 通过代理:HTTP、HTTPS 和 SOCKS5 示例

James Thompson
James Thompson

Scraping and Proxy Management Expert

07-Aug-2026

TL;DR:

  • 使用 -x--proxy 通过 HTTP、HTTPS 或 SOCKS 代理路由 cURL 请求。 将目标 URL 与代理地址分开。
  • HTTPS 目标不需要 HTTPS 代理。 HTTP 代理通常通过 CONNECT 隧道连接到 HTTPS 目标; https:// 代理 URL 另外加密客户端与代理之间的传输。
  • 使用 socks5h:// 当代理需要解析目标主机名时。 普通 socks5:// 在本地解析,这可能会暴露 DNS 行为或在仅限代理的主机名上失败。
  • 将凭证排除在 URL 和源文件之外。 引号包围 shell 变量,保护配置文件,并且永远不要公开真实的用户名、密码或网关令牌。
  • 验证的不仅仅是出口 IP。 检查状态、预期内容、地点、DNS 行为,以及在授权目标上的非代理控制请求。

cURL 代理支持内置于大多数开发者已经用于 HTTP 诊断的命令中。只需一个选项即可通过 HTTP 网关、HTTPS 代理或 SOCKS5 服务器路由请求,并在需要时应用身份验证和主机排除规则。

语法很简单,但网络行为却并不简单。HTTPS 目标使用隧道,SOCKS 方案决定 DNS 解析发生在哪里,环境变量因大小写而异,凭证可能会因不小心的命令历史而泄漏。

本指南以一个最小化的命令开始,并建立在 macOS、Linux 和 Windows 上有效的配置。

快速 cURL 代理示例

使用一个受授权的公共测试目标和一个您控制或被允许使用的代理:

bash Copy
curl --proxy "http://proxy.example.com:8080" \
  --connect-timeout 10 \
  --max-time 30 \
  --show-error \
  "https://example.com/"

长选项 --proxy 和短选项 -x 是等价的。cURL 命令行参考 文档中列出了支持的代理方案、身份验证选项和排除行为。

在诊断时添加 --verbose 以查看连接序列。因为头信息和连接细节可能是敏感的,所以从正常日志中删除详细输出。

cURL 代理 URL 的工作原理

代理选项接受一个方案、主机和端口:

scheme://proxy-host:port

常见的方案包括:

  • http:// 用于 HTTP 代理;
  • https:// 用于 cURL 与代理之间的 TLS;
  • socks4://socks4a:// 用于 SOCKS4 变种;
  • socks5:// 用于带有本地目标名称解析的 SOCKS5;
  • socks5h:// 用于代理端目标名称解析的 SOCKS5。

目标 URL 保持为最后一个参数。不要将目标和代理合并为一个 URL。

使用 HTTP 代理与 cURL

对于普通 HTTP 目标,cURL 通过代理发送请求。对于 HTTPS 目标,它通常请求代理使用 HTTP CONNECT 方法打开一个隧道,然后通过该隧道与目标执行 TLS。

bash Copy
# HTTP target through an HTTP proxy
curl -x "http://proxy.example.com:8080" "http://example.com/"

# HTTPS target through the same HTTP proxy
curl -x "http://proxy.example.com:8080" "https://example.com/"

第二个命令仍然通过目标 TLS 保护 HTTP 请求和响应。客户端与代理之间的连接在建立隧道之前不会单独加密,因此本地网络观察者可以看到代理连接和隧道目标的元数据。

HTTP 语义规范 定义用于建立隧道的 CONNECT 方法。

使用 HTTPS 代理与 cURL

HTTPS 代理加密从 cURL 到代理的传输。在代理 URL 前加上 https://

bash Copy
curl --proxy "https://proxy.example.com:8443" \
  --proxy-cacert "/path/to/proxy-ca.pem" \
  "https://example.com/"

--proxy-cacert 提供一个 CA 包,用于在默认信任库不包含颁发 CA 时验证代理的证书。不要将 --proxy-insecure 作为永久解决方案;它禁用代理证书验证。

不是每个代理端点都接受 TLS。确保 URL 方案和端口与提供商的文档相匹配。

使用 SOCKS5 代理与 cURL

SOCKS 代理在 HTTP 之下操作,可以承载多种应用协议。对于 Web 请求,重要的选择是目标主机名的解析位置。

bash Copy
# Resolve example.com on the local machine
curl --proxy "socks5://proxy.example.com:1080" "https://example.com/"

# Send example.com to the proxy for resolution
curl --proxy "socks5h://proxy.example.com:1080" "https://example.com/"

# Equivalent long option for proxy-side hostname resolution
curl --socks5-hostname "proxy.example.com:1080" "https://example.com/"

当目标主机名不应由本地解析器解析、主机名仅在代理网络中可见或本地 DNS 给出了错误的区域结果时,使用 socks5h://

Everything cURL SOCKS 指南 解释了本地与代理名称解析的区别。该协议本身定义在 RFC 1928 中。

安全地向代理进行身份验证

使用 --proxy-user-U,而不是将凭证嵌入代理 URL 中:

bash Copy
export PROXY_HOST="proxy.example.com"
export PROXY_PORT="8080"
export PROXY_USER="replace-with-user"
read -r -s -p "Proxy password: " PROXY_PASS
printf '\n'

curl --proxy "http://${PROXY_HOST}:${PROXY_PORT}" \
  --proxy-user "${PROXY_USER}:${PROXY_PASS}" \
  "https://example.com/"

unset PROXY_PASS

引号可防止空格、美元符号、感叹号和其他 shell 字符被重新解释。请不要直接在共享 shell 命令、票据、截图或代码库中键入真实密码。
命令行参数可能会在本地进程检查中可见。对于自动化,建议使用一个秘密管理器,在一个孤立的作业中注入一个短期值。如果您使用 cURL 配置文件,请限制其权限并将其保存在版本控制之外:

text Copy
proxy = "http://proxy.example.com:8080"
proxy-user = "replace-with-user:replace-with-password"
connect-timeout = 10
max-time = 30
show-error

在 macOS 或 Linux 上,使用 chmod 600 proxy.conf 设置权限,然后运行 curl --config proxy.conf https://example.com/。如果文件被暴露,请删除或轮换凭证。

设置代理环境变量

cURL 识别应该共享代理路由的应用程序环境变量:

bash Copy
export http_proxy="http://proxy.example.com:8080"
export HTTPS_PROXY="http://proxy.example.com:8080"
export ALL_PROXY="socks5h://proxy.example.com:1080"
export NO_PROXY="localhost,127.0.0.1,.internal.example.com"

curl "https://example.com/"

小写的 http_proxy 形式是故意的。出于安全考虑,cURL 仅接受该变量的小写,而其他代理变量可以是大写。 ALL_PROXY 作为后备;特定于协议的变量具有优先权。

Everything cURL 环境变量指南 记录了大小写规则和 NO_PROXY 匹配。

使用环境变量来控制作业,而不是作为您忘记处于活动状态的全局桌面设置。在请求意外使用代理时检查它们。

从代理路由中排除选定的主机

使用 --noproxy 进行一条命令:

bash Copy
curl --proxy "http://proxy.example.com:8080" \
  --noproxy "localhost,127.0.0.1,.internal.example.com" \
  "https://internal.example.com/health"

一个精确的主机名与该主机匹配。以点开头的域名匹配该域及其子域。星号会禁用所有主机的代理,这仅在诊断时有用。

将排除列表视为政策。一个广泛的后缀可能会将敏感或内部目的地导向意图之外的网关。

在 Windows 上配置 cURL 代理

cURL 选项本身是跨平台的。只有环境和引号语法发生变化。

在 PowerShell 中:

powershell Copy
$env:http_proxy = "http://proxy.example.com:8080"
$env:HTTPS_PROXY = "http://proxy.example.com:8080"
$env:NO_PROXY = "localhost,127.0.0.1,.internal.example.com"

curl.exe --proxy "http://proxy.example.com:8080" `
  --proxy-user "replace-with-user:replace-with-password" `
  --show-error `
  "https://example.com/"

Remove-Item Env:http_proxy, Env:HTTPS_PROXY, Env:NO_PROXY

在可能解析为另一个命令的 Windows PowerShell 环境中使用 curl.exe。在命令提示符中,变量使用 %NAME%;对于可重复的自动化,请优先使用 PowerShell 或受保护的 cURL 配置文件。

验证代理退出 IP

首先记录一个直接控制响应,然后通过代理发出相同的请求:

bash Copy
curl --silent --show-error "https://httpbin.org/ip"

curl --silent --show-error \
  --proxy "http://proxy.example.com:8080" \
  "https://httpbin.org/ip"

不同的 IP 值显示路由发生了变化。它们不能证明请求的国家、会话行为、匿名级别或目标页面的成功。

对于真实的接受测试,检查以下所有内容:

  • cURL 成功退出;
  • HTTP 状态是预期的;
  • 正文包含所需的标记;
  • 退出 IP 或区域符合任务政策;
  • DNS 解析发生在预期的一方;
  • 在详细连接输出中没有未批准的主机出现。

您可以在不保存正文的情况下打印状态和远程对等地址:

bash Copy
curl --output /dev/null --silent --show-error \
  --write-out 'status=%{http_code} peer=%{remote_ip}\n' \
  --proxy "http://proxy.example.com:8080" \
  "https://example.com/"

常见的 cURL 代理错误

407 Proxy Authentication Required

代理未接受提供的凭证或帐户/频道无法处理请求。确认用户名格式、密码、频道状态和允许的身份验证方法。将目标站点 401 错误与代理 407 错误分开处理。

连接超时

检查代理主机名、端口、防火墙、VPN 冲突,以及端点是否期待 HTTP、HTTPS 或 SOCKS。在 --connect-timeout 中使用限制连接设置,并在 --max-time 中使用限制整个操作。

代理证书错误

对于 HTTPS 代理,请确保代理主机名与其证书匹配,并且正确的 CA 被信任。目标 CA 选项和代理 CA 选项保护不同的 TLS 连接。

Could not resolve host

如果消息在使用 socks5:// 时命名目标,请在意图代理侧 DNS 时切换到 socks5h://。如果它命名了代理,请修复本地 DNS 或代理主机名。

直接请求有效但代理请求失败

比较详细输出、目标政策、代理位置、协议和正文标记。退出 IP 端点可能工作,而实际目标拒绝流量,因此始终单独测试允许的生产主机名。

使用 cURL 与 Scrapeless 代理

Scrapeless 代理解决方案产品页面 涵盖了住宅、数据中心、静态 ISP 和 IPv6 选项。在 Scrapeless 仪表板中创建一个频道,然后复制生成的网关、用户名和密码。不要发明用户名格式;它可以包括代理类型、位置和为该频道选择的会话参数。

将生成的值设置为受保护变量:

bash Copy
export SCRAPELESS_PROXY_HOST="gw-us.scrapeless.io"
export SCRAPELESS_PROXY_PORT="8789"
export SCRAPELESS_PROXY_USER="replace-with-generated-username"
read -r -s -p "Scrapeless proxy password: " SCRAPELESS_PROXY_PASS
printf '\n'

curl --proxy "http://${SCRAPELESS_PROXY_HOST}:${SCRAPELESS_PROXY_PORT}" \
  --proxy-user "${SCRAPELESS_PROXY_USER}:${SCRAPELESS_PROXY_PASS}" \
  --connect-timeout 10 \
  --max-time 30 \
  --show-error \
  "https://httpbin.org/ip"

unset SCRAPELESS_PROXY_PASS

上面的网关是当前记录的美国端点;从仪表板或当前文档中选择离您的应用程序最近的端点。退出地理位置通过生成的用户名参数单独控制。
遵循 Scrapeless 代理设置指南 创建一个频道,然后使用 代理功能参考 获取当前的网关和位置字段。

如果您正在选择地址类型,数据中心与住宅代理指南 解释了操作的权衡。查看 Scrapeless 定价 以获取当前条款。

cURL 代理清单

  • 确认目标和代理被授权执行该任务。
  • 将代理 URL 方案与提供商端点匹配。
  • 当需要代理端 DNS 时使用 socks5h://
  • 将凭据保持在 URL、提示、日志和存储库之外。
  • 引号包围可能包含特殊字符的每个变量。
  • 绑定连接和总时间。
  • 设定 NO_PROXY--noproxy 的范围。
  • 将直接控制与代理响应进行比较。
  • 验证预期内容,而不仅仅是退出 IP。
  • 从正常日志中移除冗长的诊断信息。

创建一个 Scrapeless 代理频道 并首先针对您被允许访问的一个公共端点进行测试。

常见问题解答

Q: 什么是 cURL 代理语法?

使用 curl --proxy "scheme://host:port" "https://target.example.com/"。简短形式是 curl -x "scheme://host:port" "https://target.example.com/"

Q: 如何添加代理用户名和密码?

使用 --proxy-user "username:password" 并将凭据保持在代理 URL 之外。在自动化中,从受保护的秘密存储中注入值。

Q: socks5://socks5h:// 有什么区别?

使用 socks5:// 时,cURL 在本地解析目标主机名。使用 socks5h:// 时,SOCKS5 代理进行解析。

Q: 我可以为 HTTPS 网站使用 HTTP 代理吗?

可以。cURL 通常使用 HTTP CONNECT 通过 HTTP 代理创建隧道,然后与 HTTPS 目标进行 TLS。

Q: 如何为一个主机禁用代理?

对一个命令使用 --noproxy "host.example" 或将主机添加到 NO_PROXY。确保列表范围较窄并审查域后缀匹配。

在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。

最受欢迎的文章

目录