GKE访问受限IP的Google APIs遭拒:请求源自IPv6地址
GKE调用Google Maps API遇REQUEST_DENIED:IPv6地址未授权问题
问题描述
我为Geocoding API、Maps JavaScript API和Places API的API密钥配置了Cloud NAT的IPv4地址作为IP限制,但从Google Kubernetes Engine(GKE)集群内通过curl调用API时,收到REQUEST_DENIED响应,提示请求来自某IPv6地址。但在集群内执行curl ifconfig.me返回的却是Cloud NAT的IPv4地址(34.87.xxx.xx),对此十分困惑。
请求命令:
curl --location --request GET 'https://maps.googleapis.com/maps/api/place/autocomplete/json?input=Wonogiri&types=&key=MY-API-KEY'
错误响应:
{ "error_message" : "This IP, site or mobile application is not authorized to use this API key. Request received from IP address IPV6_ADDRESS, with empty referer", "predictions" : [], "status" : "REQUEST_DENIED" }
原因分析
- GKE节点默认支持双栈(IPv4+IPv6)时,系统会优先尝试用IPv6连接Google API服务器,而你的API密钥仅授权了Cloud NAT的IPv4地址,导致请求被拒绝。
curl ifconfig.me返回IPv4是因为该服务可能仅返回IPv4结果,或curl访问该服务时默认优先使用IPv4,但访问Google Maps API时走了IPv6路由。
解决方法
1. 强制curl使用IPv4
在curl命令中添加-4参数,强制使用IPv4协议发起请求:
curl -4 --location --request GET 'https://maps.googleapis.com/maps/api/place/autocomplete/json?input=Wonogiri&types=&key=MY-API-KEY'
如果请求成功,即可确认是IPv6优先级导致的问题。
2. 调整GKE节点网络配置
- 检查集群是否启用双栈:若集群开启了IPv6,可修改节点池配置,禁用IPv6,或添加路由规则让访问Google API的流量强制走IPv4。
- Pod级别配置:在容器中添加环境变量或修改网络设置,强制容器内请求使用IPv4(例如设置
IPV6_DISABLE=1之类的环境变量,具体取决于容器基础镜像)。
3. 为API密钥添加IPv6授权
若需保留IPv6功能,可将GKE节点的IPv6地址(或集群IPv6网段)添加到API密钥的IP允许列表中。注意:若节点IPv6地址是动态分配的,需定期更新授权列表。
4. 检查Cloud NAT配置
确认Cloud NAT是否仅处理IPv4流量,未配置IPv6 NAT规则。若集群启用IPv6但Cloud NAT未处理IPv6请求,IPv6流量会直接从节点IPv6地址发出,不经过Cloud NAT转换,导致不在授权范围内。
内容的提问来源于stack exchange,提问作者adhithia
相关产品推荐
相关产品推荐

