如何获取各地区Firebase Cloud Functions的外部IP地址范围?
我需要将Firebase Cloud Function发起请求的IP地址加入外部服务的白名单,但因请求频次较低,且外部服务支持IP段白名单,不想部署VPC Connector和Cloud NAT Gateway来预留静态出站IP。原本参考Compute Engine IP范围文档及对应的cloud.json资源(按地区列出IP范围),但在两个不同地区的Firebase项目中测试时,得到的出站IP(us-west2为35.203.245.85,us-central1为107.178.200.230)均不在该JSON文件的对应CIDR范围内。怀疑公布的IP范围可能不完整,或是该列表不适用于Firebase Cloud Functions,希望了解us-west2地区Firebase Cloud Functions的完整IP范围,或无需预留静态IP的替代方案。
测试代码
exports.checkIP = functions .region("us-west2") .https.onCall(async (data, context) => { const response = await fetch("https://api.ipify.org?format=json"); const jsonData = await response.json(); logger.log("My outbound IP address is: ", jsonData.ip); return jsonData; });
参考的部分CIDR范围
{"ipv4Prefix": "34.20.128.0/17", "service": "Google Cloud", "scope": "us-west2" }, {"ipv4Prefix": "34.94.0.0/16", "service": "Google Cloud", "scope": "us-west2" }, ... {"ipv4Prefix": "8.34.210.0/24", "service": "Google Cloud", "scope": "us-central1" }, ...
问题原因
非VPC联网模式下的Firebase Cloud Functions,出站IP并非来自Compute Engine的地区性IP池,而是取自Google的全局外部IP范围,这就是测试IP不在参考列表里的核心原因。Google公开的Compute Engine地区IP范围仅适用于GCE虚拟机实例,和Cloud Functions的出站IP池不重叠。
解决方案
1. 获取Cloud Functions的IP范围
Google会定期发布包含所有云服务IP范围的官方列表,其中标记为service: "Cloud Functions"的条目就是该服务使用的全局IP段。但注意:这些IP段是全局共享的,没有按地区划分,不存在us-west2专属的Cloud Functions IP范围。
2. 无需静态IP的替代方案
- 用Cloud Run做中间代理:Cloud Run支持直接配置静态出站IP(无需部署NAT网关),可将Cloud Functions的请求转发到Cloud Run,再由Cloud Run访问外部服务,只需将Cloud Run的静态IP加入外部服务白名单即可。
- 借助Cloudflare Workers中转:将Cloud Functions的请求先发送到Cloudflare Workers,再由Worker转发到目标服务。只需把Cloudflare公开的IP段加入白名单即可,Cloudflare的IP范围稳定且公开。
- 验证外部服务的白名单规则:如果外部服务支持域名白名单,可尝试将Firebase Functions的调用域名加入;若支持按请求来源的ASN过滤,可加入Google Cloud的ASN(AS396982),不过这种方式精度较低。
内容的提问来源于stack exchange,提问作者will_d

