无法通过Google Cloud VPC服务控制放行指定IP(Artifact Registry边界)
问题描述
在GCP上配置VPC Service Controls以放行特定IP(49.36.189.5/32)访问Artifact Registry API,已创建包含该IP段的访问级别,且确认VPC Service Controls与防火墙规则配置正确,但请求仍被拦截,错误提示:Request is prohibited by organization's policy.,审计日志显示violationReason: NO_MATCHING_ACCESS_LEVEL。
配置详情:
- 目标资源:Artifact Registry API
- 访问级别规则:允许49.36.189.5/32访问
- 入站/出站规则:无
审计日志关键信息:
{ "requestMetadata": { "callerIp": "49.36.189.5" }, "serviceName": "artifactregistry.googleapis.com", "methodName": "artifactregistry.googleapis.com/DockerRead", "metadata": { "violationReason": "NO_MATCHING_ACCESS_LEVEL", "servicePerimeterName": "accessPolicies/.../servicePerimeters/artifact_registry" } }
可能的原因分析
- 访问级别未关联到目标服务边界:仅创建访问级别但未将其添加到对应服务边界的入站策略中,导致VPC SC无法识别该规则。
- 访问级别IP规则配置错误:IP段格式错误(如掩码不正确、IP地址拼写错误),或选择了错误的条件类型(如误选VPC网络而非IP地址)。
- 服务边界模式或规则冲突:服务边界处于严格强制模式,且存在其他优先级更高的拦截规则;或访问级别要求同时满足IP和身份验证条件,但请求未提供有效凭证。
- 请求身份验证缺失:Artifact Registry的Docker拉取等操作可能需要身份验证,即使IP在允许列表中,匿名请求仍会被VPC SC拦截(部分访问级别隐含身份验证要求)。
排查与修复步骤
1. 确认访问级别与服务边界的关联
- 进入VPC Service Controls控制台,找到目标服务边界
artifact_registry - 检查入站策略(Ingress policies),确认已将创建的IP访问级别添加到允许列表中
- 若未添加,补充关联并等待配置生效(通常需要5-10分钟)
2. 验证访问级别IP规则的准确性
- 打开访问级别配置页面,检查IP范围是否为
49.36.189.5/32,确认无拼写或掩码错误 - 确认规则类型为IP地址(IP address),而非VPC网络或其他类型
- 测试将IP范围临时扩大(如
49.36.189.0/24),验证是否能正常访问,排查IP段匹配问题
3. 检查服务边界模式与附加规则
- 确认服务边界处于强制模式(Enforced)(若为报告模式则仅记录拦截,不实际阻止)
- 检查服务边界是否有其他入站规则,例如是否存在拒绝所有流量的规则优先级高于IP允许规则
- 查看服务边界是否包含所有相关资源:确认Artifact Registry所在的项目已被纳入该服务边界
4. 验证请求的身份凭证
- 对于Artifact Registry的Docker拉取操作,确保请求携带了有效的GCP身份凭证(如使用
gcloud auth configure-docker配置的凭证) - 检查访问级别是否添加了身份验证条件(如要求特定用户/组),若有需确保请求符合身份要求
- 测试使用已授权的服务账号发起请求,验证是否能绕过拦截
5. 排查组织策略冲突
- 使用gcloud命令列出组织策略,检查是否存在影响VPC Service Controls的约束:
gcloud org-policies list --organization=YOUR_ORG_ID - 重点检查
constraints/vpcaccess.restrictVpcPeering、constraints/compute.restrictExternalIp等可能与VPC SC交互的策略
6. 验证请求源IP的真实性
- 虽然审计日志显示
callerIp为目标IP,但可通过在请求端执行curl https://ipinfo.io/ip确认实际出口IP - 若请求经过代理或CDN,需确保代理的出口IP也被添加到访问级别中
内容的提问来源于stack exchange,提问作者user7448575
相关产品推荐
相关产品推荐

