先确认本机入口的协议和端口
打开客户端的端口设置,记下 HTTP、SOCKS 或混合端口。图形客户端的本地入口与远端节点地址是两件事:curl 在这里连接的是本机客户端,不是订阅中的服务器。
下面统一用 127.0.0.1:2080 举例,2080 不是所有客户端的默认端口。混合入口通常同时接收 HTTP 和 SOCKS;如果客户端提供两个独立端口,就分别替换。
curl --versionWindows 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.comsocks5h:// 把目标域名交给 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 对照。
几类常见失败怎样处理
- 连接本机端口被拒绝:确认客户端在运行、端口写对、监听地址包含 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 绘制。