配置 API 白名单时,应该提交的不是服务器的 192.168.x.x 内网地址,也不一定是云平台控制台里看到的实例地址,而是请求最终到达合作方 API 时,对方实际看到的固定公网出口 IP。如果应用使用动态公网地址、云服务默认出口或轮换代理,代码即使没有变化,来源 IP 也可能改变,白名单就会间歇性失效。
真正需要确认的是一条完整链路:应用从哪里发出请求、经过哪个 NAT 或代理、合作方最终看到哪个公网地址。只有这个最终出口稳定下来,白名单才不会因为实例变化或线路切换反复失效。本文讨论的是“第三方 API 对你的出口 IP 放行”,不是“在代理服务商后台把自己的公网 IP 加入认证白名单”。
文章目录
一、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 配置静态出口。
实际项目里,出口不固定通常来自以下几种情况:
- 云函数、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 |
与本地结果一致后,才可确认白名单命中正确来源 |
一次稳妥的更换流程应按以下顺序进行:
- 申请新固定出口,但暂时保留旧出口;
- 让合作方先把新 IP 加入白名单;
- 从测试任务经过新出口调用真实 API;
- 逐步把生产流量切换到新出口;
- 观察目标方日志、错误率和延迟;
- 确认所有任务都不再使用旧 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.x、10.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”的字段。