先固定测试条件与凭据处理

先运行 curl --version 记录版本。以下为 Linux/macOS Bash 的单行示例;代理地址、端口、账号及目标均为占位值,应替换成自己的授权资源。先确认服务要求账号密码还是 IP 白名单;不要把网站登录账号直接当成代理凭据。

账号认证示例从当前目录的 proxy-auth.conf 读取配置,该文件需由你自行准备并限制访问。下面仅展示占位格式;真实凭据不要写入命令历史、共享脚本或截图。环境变量与配置文件同样不是天然安全的保密措施。

proxy-user = "replace-me:replace-me"

只采用 IP 白名单、无需账号认证时,去掉示例的 --config "./proxy-auth.conf" 并核对当前出口已获授权。--disable 放在首个参数,避免默认 curl 配置文件影响本次对照。

1. 对同一目标建立直连基线

curl --disable --noproxy "*" --connect-timeout 5 --max-time 15 --output /dev/null --silent --show-error --write-out "target=%{http_code} connect_s=%{time_connect} ttfb_s=%{time_starttransfer} total_s=%{time_total}\n" "https://example.com/"; printf "exit=%s\n" "$?"

--noproxy "*" 明确让本次请求直连。核对目标响应与内容,保存错误输出和退出码。示例不自动跟随重定向,也不自动重试;如果测试需要这些行为,应在两组请求中采用相同设置并记录。

示例用 --output /dev/null 丢弃正文,便于单独记录指标。需要核对响应内容时,去掉该参数或保存到受控位置,再检查目标预先约定的内容特征;仅记录状态码不等于正文核验通过。

2. 使用 HTTP 代理重复请求

curl --disable --noproxy "" --proxy "http://proxy.example:3128" --config "./proxy-auth.conf" --connect-timeout 5 --max-time 15 --output /dev/null --silent --show-error --write-out "target=%{http_code} proxy_connect=%{http_connect} connect_s=%{time_connect} ttfb_s=%{time_starttransfer} total_s=%{time_total}\n" "https://example.com/"; printf "exit=%s\n" "$?"

--noproxy "" 清空本次绕过列表;proxy_connect 记录 HTTP CONNECT 的响应码,适合区分 HTTPS 目标的隧道认证与目标响应。--connect-timeout 限制连接阶段,--max-time 限制本次传输总时长。

上述 HTTP 代理示例的用户名密码认证默认使用 Basic。实际应根据 Proxy-Authenticate 挑战、客户端支持和服务方要求选择认证方式,例如相应的 Digest、NTLM 或 Negotiate 选项;不能仅因填入账号密码就认定认证方案匹配。

3. 明确 SOCKS5 的 DNS 位置

curl --disable --noproxy "" --proxy "socks5h://proxy.example:1080" --config "./proxy-auth.conf" --connect-timeout 5 --max-time 15 --output /dev/null --silent --show-error --write-out "target=%{http_code} connect_s=%{time_connect} ttfb_s=%{time_starttransfer} total_s=%{time_total}\n" "https://example.com/"; printf "exit=%s\n" "$?"

将 socks5h:// 改为 socks5:// 可对照目标域名由代理端或本地解析时的差异。只改变这一项,其余目标、认证和超时保持相同。代理地址自身的解析与其他应用的 DNS 行为仍需分别检查。

Windows PowerShell 的直连示例

curl.exe --disable --noproxy "*" --connect-timeout 5 --max-time 15 --output NUL --silent --show-error --write-out "target=%{http_code} total_s=%{time_total}\n" "https://example.com/"; "exit=$LASTEXITCODE"

Windows 使用 curl.exe 避免命令别名混淆,输出空设备用 NUL,退出码用 $LASTEXITCODE。上面的 Bash 代理示例包含空参数和 printf,应按自己的 PowerShell 版本与原生命令参数传递方式调整,不能直接当作 Windows 脚本。

怎样分层判读结果

观测说明与下一步
exit 非 0 / target=000读取同次错误输出,区分解析、连接、TLS、超时或认证失败;000 不是实际 HTTP 状态码。
proxy_connect=407HTTP 隧道认证未完成,先核对代理挑战与认证配置。
target=401 / 403通常需要核对目标服务的认证或访问策略;不能据此直接判断代理密码错误。
exit=0 / target 符合预期仍需核对响应正文与代理生效证据;curl 默认不会把所有 HTTP 错误状态当成非零退出码。
connect_s / ttfb_s / total_s均以秒为单位。TTFB 与总耗时包含请求链路中的多个阶段,不能直接称为代理自身延迟。

出口应由授权目标或受控回显服务的响应核对。curl 的 remote_ip 是本次连接的远端地址,使用代理时可能指向代理端点,不能直接当作目标看到的出口地址。

保留能比较的记录

保存时间与时区、测试位置、curl 版本、协议、DNS 模式、认证方式(不保存密码)、目标、退出码、目标与 CONNECT 状态、耗时及响应核对结果。连续采样时保留失败记录,不只选最快的一次;采样与统计口径见代理连接质量核验清单。

-v 和响应头可帮助定位,但可能含代理地址、Cookie 或认证信息。共享前先脱敏;不要用关闭证书校验代替修复 TLS 配置。

常见问题

curl 的 socks5 和 socks5h 有什么区别?

socks5:// 由 curl 在客户端解析目标域名;socks5h:// 把目标域名交给代理端解析。差异针对这次 curl 请求,不能推断系统中所有应用的 DNS 路径或匿名性。

HTTP 200 或 curl 退出码 0 能证明代理质量好吗?

不能。退出码 0 表示本次 curl 传输完成,HTTP 200 是响应状态;还需核对代理是否生效、响应内容是否符合预期,并在固定条件下重复统计失败率与耗时分布。

target=000 和 proxy_connect=000 都是错误吗?

target=000 表示未取得可用的 HTTP 响应状态,需要结合退出码和错误输出定位。proxy_connect 只报告 HTTP CONNECT 响应;直连、普通 HTTP 转发或 SOCKS 请求中没有 CONNECT 时,000 不等于代理失败。

为什么 curl 能用而浏览器不能用?

两者可能使用不同的系统代理、PAC、DNS、认证方式或扩展配置。应对照实际端点、协议、绕过规则和目标,而不是仅凭 curl 一次成功判断浏览器配置正确。

核验来源与更新说明

内容与来源复核:2026-10-10。参数行为以所用 curl 版本的官方文档为准;本页提供核验方法,没有发布服务商的实测成绩或效果承诺。