在代理接入应用程序代码之前,值得先用一个可检查的工具来验证它是否正常工作。cURL 和 Postman 是大多数开发者会选择的两个工具,配置正确后两者都能很好地处理代理,但每个工具都有一个设置,一旦遗漏就会产生令人困惑的行为。以下是两者的可用配置、重要的调试标志,以及需要留意的陷阱。
连接细节在各处都是相同的:主机 p.shifter.io,端口 443,以及一个携带定向信息的用户名。格式说明请参见如何连接住宅代理。
cURL
整个配置只需一个标志。
curl -x customer-USERNAME:PASSWORD@p.shifter.io:443 https://ipinfo.io/json
-x 和 --proxy 是同一个东西。运行两次,地址应该会不同,这一步就能同时确认凭据和轮换都正常。
定向信息放在用户名里,因此命令的其他部分不会改变:
# 德国出口
curl -x customer-USERNAME-country-de:PASSWORD@p.shifter.io:443 https://ipinfo.io/json
# 粘性会话,十分钟
curl -x customer-USERNAME-country-de-sid-abc123-ttl-600:PASSWORD@p.shifter.io:443 https://ipinfo.io/json
让凭据不出现在 shell 历史中
把密码直接嵌入 URL 会让它出现在你的历史记录和任何进程列表中。以下是两个更好的选择:
# 单独传递凭据
curl -x p.shifter.io:443 -U customer-USERNAME-country-de:PASSWORD https://ipinfo.io/json
# 或从环境变量读取
export PROXY_USER="customer-USERNAME-country-de"
export PROXY_PASS="..."
curl -x p.shifter.io:443 -U "$PROXY_USER:$PROXY_PASS" https://ipinfo.io/json
请注意 -U 是代理凭据,而 -u 是目标网站的凭据。混淆两者是密码明明正确却出现 407 的常见原因。
值得了解的调试标志
# 查看代理握手过程以及认证是否成功
curl -v -x customer-USERNAME:PASSWORD@p.shifter.io:443 https://ipinfo.io/json
# 耗时分解:延迟究竟花在哪里
curl -o /dev/null -s -w "connect: %{time_connect}s ttfb: %{time_starttransfer}s total: %{time_total}s\n" \
-x customer-USERNAME:PASSWORD@p.shifter.io:443 https://example.com
第二个命令是区分代理连接慢还是目标本身慢的最快方法,这也是为什么请求会超时中的第一个分支点,也是降低延迟的起点。
cURL 中的 SOCKS5,以及那个陷阱
如果你使用 SOCKS5 而不是 HTTP,协议前缀比看起来更重要:
# 会泄露 DNS:由你的机器解析主机名
curl -x socks5://customer-USERNAME:PASSWORD@p.shifter.io:443 https://example.com
# 正确做法:由代理解析
curl -x socks5h://customer-USERNAME:PASSWORD@p.shifter.io:443 https://example.com
那个 h 就是全部的区别,写错的话意味着你的 DNS 查询会从你自己的所在地发出,可能返回区域性错误的结果。详情见防止 DNS 泄露。
一个绝不能带入正式环境的标志
--proxy-insecure 会禁用代理这一跳的证书验证。它偶尔可用于确认某个 TLS 错误是否属于证书问题而非其他原因,但绝不能出现在任何长期使用的配置中。
Postman
Postman 的代理支持很完善,但它是在应用程序设置中配置的,而不是针对单个请求配置,这一点会让期望在请求本身上设置代理的人感到意外。
配置方法
打开 Settings,然后进入 Proxy 标签页。关闭系统代理选项,启用自定义代理配置。将代理服务器设置为 p.shifter.io,端口设置为 443,勾选 HTTP 和 HTTPS,然后启用代理认证,输入你的用户名(包括任何定向标志)和密码。
该配置对整个 Postman 应用是全局生效的,这一点需要牢记:一旦设置,所有集合中的每个请求都会经过该代理,直到你关闭它。如果你同时在测试内部服务,它们也会被路由经过代理,这通常不是你想要的结果。
会破坏一切的那个设置
在 Settings 然后 General 中,有一个 SSL certificate verification 选项。如果你在使用代理时遇到证书错误并关闭了它,请记住你禁用的是 Postman 所有操作的验证,而不仅仅是被代理的请求。之后要记得重新打开。如果你确实遇到证书错误,这一点值得先弄清楚原因,而不是直接关掉验证。
无需重新输入即可切换定向
由于定向信息放在用户名中,更改国家只需编辑一个字段。Postman 变量可以让这变得不那么繁琐:定义一个环境,为代理用户名设置一个变量,然后切换环境即可切换市场。代理设置对话框支持变量语法,因此 customer-USERNAME-country-{{market}} 可以让你通过切换当前环境来更改国家,而不必每次都打开设置。
验证是否生效
向 https://ipinfo.io/json 发送一个 GET 请求并查看响应。它应该显示你所定向国家的地址,而不是你自己的地址。在用户名中不带 sid 的情况下发送两次,地址应该会变化。
如果地址是你自己的,说明代理根本没有生效:检查自定义代理配置是否确实已启用,以及 HTTP 和 HTTPS 是否都已勾选。
Collection Runner
如果要以稍大一些的量级进行测试,Collection Runner 会通过同一个代理配置重复运行一个集合。在各次迭代之间加入延迟,而不要不间断地全速运行,因为一连串相同的请求是让目标最快停止响应的方式,详见速率限制与请求节流。
出现故障时
四种响应几乎涵盖了所有情况,每一种都指向具体的原因。
407 表示凭据被拒绝,或者用户名中的某个标志格式有误,因为一个无法识别的值会让整个用户名无法解析。先测试不带任何标志的裸用户名;如果可行,再逐个加回标志。完整流程见修复 407 错误。
502 表示你的凭据没问题,但当时没有匹配你所设定筛选条件的资源。放宽条件,或者从城市级别降到国家级别。
509 表示套餐带宽已用尽且未启用超额。
连接被拒或挂起 表示你根本没有连接到网关。在怀疑是代理问题之前先检查 nc -vz p.shifter.io 443,并确认你没有指向一个过时的主机地址。
更全面的索引见常见住宅代理错误。
从工具走向代码
一旦两个工具都能正常工作,同样的四个值可以直接迁移到你正在构建的任何程序中,客户端方面的模式见在 Python 中使用住宅代理。有一点不会直接迁移:在应用程序代码中,连接复用意味着通过已有隧道发送的请求会保持相同的出口地址,这看起来就像轮换失效了一样。这个意外情况在IP 不轮换中有详细说明。
总结
在 cURL 中,整套配置就是一个 -x,配合 -U 让凭据不出现在 URL 中,-v 查看握手过程,-w 用来判断延迟究竟来自代理还是目标本身;如果使用 SOCKS5,请使用 socks5h 以便由代理完成 DNS 解析。在 Postman 中,配置位于应用程序设置而非请求本身,因此它会全局生效,直到你手动关闭,而 SSL 验证开关是应用级别的,不是针对单个请求的。在两者中,定向信息都放在用户名里,因此切换国家从不需要更改主机、端口或其他任何内容。在把代理用进代码之前,先在一个可检查的工具中验证它是否正常工作,并按状态码来解读故障。
支撑这一切的网关是住宅代理,在所有国家和会话模式下使用同一个主机和一组凭据,按每 GB计费,因此测试只会消耗它实际用到的带宽成本。