跳到主要内容
NextProxyNextProxy文档

cURL

用 curl 验证代理、调试参数和读取计时数据的完整命令参考。

curl 是排错时最有用的工具——它不隐藏任何行为,看到什么就是什么。接入其他语言之前,先用 curl 把参数调通。

基本形式

shell
curl -x 'http://USERNAME-country-US:PASSWORD@GATEWAY_HOST:58971' https://api.ipify.org

各种协议写法

shell
# HTTP 代理,访问 HTTPS 站点(走 CONNECT 隧道)
curl -x 'http://USER:PASS@GATEWAY_HOST:58971' https://example.com

# HTTP 代理,访问 HTTP 站点(走 forward 模式)
curl -x 'http://USER:PASS@GATEWAY_HOST:58971' http://example.com

# SOCKS5,域名由代理解析(推荐)
curl -x 'socks5h://USER:PASS@GATEWAY_HOST:58971' https://example.com

# SOCKS5,域名本地解析(会暴露本地 DNS)
curl -x 'socks5://USER:PASS@GATEWAY_HOST:58971' https://example.com

凭据分开写

不想把凭据塞进 URL 时用 -U

shell
curl -x 'http://GATEWAY_HOST:58971' \
  -U 'USERNAME-country-US-session-job1-time-30:PASSWORD' \
  https://api.ipify.org

或者从环境变量读,避免出现在 shell history 里:

shell
export NP_USER='USERNAME'
export NP_PASS='PASSWORD'
export NP_GW='GATEWAY_HOST:58971'

curl -x "http://${NP_USER}-country-US:${NP_PASS}@${NP_GW}" https://api.ipify.org

用函数简化参数拼接

调参数时反复手写整条 URL 很容易出错。用一个 shell 函数:

shell
# 用法:np -country-US-session-a1-time-10 https://api.ipify.org
np() {
  local suffix="$1"; shift
  curl -x "http://${NP_USER}${suffix}:${NP_PASS}@${NP_GW}" "$@"
}

np '-country-US' https://api.ipify.org
np '-country-DE-session-de1-time-15' https://ipinfo.io/json
np '' https://api.ipify.org   # 不带任何参数

看清时间花在哪

shell
curl -s -o /dev/null \
  -x 'http://USER-country-US:PASS@GATEWAY_HOST:58971' \
  -w 'dns=%{time_namelookup}s connect=%{time_connect}s tls=%{time_appconnect}s ttfb=%{time_starttransfer}s total=%{time_total}s\n' \
  https://example.com

怎么读这几个值:

字段大了说明
time_namelookup你解析网关域名慢,跟代理无关
time_connect你到网关这一段的网络问题,换更近的节点
time_appconnectTLS 握手慢,通常是出口到目标站这段
time_starttransfer目标站自己在生成响应

看完整的协议交互

-v 能看到代理协商过程:

shell
curl -v -x 'http://USER-country-US:PASS@GATEWAY_HOST:58971' https://api.ipify.org 2>&1 | head -40

关键几行长这样:

text
* CONNECT tunnel: HTTP/1.1 negotiated
> CONNECT api.ipify.org:443 HTTP/1.1
> Proxy-Authorization: Basic dXNlcjpwYXNz
< HTTP/1.1 200 Connection Established
* CONNECT phase completed
* TLSv1.3 (OUT), TLS handshake, Client hello (1):

看到 200 Connection Established 说明代理这一侧全部通了,后面出问题就是目标站的事。

常见错误对应关系

shell
# 407:没带凭据、Basic 格式/Base64 有问题,或账号密码不匹配
curl -v -x 'http://GATEWAY_HOST:58971' https://api.ipify.org

# 400 invalid_proxy_parameters:用户名参数格式错误
curl -v -x 'http://USER-country-us:PASS@GATEWAY_HOST:58971' https://api.ipify.org
#                              ^^ 小写 → 400

# 503 service_unavailable:参数合法但当前选不出线路
curl -v -x 'http://USER-country-ZZ:PASS@GATEWAY_HOST:58971' https://api.ipify.org
#                              ^^ 格式合法但没有可用线路 → 503

完整对照见 错误码对照

强制新连接以换 IP

curl 每次调用都是新进程新连接,所以循环调用天然会重新选路:

shell
for _ in $(seq 1 5); do
  curl -s -x 'http://USER-country-US:PASS@GATEWAY_HOST:58971' https://api.ipify.org
  echo
done

但如果你在一条 curl 命令里请求多个 URL,curl 会复用连接,出口是同一个:

shell
# 这两个请求走同一条隧道,同一个 IP
curl -s -x 'http://USER-country-US:PASS@GATEWAY_HOST:58971' \
  https://api.ipify.org https://api.ipify.org

免密端口

提取接口拿到的端口不需要凭据:

shell
curl -x http://1.2.3.4:20001 https://api.ipify.org

下载大文件

shell
curl -x 'http://USER-country-US-session-dl1-time-120:PASS@GATEWAY_HOST:58971' \
  --retry 3 --retry-delay 2 \
  -C - -o dataset.tar.gz \
  https://example.com/dataset.tar.gz
  • -C - 断点续传,连接中断后重跑能接着下
  • session 让重试落在同一个出口,很多站点对续传请求会校验 IP
  • time-120 是上限,长下载建议给足

超时配置

网关侧的相关超时:首字节 5 秒、完整握手 10 秒、出口 TCP 建连 8 秒、出口握手 30 秒、空闲 5 分钟、单连接最长 24 小时。

客户端侧配得比网关略宽一点,这样超时的责任归属更清楚:

shell
curl -x 'http://USER-country-US:PASS@GATEWAY_HOST:58971' \
  --connect-timeout 15 \
  --max-time 120 \
  https://example.com

完整超时清单见 限额与配额

不要用 --proxy-insecure

网关不做 TLS 入站,代理这一段本来就没有 TLS,--proxy-insecure 在这里没有意义。

如果你看到 TLS 相关的证书错误,那是目标站的证书问题,不是代理的。用 -k 跳过校验只应该在明确知道原因时用于临时排查。

这篇解决你的问题了吗?