本页面介绍了如何使用入站流量和出站流量规则允许 VPC 网络中内部 IP 地址的流量进入服务边界。
概览
您可以使用 VPC Service Controls 指定条件,以允许 VPC 网络的特定 IP 地址范围访问受保护的项目和 VPC 网络。借助此功能,您可以执行以下任务:
- 支持基本访问权限级别条件,以允许 VPC 网络的内部 IP 地址范围。 
- 允许使用这些访问权限级别条件来控制入站流量或出站流量 API 调用进入或离开服务边界。 
此功能具有以下优势:
- 您可以在 VPC Service Controls 配置中指定条件,以允许从 VPC 网络中的内部 IP 地址进行访问。 
- 如果工作流需要 API 调用通过多个服务边界,则可以限制访问权限,仅允许访问部分子网,而不是整个 VPC 网络或项目。 
- 您可以配置本地的不同资源,使其仅能访问特定 Google Cloud 资源。您需要使用与这些本地资源和着陆区的 VPC 网络相关联的子网 IP 地址范围作为访问权限级别的一部分。 
图 1 显示了允许通过授权的内部 IP 地址访问特定受保护服务的示例设置。
使用内部 IP 地址的限制
在 VPC Service Controls 中使用内部 IP 地址时,会受到以下限制:
- 只能在基本访问权限级别中启用内部 IP 地址,无法用于自定义访问权限级别。 
- 我们建议不要对包含内部 IP 地址条件的访问权限级别使用否定逻辑,因为这可能导致意外行为。 
- 添加 VPC 网络到服务边界的限制也适用。 
- 当 VPC Service Controls 记录政策拒绝审核日志时,会在审核日志中将 VPC 网络的名称隐去,显示为 - __UNKNOWN__。
- 不支持将 - SUBNET_MODE设置为- custom但未配置子网的 VPC 网络。若要启用内部 IP 地址,VPC 网络必须包含至少一个子网。
- 您只能在访问权限政策中的所有访问权限级别中指定 500 个 VPC 网络。 
- 当您删除由访问权限级别或服务边界引用的 VPC 网络,然后重新创建另一个具有相同名称的 VPC 网络时,VPC Service Controls 不会自动在重新创建的 VPC 网络上启用内部 IP 地址。如需克服此限制,请创建一个名称不同的 VPC 网络,并将其添加到边界中。 
- 您不能使用内部 IP 地址来允许来自 Google 管理服务的访问。例如,Cloud SQL。 
- 如果您使用的访问权限级别包含基于内部 IP 地址的条件和出站流量规则,我们建议您不要向该访问权限级别添加任何其他条件(例如设备类型、用户身份)。 
- 内部 IP 地址不适用于基于地理区域的访问权限级别。 
在访问权限级别中使用内部 IP 地址
- 在基本访问权限级别条件的 - vpcNetworkSources字段中指定 VPC 网络名称和 IP 地址范围。- VPC 网络名称。您必须按以下格式定义 VPC 网络名称: - //compute.googleapis.com/projects/PROJECT_ID/global/networks/NETWORK_NAME - 例如 - //compute.googleapis.com/projects/my-project/global/networks/my-vpc。
- IP 地址范围。在 - VpcNetworkSource的- VpcSubNetwork字段中指定的 IP 地址范围必须遵循 CIDR 块 IP 子网规范。您可以使用任何有效的 IPv4 范围作为子网的 IP 地址范围。
 
- 将此访问权限级别与 - IngressSource或- EgressSource中的允许条件搭配使用。
以下部分将通过一个示例场景来介绍如何执行这些步骤以启用内部 IP 地址。
使用内部 IP 地址设置子网访问权限的示例
在以下示例中,您有两个项目:
- 网络宿主项目: - Project1托管 VPC 网络:- default。- Project1中的两个虚拟机- VM1和- VM2使用此网络作为网络接口来发送流量。
- Cloud Storage 项目: - Project2包含 Cloud Storage 存储桶。
您可以使用 VPC Service Controls,仅允许 VM1 从 Project1 使用内部 IP 地址访问 Project2 中的 Cloud Storage 存储桶。如需实现此设置,您需要执行以下步骤:
- 您围绕 - Project1创建了一个服务边界- sp1,并围绕- Project2创建了另一个服务边界- sp2。
- 然后,您可以向服务边界添加入站流量规则和出站流量规则,以便仅允许 - VM1的子网访问 Cloud Storage 存储桶。
下图显示了此示例中所述的设置。
在组织级别配置访问权限政策
- 确保您在组织级别拥有访问权限政策。如果您没有此级别的访问权限政策,请运行以下 gcloud CLI 命令: - gcloud access-context-manager policies create \ --organization=ORGANIZATION_ID --title=POLICY_TITLE- 替换以下内容: - ORGANIZATION_ID:贵组织的数字 ID。 
- POLICY_TITLE:人类可读的访问权限政策标题。 
 - 如需了解详情,请参阅创建组织级别访问权限政策。 
- 如需将此政策设置为默认访问权限政策,请运行以下 gcloud CLI 命令: - gcloud config set access_context_manager/policy POLICY_NAME - 将 POLICY_NAME 替换为访问权限政策的数字名称。 - 如需了解详情,请参阅为 - gcloud命令行工具设置默认访问权限政策。
创建边界以保护网络主机项目和 Cloud Storage 项目
- 如需围绕 - Project1创建边界- sp1,请运行以下 gcloud CLI 命令:- gcloud access-context-manager perimeters create sp1 --title="sp1" --resources=PROJECT_NUMBER \ --restricted-services=storage.googleapis.com --policy=POLICY_NAME- 替换以下内容: - PROJECT_NUMBER:网络宿主项目的项目编号。例如 - projects/111。
- POLICY_NAME:您的访问权限政策的数字名称。例如 - 1234567890。
 
- 如需围绕 - Project2创建限制 Cloud Storage 服务的边界- sp2,请运行以下 gcloud CLI 命令:- gcloud access-context-manager perimeters create sp2 --title="sp2" --resources=PROJECT_NUMBER \ --restricted-services=storage.googleapis.com --policy=POLICY_NAME- 替换以下内容: - PROJECT_NUMBER:Cloud Storage 项目的项目编号。例如 - projects/222。
- POLICY_NAME:您的访问权限政策的数字名称。例如 - 1234567890。
 
如需详细了解如何创建服务边界,请参阅创建服务边界。
创建这两个边界后,这两个虚拟机将无法再访问 Cloud Storage 存储桶。
创建基于内部 IP 地址的访问权限条件的访问权限级别
创建一个访问权限级别,仅允许来自 VM1 子网的流量。
- 创建一个用于定义访问权限条件的 YAML 文件。以下示例仅显示了启用内部 IP 地址所需的属性: - echo """ - vpcNetworkSources: - vpcSubnetwork: network: VPC_NETWORK_NAME vpcIpSubnetworks: - IP_RANGE """ > level.yaml- 替换以下内容: - VPC_NETWORK_NAME: - VM1所在的 VPC 网络的名称。例如- //compute.googleapis.com/projects/Project1/global/networks/default。
- IP_RANGE:子网的 IP 地址范围例如 - 10.10.0.0/24。
 - 使用前面介绍过的 VPC 网络名称和 IP 地址范围格式。 - 如需详细了解 YAML 文件,请参阅 - basic-level-specYAML 文件。
- 如需使用 YAML 文件创建访问权限级别,请运行以下 gcloud CLI 命令: - gcloud access-context-manager levels create LEVEL_NAME \ --title="TITLE" --basic-level-spec=FILE_NAME- 替换以下内容: - LEVEL_NAME:访问权限级别的唯一名称。例如 - allowvm1。
- TITLE:访问权限级别的人类可读简短标题。例如 - allowvm1。
- FILE_NAME:用于定义访问权限级别的访问条件的 YAML 文件。例如 - level.yaml。
 - 如需了解详情,请参阅创建基本访问权限级别。 
配置入站流量政策,以允许入站 API 流量访问 Cloud Storage 存储桶
如需仅允许来自 VM1 的访问,请在 sp2 边界中配置入站流量政策,以允许 Cloud Storage API 流量进入该边界。
- 创建用于定义入站流量政策的 YAML 文件。 - echo """ - ingressFrom: identityType: ANY_IDENTITY sources: - accessLevel: accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME ingressTo: operations: - methodSelectors: - method: '*' serviceName: storage.googleapis.com resources: - '*' """ > ingress.yaml- 替换以下内容: - POLICY_NAME:您的访问权限政策的数字名称。例如 - 1234567890。
- ACCESS_LEVEL_NAME:访问权限级别的名称。例如 - allowvm1。
 - 如需详细了解 YAML 文件,请参阅入站流量规则参考文档。 
- 如需更新服务边界的入站流量政策,请运行以下 gcloud CLI 命令: - gcloud access-context-manager perimeters update PERIMETER --set-ingress-policies=FILE_NAME - 替换以下内容: - PERIMETER:用于保护 Cloud Storage 项目的服务边界的名称。例如 - sp2。
- FILE_NAME:用于定义入站流量政策的 YAML 文件。例如 - ingress.yaml。
 - 如需了解详情,请参阅更新服务边界的入站流量和出站流量政策。 
配置出站流量政策以允许流向 Cloud Storage 存储桶的出站 API 流量
此外,还需要在 sp1 边界中配置出站流量政策,以允许 Cloud Storage API 流量离开边界。
- 创建用于定义出站流量政策的 YAML 文件。请务必在 YAML 文件中将 - sourceRestriction字段设置为- SOURCE_RESTRICTION_ENABLED。- echo """ - egressFrom: identityType: ANY_IDENTITY sourceRestriction: SOURCE_RESTRICTION_ENABLED sources: - accessLevel: accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME egressTo: operations: - methodSelectors: - method: '*' serviceName: storage.googleapis.com resources: - '*' """ > egress.yaml- 替换以下内容: - POLICY_NAME:您的访问权限政策的数字名称。例如 - 1234567890。
- ACCESS_LEVEL_NAME:访问权限级别的名称。例如 - allowvm1。
 - 如需详细了解 YAML 文件,请参阅出站流量规则参考文档。 
- 如需更新服务边界的出站流量政策,请运行以下命令: - gcloud access-context-manager perimeters update PERIMETER --set-egress-policies=FILE_NAME - 替换以下内容: - PERIMETER:用于保护网络主机项目的服务边界的名称。例如 - sp1。
- FILE_NAME:用于定义出站流量政策的 YAML 文件。例如 - egress.yaml。
 - 如需了解详情,请参阅更新服务边界的入站流量和出站流量政策。 
配置入站流量和出站流量政策后,可以从 VM1 访问 Cloud Storage 存储桶,而 VM2 将无法访问 Cloud Storage 存储桶。
建议
- 启用内部 IP 地址时,我们建议您停用虚拟机的 IP 转发功能。IP 转发允许同一 VPC 网络中的虚拟机使用不同的 IP 地址发送请求,从而存在 IP 地址仿冒的风险。 
- 如果您想启用 IP 转发,建议采用以下配置来降低 IP 地址仿冒风险: