配置 API 白名单时,应该提交的不是服务器的 192.168.x.x 内网地址,也不一定是云平台控制台里看到的实例地址,而是请求最终到达合作方 API 时,对方实际看到的固定公网出口 IP。如果应用使用动态公网地址、云服务默认出口或轮换代理,代码即使没有变化,来源 IP 也可能改变,白名单就会间歇性失效。

真正需要确认的是一条完整链路:应用从哪里发出请求、经过哪个 NAT 或代理、合作方最终看到哪个公网地址。只有这个最终出口稳定下来,白名单才不会因为实例变化或线路切换反复失效。本文讨论的是“第三方 API 对你的出口 IP 放行”,不是“在代理服务商后台把自己的公网 IP 加入认证白名单”。

文章目录

  1. API 白名单中的正确来源 IP
  2. 固定出口请求链路
  3. 固定出口方案对比
  4. 固定出口与白名单配置流程
  5. 固定出口验收:以合作方日志为准
  6. 主备出口与 IP 迁移
  7. 白名单失败定位
  8. 固定出口 IP 与 API 白名单常见问题

一、API 白名单中的正确来源 IP

“IP 白名单”至少有三种不同语境。填错位置时,最常见的表现就是:页面显示保存成功,但程序依然收到拒绝访问。

白名单设置在哪里 通常应该填写什么 它在控制什么
代理服务商控制台 连接代理前,服务器当前使用的公网来源 IP 允许这台服务器连接代理网关,可替代或补充账号密码认证
第三方 API、SaaS 或合作方防火墙 请求经过代理或 NAT 后的固定公网出口 IP 决定合作方是否接受这条外部请求
企业内网或私有网络 双方约定的内网地址段、专线地址或 VPN 网段 控制私有网络内部访问,不等同于公网 API 白名单

本文处理第二种情况。假设业务服务器先连接固定代理,再访问合作方 API,那么合作方需要加入白名单的是代理出口 IP,而不是业务服务器连接代理之前的公网 IP,也不是代理网关的域名。

如果还分不清本地地址、公网地址和代理出口,可以先查看 本地 IP 与公网 IP 的区别。API 白名单只是一层来源限制,不能代替 API Key、OAuth、TLS 或业务权限控制。

二、固定出口请求链路

固定出口的目标不是“给每台服务器都配一个公网 IP”,而是让一组应用实例经过同一个可预测的出站节点。目标 API 最终只看到这个出口节点的公网地址,内部实例扩容、重启或更换私网地址时,白名单不需要跟着变化。

这也是云平台专门提供固定出站能力的原因。AWS 的静态出口架构通过 VPC、NAT Gateway 和 Elastic IP 让 Lambda 以固定地址访问外部系统;Google Cloud Run 官方文档也说明,默认动态地址池不适合需要 IP 防火墙的外部 API,需要通过 VPC egress 与 Cloud NAT 配置静态出口。

AWS Lambda通过VPC和NAT Gateway使用Elastic IP获得固定出站IP的官方架构图
官方示例:AWS 通过 VPC、NAT Gateway 与 Elastic IP 为 Lambda 提供可预测的静态出站地址。图片来源:AWS Prescriptive Guidance

实际项目里,出口不固定通常来自以下几种情况:

  • 云函数、Serverless 或托管应用默认使用一组动态出站地址;
  • 多台服务器分别直连互联网,每台机器使用不同公网 IP;
  • 程序使用了动态住宅代理或轮换代理池,每个请求可能更换出口;
  • 部分请求走代理,部分请求因为环境变量、分流规则或 IPv6 路径而直连;
  • 主机迁移或重建后,原来的临时公网地址被释放。

三、固定出口方案对比

固定出口没有一种方案适合所有团队。主要看应用运行在哪里、是否能改网络架构、谁负责运维,以及目标系统是否只关心固定地址。

方案 接入方式 主要优势 适合情况
云平台 NAT Gateway 子网流量统一经过绑定静态公网地址的 NAT 与云网络深度集成,可统一管理一组实例 应用全部运行在同一云平台,团队能维护 VPC、路由和 NAT
独享数据中心代理 应用通过 HTTP 或 SOCKS5 代理访问目标 API 无需重建整套云网络,出口固定且资源独享 多云、混合部署、第三方自动化工具或希望快速接入固定出口
自建 VPS 出口代理 在固定公网服务器上部署代理或转发服务 配置和日志完全自控 具备网络、安全、补丁和高可用运维能力的技术团队
静态 ISP 代理 应用通过固定 ISP 网络出口访问外部服务 固定地址同时保留 ISP 网络属性 合作方除白名单外,还明确要求特定 ISP 或住宅网络属性

如果目标系统只要求“来源地址长期不变”,通常先比较云 NAT、独享数据中心代理和自建出口即可,不必为了 API 白名单额外购买住宅属性。对于不方便改造 VPC、但应用支持标准 HTTP 或 SOCKS5 代理的团队,IPWeb 的 独享数据中心代理可以作为固定专属出口使用,产品页也明确面向系统接口对接、API 调用和固定网络出口场景。

动态住宅代理和动态数据中心代理适合轮换访问,不适合只允许一两个固定地址的严格白名单。选型前还要确认并发、带宽和任务规模;大规模采集项目可参考 代理流量、并发与容量估算方法

四、固定出口与白名单配置流程

第一步:列出所有会发起请求的运行环境

先确认生产服务器、定时任务、容器、Serverless 函数、CI/CD Runner 和运维脚本是否都会访问目标 API。只给主服务器配置代理,而遗漏后台任务或备用实例,最终会出现“同一套代码有时成功、有时 403”的情况。

第二步:确认出口资源不会自动轮换

获取固定出口后,向服务商或内部网络团队确认以下信息:

  • 公网出口是否独享,服务周期内是否保持不变;
  • 是否存在多个备用出口,以及目标系统是否需要全部加入白名单;
  • 使用 HTTP、HTTPS CONNECT 还是 SOCKS5 接入;
  • 是否限制并发连接、端口、带宽或目标地址;
  • IPv4 与 IPv6 是否走同一套出口策略;
  • 更换、续费和故障切换时,旧 IP 能保留多久。

第三步:只让需要的进程使用固定出口

测试时不要先修改整台服务器的全局网络。可以先给目标应用单独配置代理环境变量或代码参数,确认调用链路正常后再决定是否扩大范围。下面示例使用环境变量保存代理地址,代码中不写死真实凭据。

# PowerShell:示例地址需替换为实际代理信息
$env:FIXED_EGRESS_PROXY = "http://proxy-user:proxy-password@proxy.example.com:3128"

# 查询经过代理后的公网出口
curl.exe --proxy $env:FIXED_EGRESS_PROXY "https://api.ipify.org?format=json"
import os
import requests

proxy_url = os.environ["FIXED_EGRESS_PROXY"]
proxies = {
    "http": proxy_url,
    "https": proxy_url,
}

response = requests.get(
    "https://api.ipify.org?format=json",
    proxies=proxies,
    timeout=15,
)
response.raise_for_status()
print(response.json())

正常情况下会返回当前请求经过固定出口后的公网地址,例如:

{"ip":"203.0.113.25"}

这里返回的地址还不是最终验收结论。应把它与合作方访问日志中的来源 IP 对照;两边一致,且从真实生产进程重复请求后仍保持不变,才说明白名单使用的是正确出口。

示例中的用户名、密码和代理地址都不能直接提交到 Git 仓库,也不应出现在公开日志、截图和错误上报中。可参考 OWASP Secrets Management 指南,将代理凭据放入受控的密钥管理系统,并建立轮换、撤销和访问审计流程。

第四步:提交白名单并保留变更记录

确认出口后,把固定公网地址提交给目标 API 管理方。记录申请时间、IP、环境、负责人、目标系统和变更单号。如果目标方支持 CIDR,应只提交实际分配给你的最小地址范围,不要为了省事开放过大的网段。

第五步:从真实运行环境发起业务请求

不要只用个人电脑执行一次 curl 就宣布完成。必须从生产应用实际运行的位置调用目标 API,并让合作方日志确认看到的来源地址与提交值一致。

五、固定出口验收:以合作方日志为准

固定出口验证的重点不是“成功过一次”,而是不同实例、不同时间和重启之后仍然一致。建议按下面的验收表逐项确认。

验证项目 怎么测 通过标准
单实例重复请求 连续多次查询公网出口,再调用目标 API 出口地址保持一致,业务请求正常
多实例一致性 从每台服务器、容器副本和定时任务分别测试 所有需要放行的请求只来自已登记地址
重启与发布 重启进程或完成一次灰度发布后复测 实例变化不影响公网出口
直连旁路 检查应用日志、代理日志和目标方访问日志 没有请求绕过代理或 NAT 使用其他地址
IPv4 与 IPv6 确认解析结果、连接协议和实际来源地址 两种协议均符合既定出口和白名单策略
故障切换 在测试窗口切换至备用出口 备用地址已被放行,切换后请求可恢复

如果多个 IP 查询页面结果不一致,应优先让目标 API 的访问日志作为验收依据,因为真正执行白名单判断的是目标系统。第三方查询网站适合前置检查,不能代替合作方的最终确认。

六、主备出口与 IP 迁移

只有一个固定出口时,白名单管理简单,但出口故障会直接影响业务。生产环境通常应准备主、备两个可预测地址,并提前让合作方放行;如果使用带多个公网地址的 NAT,也必须把可能出现的地址全部登记。Azure NAT Gateway 官方说明指出,当 NAT Gateway 关联多个公网 IP 时,新建出站连接可能使用其中任意一个,因此不能只提交其中一个地址。

迁移前后都应保留“本地出口查询结果”和“合作方日志来源 IP”两份证据。下面只演示核对方式,不代表真实生产数据:

核对位置 示例结果 判断
生产进程查询公网出口 203.0.113.25 确认应用实际经过新固定出口
合作方访问日志 source_ip=203.0.113.25 与本地结果一致后,才可确认白名单命中正确来源

一次稳妥的更换流程应按以下顺序进行:

  1. 申请新固定出口,但暂时保留旧出口;
  2. 让合作方先把新 IP 加入白名单;
  3. 从测试任务经过新出口调用真实 API;
  4. 逐步把生产流量切换到新出口;
  5. 观察目标方日志、错误率和延迟;
  6. 确认所有任务都不再使用旧 IP 后,再申请删除旧白名单。

不要先释放旧 IP,再等待合作方处理新白名单。涉及多个外部系统时,还应维护“出口 IP—目标系统—联系人—生效状态”清单,否则很容易漏掉低频定时任务。

七、白名单失败定位

现象 更可能发生在哪一层 优先检查什么
407 Proxy Authentication Required 应用连接代理时被拒绝 代理用户名、密码、来源白名单和认证方式
目标 API 返回 403 Forbidden 目标侧访问控制层、API 网关、WAF 或业务权限层 目标方实际看到的来源 IP、白名单生效状态,以及 API 网关、WAF 或接口权限
目标 API 返回 401 Unauthorized 业务接口认证 API Key、Token、签名和账号权限,不要把它当成出口 IP 问题
连接超时或握手失败 网络、端口、代理协议或 TLS 代理入口可达性、端口、DNS、证书和目标域名
同一程序有时成功、有时失败 存在多个出口或部分请求旁路 所有实例、备用任务、IPv6 路径和分流规则
查询到的 IP 与提交值不同 代理未生效或出口发生变化 进程是否读取了代理配置、是否使用轮换产品、是否被其他网络规则覆盖

RFC 9110 的 HTTP 语义定义明确区分了代理认证错误与目标资源拒绝:407 表示客户端需要向代理认证,而 403 表示服务器理解请求但拒绝处理。先确认状态码是谁返回的,再决定联系代理服务商还是目标系统或 API 网关管理方。

八、固定出口 IP 与 API 白名单常见问题

1. 固定出口 IP 和服务器固定公网 IP 是一回事吗?

不一定。服务器可以没有独立公网地址,但它发出的请求统一经过 NAT 或代理后,仍然拥有固定公网出口。API 白名单关心的是目标系统最终看到的来源地址。

2. API 白名单应该填服务器 IP 还是代理 IP?

请求经过固定代理时填代理公网出口;服务器直连时填服务器实际公网出口。不要填写 192.168.x.x10.x.x.x 等内网地址。

3. 动态住宅代理能不能用于 API 白名单?

严格白名单通常不适合。动态住宅代理会轮换出口,目标方需要不断更新允许列表。只有目标系统接受较大地址范围、或业务本身不依赖固定来源时,才考虑动态方案。

4. API 白名单该选静态住宅还是独享数据中心代理?

如果目标系统只要求固定来源地址,独享数据中心代理通常更直接;只有目标方明确验证 ISP 或住宅网络属性时,才需要评估静态 ISP 方案。不要把住宅属性当成所有 API 接入的默认要求。

5. 多台服务器可以共用一个固定出口吗?

可以。通过统一 NAT 或固定代理,多台服务器可以对外显示同一地址,但需要验证带宽、并发连接、SNAT 端口、日志归因和故障隔离能力。

6. 固定出口 IP 更换时怎样避免 API 中断?

顺序保持为“先加新 IP → 小流量验证 → 切换生产流量 → 最后删旧 IP”。主备出口应提前登记。

7. IP 已经加入白名单,为什么还是返回 403?

让目标方确认日志中的真实来源 IP,再检查白名单、网关/WAF、接口权限和是否存在其他出口。若返回 407,则回到代理认证层排查。

API 白名单最终要对齐的是合作方真实看到的来源地址,而不是某个控制台里看起来像“公网 IP”的字段。