调合作方接口,对方要 IP 白名单。办公室宽带是动态 IP,昨天还能通,今天直接 403 Forbidden,对方日志里写着来源 IP 不在名单内。

先分清需求:要固定出口过白名单,要隐藏来源做采集,还是要跨地域访问。三个目标对应的方案完全不同,混着做只会更乱。

白名单要的是固定出口,不是代理池

正解是云上 NAT 网关绑弹性 IP,或者找一台小机器做 SNAT:iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE,再把这台的公网 IP 报给对方。出口固定,排查也简单。代理池每次请求换 IP,白名单永远对不上。

代理的三种形态

  • HTTP 代理:curl -x http://user:pwd@1.2.3.4:8080,HTTPS 走 CONNECT 隧道
  • SOCKS5:ssh -D 1080 临时开一个,适合调试,不适合长期跑
  • 隧道代理:服务商给一个入口,后端自动轮换出口 IP,按流量计费

Python 里 requests 用 proxies={'https': 'http://1.2.3.4:8080'},注意 key 是 https 时值也要写 http 开头,代理地址跟目标协议无关。环境变量 HTTP_PROXY 一设就全局生效,requests 的 trust_env 默认开着,本地调试记得配 NO_PROXY。

报错对照

407 是代理要认证,用户名密码错了或者没带;403 多半是目标站拒绝你的出口 IP;502 是代理连不上目标;curl 报 CONNECT tunnel failed,说明代理不支持 CONNECT。先分清是代理的问题还是目标的问题,别一上来就换服务商。

几个现实约束

代理轮换会让登录态、验证码、风控全部重来,带 Cookie 的会话必须固定出口。免费代理会记录你发出去的 token,HTTPS 虽然加密,请求头和域名仍然暴露。用代理绕过地域限制,还可能直接违反对方服务条款。

白名单场景,一个固定弹性 IP 最省事;采集场景再考虑代理池,前提是做好失败重试和限速。