动态代理 IP 不变怎么办

每次新建连接(CONNECT 隧道)分配一个出口 IP,同一连接内 IP 不变;需要固定时用 -session-<id> 参数。这句话说的是 HTTPS 隧道和 SOCKS5 连接,也解释了“IP 不变”的绝大多数情况:IP 没变,是因为连接没变;IP 变了,是因为新建了连接。普通 HTTP 请求(http:// 目标)是例外,网关逐次选择出口。本文说明网关对 HTTPS、普通 HTTP 和 SOCKS5 分别怎么分配出口,怎么让网关重新选择出口,怎么用 session 参数尽量固定出口以及它的真实上限,分到的出口为什么可能重复,最后是不限流量动态代理达到并发上限时网关的实际回应。

准备工作

  • 账号下有生效中的动态数据中心代理(网关 gw-rotating_datacenter.node4.io)、不限流量动态代理(网关 gw-rotating_unmetered.node4.io)或住宅代理(网关 gw-residential.node4.io)套餐。免费套餐是固定 IP,不涉及本文内容。
  • 知道自己的程序是否复用连接:requests.Session、Node.js 的 agent、浏览器、连接池、长连接(keep-alive)都会复用。
  • 一个查出口 IP 的地址,例如 https://api.ipify.org,用来观察每次请求从哪个 IP 发出。

操作步骤

  1. 出口按连接分配:HTTPS、HTTP、SOCKS5 的区别

    HTTPS 目标:客户端先向网关发 CONNECT 建隧道,网关在这一刻选一个出口,隧道存活期间所有请求都从这个出口发出。一个隧道只有一个出口,不论里面跑了多少请求。

    普通 HTTP 目标:没有隧道,网关逐个请求转发,各自单独选出口;同一个 TCP 连接上连续发多个 HTTP 请求,各自都可能是不同的出口。

    SOCKS5:每个 SOCKS5 连接选一个出口,连接存活期间不变,和 HTTPS 隧道的行为一致。

    所以“IP 不变”几乎总是连接复用:使用 requests.Session、长连接(keep-alive)或连接池时,同一个连接会复用同一个出口 IP;要换 IP 就新建连接(或关闭 keep-alive)。HTTPS 每个 CONNECT 隧道一个出口 IP。浏览器同样会复用连接,刷新页面 IP 可能变也可能不变,都是正常的。

  2. 怎么让网关重新选择出口

    新建连接就行。curl 每条命令是一次新连接,连续跑两条通常得到两个不同的 IP,偶尔相同(见第 4 步);一条 curl 命令里写多个 URL 则复用一个隧道,要每个 URL 一条命令。Python 里不用 Session,或者每个任务一个新 Session;Node.js 里不复用 agent,或者关闭 keepAlive。

    代价是每次都要重复进行 TCP 握手、CONNECT 往返和 TLS 握手,这是每次新建连接的固有开销,不是故障。多数任务不需要每次都换:让一个隧道承载一批请求,批与批之间换连接,既省握手又分散了来源。

    按状态码重试时要注意:Python 的 Retry 适配器和 got 的重试都走原来的连接,也就是原来的出口;要换出口重试,用一个新连接。

  3. 主动固定出口:-session- 参数

    反过来,一个任务需要始终从同一个出口发出(登录、购物车、多步表单、分页抓取),在用户名后加 -session-<id>,密码不变。id 是您自己取的一串字母和数字;带同一个 id 的连接在保持期内解析到同一个出口,不同 id 各自分配。它固定的是出口,不是连接:并发的多个连接、访问不同网站、断线重连,各自仍是独立的连接,只是都解析到这个出口。不需要创建或销毁什么,id 本身就是句柄。动态数据中心代理和不限流量动态代理的接入信息区域有“会话保持”开关,打开后自动生成 id 并拼好用户名,“新会话”换一个 id。

    保持多久因产品而异。动态数据中心代理和不限流量动态代理:一个 id 最长保持 30 分钟,从首次分配开始计算,中途有请求也不延长,超过的任务应换新 id 继续。住宅代理:尽量保持,最长 30 分钟,没有最短保证;出口是家庭设备,掉线时会提前结束,而且在上限到期前这个 id 不会换到别的设备上,连续失败就换新 id,不要等。

    id 只在您的账号内有效,和其他客户的同名 id 无关。它可以和地区参数组合:USERNAME-country-us-session-shop01 固定一个美国出口。住宅代理的完整参数见住宅代理如何指定国家、城市和会话参数。

    字段填写内容
    写法USERNAME-session-task81f3,密码不变;连续两次 curl -x "http://USERNAME-session-task81f3:PASSWORD@gw-residential.node4.io:8082" https://api.ipify.org 应打印同一个 IP
    动态数据中心 / 不限流量最长 30 分钟,从首次分配起算,不因活动延长
    住宅尽量保持,最长 30 分钟,设备掉线会提前结束
    换出口换一个新的 id;重试同一任务时沿用原 id,出口本身出问题时在 id 后加尝试次数
  4. 出口可能重复

    “换 IP”指的是重新从 IP 池里选一个,不是保证和上一个不同。新建连接或换一个 session id 后,分到的出口有可能和之前的相同,尤其在指定了国家、池子较小的时候。程序里不要以“IP 一定变了”为前提写逻辑;需要确认时查一次出口 IP。

    地区参数:动态数据中心代理和不限流量动态代理只支持 -country-xx,出口在美国、意大利和西班牙,没有出口的国家返回 502 而不是换一个国家。住宅代理支持国家/地区、州、城市、ASN。

  5. session 该用多久,怎么分配

    按任务取 id,不按天:任务开始生成一个新 id,任务内所有请求都用它,任务结束就丢掉。一次结算需要几分钟,抓一个账号的后台可能需要十几分钟。

    一个 id 给所有任务共用效果不好:住宅出口随时可能变,持有越久越可能在任务中途变掉;一整天的流量都从一个出口发出,重新制造了 IP 池本来要消除的单点瓶颈;任务之间互相牵连,一个任务给出口带来的影响其他任务一起承受。

    一个 id 只给一个工作进程。两个进程共用一个 id 会把两组互不相关的请求混在一个出口上。任务系统里用任务号派生 id(例如 job4182),重试就自然沿用同一个身份;出口本身坏了导致的重试则在 id 后面加尝试次数(job4182a2),换成新身份。会话到期后不要从中途续,重新从第一步开始跑这个任务。

不限流量动态代理的并发上限

不限流量动态代理按并发连接数计费:套餐上的数字是账号下同一时刻能通过网关保持的连接数,不计流量,也不是 IP 数量。每个连接从共享的 IP 池里取一个出口,出口可能重复。连接用满后,下一个连接被拒绝,已经打开的连接照常工作;关掉一些连接、降低工具的并发数或增加规格后,拒绝就停止。

网关的实际回应:HTTP 下在选出口之前就回 429 Too Many Requests,并带响应头 X-Node4-Conn-Limit,值说明已达上限和套餐允许的连接数;响应体用文字重复同样的意思。这个头是区分“网关拒绝”和“目标网站限流”的办法:目标网站的 429 没有 Node4 的响应头。SOCKS5 下没有状态码,返回 0x02(connection not allowed by ruleset),和密码错误是同一个代码,要靠控制台的实时连接面板判断是哪一种。立刻重试没有用,每次重试都是对已满额度的又一次尝试,还会增加“被拒绝”的计数。

什么算一个连接:HTTPS 的 CONNECT 隧道在整个存活期间占一个名额,包括空闲等待的时间;普通 HTTP 请求在传输期间占一个名额;SOCKS5 连接在整个存活期间占一个名额。一个长连接上的许多请求只占一个名额、共用一个出口;一个开着不用的空闲隧道同样占着名额,连接池很大的客户端可能几乎没在发请求却一直顶在上限。上限属于账号:所有账号密码、所有来源 IP、两种协议共用一个额度;全部网关节点统一计数,分散到多个节点不会增加容量;白名单方式的连接同样计数;同一账号下两个不限流量套餐额度相加。进程被杀掉、连接没有正常关闭时,名额会在短暂的宽限期后自动释放。

自己验证一次

用 curl 连续跑两条相同的命令,走动态网关,每条打印一个出口 IP:通常不同,偶尔相同,都正常。再在用户名后加同一个 -session-<id> 跑两条:应打印同一个 IP。然后把同一个代理地址放进带 Session 的 Python 脚本连发十次:十次相同,因为是一个隧道。

HTTPS 下看不到网关的响应头,因为隧道建立后的内容是加密的。要看 X-Node4-Conn-Limit 或 X-Node4-Country 这类响应头,用 curl -v 请求一个 http:// 的地址,或者在隧道建立失败(429、502)时看 CONNECT 的响应。

常见问题

我用的是动态代理,为什么几百个请求 IP 都一样?

程序在复用连接。requests.Session、Node.js 的 agent、浏览器都会复用同一个 HTTPS 隧道,隧道内 IP 不变。要让网关重新选择出口,就每次新建连接,重新选择后仍可能分到之前的 IP;或者接受这个行为,按批换连接。

加了 -session- 参数,IP 还是变了?

先看是否超过保持时长:动态数据中心和不限流量动态代理最长 30 分钟,住宅代理最长 30 分钟,从首次分配起算,中途有请求也不延长。住宅出口掉线也会提前结束。再确认每次连接带的 id 完全相同,并且地区参数没有变。需要几天不变的 IP,请用独享数据中心代理。

两个不同的 session id 分到了同一个 IP,是不是坏了?

不是。不同 id 各自从 IP 池里选,不保证不同。指定了国家、池子较小时重复更常见。

不限流量动态代理突然大量失败,工具报 429 或超时?

多半到了并发上限。看响应里有没有 X-Node4-Conn-Limit 头,有就是网关拒绝的新连接,已有连接不受影响;到控制台实时连接面板看当前打开数和被拒绝数。把工具并发降到上限以内、关闭空闲连接,或增加规格。没有这个头的 429 来自目标网站,是对方在限流。

我的程序已经停了,面板上为什么还有打开的连接?

连接没有正常关闭时,名额会在一段短暂的宽限期后自动释放,稍等再看。如果程序停止后面板长时间显示连接打开,请提交工单并附上发生时间。

指定国家后返回 502?

动态网关对没有出口的国家返回 502,不会换一个国家代替。动态数据中心代理和不限流量动态代理的出口只在美国、意大利和西班牙,只支持 -country-xx;更细的定位要用住宅代理。参数拼写也要核对:国家后面键拼错会被当成国家代码的一部分,同样返回 502。