代理返回 407 怎么办

返回 407 Proxy Authentication Required,表示请求在 Node4 这一端就停住了:随请求发来的账号密码缺失、格式不对,或者对当前连接的地址无效。它来自代理,不来自目标网站。绝大多数原因在您的电脑或账号状态上,可按以下顺序排查。本文先给一条最小测试命令,再按出现频率列出原因,最后说明 407 和 403、超时的区别,以及提交工单时需要附什么。

准备工作

  • 能打开 Node4 控制台的“我的代理”页面,看到当前的用户名、密码、代理地址和端口。
  • 电脑上有 curl:Windows 10 和 11 自带 curl.exe,macOS 和 Linux 自带 curl。
  • 知道自己用的是哪种认证:账号密码认证(填用户名和密码)还是 IP 白名单认证(靠来源 IP 放行,一般不填账号密码;各产品的差别见原因三)。两种方式二选一,不叠加。

操作步骤

  1. 先用一条命令复现

    脱离浏览器和脚本,用 curl 直接测一次。把 USERNAME、PASSWORD 换成控制台里的账号密码,HOST、PORT 换成您正在用的代理地址和端口(固定 IP 产品填该 IP 所在行的地址和端口,动态和住宅代理填网关地址和端口):

    curl -v -x http://USERNAME:PASSWORD@HOST:PORT https://api.ipify.org

    Windows 请在 PowerShell 里写 curl.exe 而不是 curl,其余相同。-v 让 curl 打印它实际发出的 Proxy-Authorization 头,这一行经常和您以为发出的不一样。

    结果有三种。打印出一个 IP 地址:账号密码和代理都正常,问题在程序或浏览器传递代理设置的方式,直接看原因五。打印 407:账号密码本身被拒,按原因一到原因四和原因六排查。一直挂着或显示连接被拒绝:不是认证问题,见代理连接失败或超时怎么排查。

  2. 原因一:连接的网关不属于您已购买的产品

    同一组代理账号密码可用于账号下已开通的不同产品,不按产品区分(付费账号还可按套餐限制创建多组,各组可分别管理,见原因六);但连到您没有购买的产品的网关上,返回的 407 和密码错误一模一样。最常见的情况:免费套餐的账号去连动态网关 gw-rotating_datacenter.node4.io 或住宅网关 gw-residential.node4.io。免费套餐是固定的共享数据中心 IP,仅支持 HTTP(S),不包含任何网关,也不包含 SOCKS5。另一种情况是套餐已到期。

    检查:打开控制台“套餐”页面,确认有一个生效中的套餐对应您连接的那个产品;再到“我的代理”页面该产品的标签页重新复制地址和端口,不要用旧配置里的。

  3. 原因二:密码没复制全,或带了看不见的字符

    从网页、聊天软件或 PDF 里复制的值可能带着换行、不换行空格、零宽字符或弯引号,在编辑器里看不出来,但密码已经变了。请回到控制台用复制按钮重新复制,不要在网页上拖选;粘贴后检查前后没有多余空格。

    Node4 生成的用户名和密码只含字母、数字、下划线和连字符,可以原样放进代理地址。如果您把密码放进了 .env 文件,多数解析器会保留值后面的空格,请检查行尾。手动输入一次作对照,能很快确认是不是复制出了问题。

  4. 原因三:白名单里的地址和实际来源 IP 不一致

    用 IP 白名单认证时,没有账号密码可以兜底,请求必须来自白名单里登记的公网 IP。换了办公室、重建了容器、云实例换了弹性 IP、家庭宽带夜里重新拨号,来源 IP 就变了,代理只能返回 407。典型表现:之前几天都正常,某天早上突然失败,代码一行没改。

    检查:在真正跑流量的那台电脑或云实例上查当前公网 IP(直连访问 api.ipify.org),和控制台“账号设置 > 代理认证”里的白名单条目对比。白名单只接受单个 IPv4 地址,不接受 IP 段;一个地址在整个平台上只能加入一个账号。付费套餐默认可添加 3 个,可另购名额;免费套餐 1 个。来源 IP 经常变化的环境,请改用账号密码。

    白名单方式下各产品的写法不同,写错也会 407 或丢参数:固定 IP 产品用户名和密码都留空;动态数据中心代理和不限流量动态代理可以只填用户名、密码留空,这样 -country- 和 -session- 参数照常生效;住宅代理的白名单连接不带用户名,也就没有国家、城市和 session 参数,要指定出口仍需用账号密码。

  5. 原因四:用户名后面的参数写错

    动态和住宅代理在用户名后加 -country-、-session- 等参数。不带参数能通过、带了参数就 407,问题在参数上。住宅网关对参数很严格:键拼错返回 400 并列出可用的键;值不合规(国家代码不是两个字母、城市含大写或分隔符、ASN 带 AS 前缀)返回 407。动态网关则宽松一些,紧跟用户名的键拼错会变成 407,写在国家后面的拼错可能变成 502 或被当成 session 的一部分而不报错。

    检查:去掉所有参数,用裸用户名连一次。能通过,就一对一对地把参数加回去;最先失败的那一对就是问题。完整的参数规则见住宅代理如何指定国家、城市和会话参数。

  6. 原因五:curl 能通,程序或浏览器不通

    这时认证没有问题,是程序没有把您配置的账号密码发出去。

    Python 的 requests:环境变量 HTTPS_PROXY 或 HTTP_PROXY 的优先级高于 session.proxies,CI 或容器里残留的旧代理会替换掉代码里的正确配置。按请求传 proxies= 参数,或在创建 Session 后设置 trust_env = False。Node.js:fetch 和 axios 不像 curl 那样从 URL 里读取代理,axios 的 proxy 选项在不同大版本里行为不同,请用显式的代理 agent,见Node.js 设置代理。无头浏览器:Chromium 的代理命令行参数本身不携带账号密码;Playwright 在 launch 或 context 的 proxy 选项里传入 server、username 和 password(不是给目标网站用的 httpCredentials);Puppeteer 在启动参数里只传代理地址,账号密码在每个页面导航前用 page.authenticate 提供。指纹浏览器:账号密码存在每个环境里,一个环境 407、其他环境正常,就检查那个环境自己的代理字段。

    密码含 @、:、/、#、% 这类字符时(Node4 生成的密码不含,但自定义或来自其他工具的值可能含),放进代理地址前要做 URL 编码,或者用 curl 的 -U 参数单独传账号密码。

  7. 原因六:账号当前无法认证

    以上都正常、所有地方都 407,看账号状态。套餐到期后代理停止认证,不会悄悄继续服务;状态在“套餐”页面。流量(GB)用完后同样返回 407:免费套餐(每月 1 GB)下个月重置;付费的共享、动态数据中心和住宅套餐可以购买流量包立即恢复,否则到续费时恢复。邮箱尚未验证的账号还没有分配代理,这时任何账号密码都会被拒,请先完成邮箱验证,控制台会有横幅提示。

    付费套餐最多可创建 5 组账号密码,某一组被禁用后,用它的程序会 407,其他组不受影响。

407、目标网站 403、超时:三种不同的失败

407 来自代理,意思是“我不认识这组账号密码,或者这个来源 IP”。请求没有离开 Node4,目标网站根本没收到。

403 来自目标网站,意思是“我收到了请求,但拒绝提供内容”。走 HTTPS 时 CONNECT 隧道已经建立成功,是对方在隧道里面拒绝的。它和认证无关,换账号密码没有用;需要考虑的是 IP 类型、请求频率和请求本身的特征,见住宅、独享、共享和动态代理怎么选。同理,目标网站返回 401 是它要求登录自己的账号,与代理无关。住宅代理有一个例外:政府类网站和部分支付、广告类网站不在住宅网络的服务范围内,网关会直接返回 403,响应正文会说明是哪种情况。走普通 HTTP 时,响应为 destination not available on residential proxies:网关识别出了住宅网络自己的拒绝页,原因确定,换国家或重试都没有用,这类网站请用数据中心代理访问。走 HTTPS(CONNECT 隧道)时,响应为 destination refused by the residential network:网关只看到拒绝状态,看不到原因,因此只给出最可能的原因;如果同一时刻其他网站也以同样方式失败,那是住宅网络的临时故障,不是目标网站的问题,请稍后重试。

超时或连接被拒绝,表示请求没有得到任何回应:地址或端口不对、网络拦截了代理端口、或者目标网站没响应。它不是认证问题,见代理连接失败或超时怎么排查。

一个正确的密码也可能短时间内收到 407:网关暂时连不上认证服务,或者同一个来源 IP 短时间内发起的登录次数超过限制。几分钟前还正常、什么都没改就开始失败,先暂停重试,查看状态页,不要急着改配置。

排查清单

1. 用 curl 复现。curl 能通,问题在程序。 2. 确认账号下有对应产品的生效中套餐,地址和端口从该产品的标签页重新复制。 3. 用复制按钮重新复制账号密码;非 Node4 生成的密码含特殊字符时做 URL 编码或用 -U 传递。 4. 白名单方式:在跑流量的机器上查当前公网 IP,和白名单条目对比。 5. 去掉用户名后的参数,用裸用户名试一次。 6. 确认邮箱已验证、套餐未到期、流量(GB)未用完。

以上各项都查过仍然 407,请提交工单。

常见问题

提交工单时要附什么?

带 -v 的 curl 完整输出,但要先处理两处:删掉其中 Proxy-Authorization 那一行(Basic 后面是账号密码的 Base64 编码,任何人都能还原),把命令里的密码换回 PASSWORD。再附上您连接的代理地址和端口、大致的发生时间,以及是账密认证还是白名单认证。永远不要把密码、API 密钥写进工单。

AdsPower 的“检查代理”显示连接测试失败,是 407 吗?

不一定。指纹浏览器把认证失败、连不上代理、端口不对都显示为检查失败。把同一组代理主机、代理端口、代理账号、代理密码放进第 1 步的 curl 命令测一次:返回 407 就按本文排查;挂着或被拒绝,见代理连接失败或超时怎么排查;curl 能通而浏览器不通,检查浏览器里四个字段有没有多余空格,代理类型和端口是否对应。

SOCKS5 没有 407,怎么判断是认证失败?

SOCKS5 没有状态码,密码错误、参数错误、没有可用出口都表现为同一种“不允许”回复,curl 显示为 Can't complete SOCKS5 connection。排查时先用同一个产品的 HTTP 端口试一次,能看到具体的 400、407 或 502,定位后再换回 SOCKS5。免费套餐没有 SOCKS5。

免费账号为什么连住宅网关是 407?

免费套餐是 3 个共享数据中心 IP,仅 HTTP(S),不包含住宅、动态网关和 SOCKS5。账号密码对没有购买的产品无效,返回 407 与密码错误一样。要测住宅代理,需要购买住宅套餐。

把 API 密钥当代理密码用,会怎样?

返回 407。以 n4k_ 开头的 API 密钥只用于管理 API,代理不会查它;反过来把代理账号密码放进 API 的 Authorization 头会返回 401。两套密钥用途不同,见管理 API 入门。

密码正确,为什么突然所有请求都 407?

先看“套餐”页面:套餐是否到期、本次续费是否未付款(状态显示“逾期未付”时代理已停止认证,付款后恢复)、流量(GB)是否用完。再看状态页有没有异常。都正常的话暂停几分钟再试,同一来源 IP 短时间内大量失败的登录会被暂时限制。