基础概念 · curl 代理测试

curl 代理测试:从本机端口到网站响应

客户端显示已连接,浏览器却打不开网页时,可以先用 curl 发一条明确经过本机代理入口的请求。把入口、目标和超时写在命令里,比同时更换节点、DNS 和模式更容易定位问题。

全部概念工具使用教程引用资料

先确认本机入口的协议和端口

打开客户端的端口设置,记下 HTTP、SOCKS 或混合端口。图形客户端的本地入口与远端节点地址是两件事:curl 在这里连接的是本机客户端,不是订阅中的服务器。

下面统一用 127.0.0.1:2080 举例,2080 不是所有客户端的默认端口。混合入口通常同时接收 HTTP 和 SOCKS;如果客户端提供两个独立端口,就分别替换。

示例代码
curl --version

Windows PowerShell 中建议写 curl.exe,避免旧版环境中的 curl 别名调用另一个程序。测试前启动客户端、启用配置,并确认当前策略组已经选择出站。

通过 HTTP 入口请求一个 HTTPS 网站

示例代码
curl --noproxy example.invalid --proxy http://127.0.0.1:2080 --verbose --head --connect-timeout 5 --max-time 20 https://example.com

在 Windows 中把开头的 curl 换成 curl.exe。--proxy 指定入口;--noproxy example.invalid 用一个不匹配目标的保留示例域名覆盖既有排除设置,避免环境里的 NO_PROXY 让这次请求绕过入口。

访问 HTTPS 网站时,代理 URL 仍可以是 http://。curl 先向 HTTP 入口请求 CONNECT 隧道,再与目标网站做 TLS 握手。前缀描述的是入口协议,不是目标网站协议。

--head 只请求响应头,--verbose 展示连接过程。连接阶段最多等 5 秒,整次请求最多等 20 秒;连接超时的范围还包括相关解析与握手,不能把它理解成只限制 TCP。

再用 SOCKS 入口做对照

示例代码
curl --noproxy example.invalid --proxy socks5h://127.0.0.1:2080 --verbose --head --connect-timeout 5 --max-time 20 https://example.com

socks5h:// 把目标域名交给 SOCKS 入口处理;socks5:// 则由 curl 先在本机解析目标,再提交 IP。这里的 SOCKS 入口通常就在本机,后续 DNS 怎样处理仍由客户端配置决定。

如果 HTTP 测试成功而 SOCKS 失败,先看两个协议是否用了正确端口、是否要求认证,再判断是否与域名解析有关。向纯 HTTP 端口发送 SOCKS 握手,本来就不会得到正常回应。

把入口、隧道和网站响应分开看

把入口、隧道和网站响应分开看
输出所在阶段说明什么下一步看哪里
连到 127.0.0.1本机入口接受了连接继续看代理握手和目标连接
CONNECT 返回成功HTTP 入口同意建立隧道检查随后是否完成 TLS
出现目标的 HTTP 状态目标服务已经返回响应按状态码、权限和内容排查

CONNECT 阶段的 200 不是网站已经打开的证据。目标随后仍可能出现证书错误、超时或 403。同样,收到网站错误页,通常已经比“连不上本机端口”更接近问题所在。

命令结束后立刻查看退出码。Bash、zsh 使用:

示例代码
echo $?

PowerShell 使用:

示例代码
$LASTEXITCODE

不加 --fail 时,curl 收到 403 等 HTTP 错误响应也可能以 0 退出。退出码 0 说明这次传输按 curl 的规则完成,并不保证内容可用。少数网站拒绝 HEAD;遇到 405 时移除 --head,用 GET 对照。

curl 先连接本机入口,再进行代理握手,随后完成目标 TLS 与 HTTP 响应;每个阶段成功都不能代替下一阶段的检查。
按最后一个成功阶段缩小范围。CONNECT 成功后,仍需完成目标 TLS 和 HTTP 请求。

几类常见失败怎样处理

  • 连接本机端口被拒绝:确认客户端在运行、端口写对、监听地址包含 127.0.0.1。此时先不用更换远端节点。
  • HTTP 入口返回 407:检查代理认证。临时测试可使用 curl 的代理认证选项,避免把口令写进会同步或公开的脚本。
  • SOCKS 握手失败:核对端口协议、认证方式,再看客户端日志中的失败原因。
  • TLS 或证书校验失败:检查系统时间、目标域名与证书链,不要把加上 --insecure 当成修好连接。
  • 整次请求超时:回看最后一个成功阶段,并对照客户端的规则、出站与错误记录。

详细输出可能包含目标网址、代理认证信息或其他请求头。向别人提供日志前删掉令牌、账号和不必要的私人域名。

对照直连与代理,保持目标不变

示例代码
curl --noproxy "*" --verbose --head --connect-timeout 5 --max-time 20 https://example.com

这条命令关闭 curl 使用的显式代理,但不会绕过系统路由或 TUN 接管。需要做真正的路径对照时,先记录客户端当前接管范围,再看连接日志里这条请求实际走了哪个出站。

保持域名、时间和请求方法一致,一次只改入口或出站。curl 成功后,再检查浏览器是否用了同一个入口、是否有独立代理设置;其他应用也需要各自验证。

常见问题

curl 成功,为什么浏览器仍打不开?

浏览器可能使用独立代理、PAC、不同 DNS 或已有连接。先核对它实际使用的入口,再看客户端是否出现对应请求,不能把一次 curl 成功推广到所有应用。

能用这条命令证明节点速度吗?

不能。这里检查一条请求的连接过程和响应,不是带宽测试。速度比较还需要固定测试目标、数据量、并发与测量方法。

参考资料

原理和协议定义可查以下标准与官方文档。文中的流程图由 AFQKit 绘制。

HTTP与SOCKS5 →HTTP 代理与 SOCKS5:端口、DNS 和 CONNECT终端代理环境变量 →终端代理怎么设置:环境变量与 NO_PROXYDNS、TCP、TLS、HTTP 分层排查 →网站打不开怎么查:DNS、TCP、TLS 到 HTTP

返回基础概念 · 按症状排查问题