本页介绍了如何使用入站和出站规则允许从 VPC 网络中的内部 IP 地址流量到服务边界。
概览
您可以使用 VPC Service Controls 指定条件,以允许 VPC 网络的特定 IP 地址范围访问受保护的项目和 VPC 网络。借助此功能,您可以执行以下任务:
支持基本访问权限级别条件,以允许 VPC 网络的内部 IP 地址范围。
允许对入站或出站 API 调用(进入或离开服务边界边界)使用这些访问权限级别条件。
此功能具有以下优势:
您可以在 VPC Service Controls 配置中指定条件,以允许从 VPC 网络中的内部 IP 地址进行访问。
如果 Workflows 需要 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 地址范围。
将此访问权限级别与
IngressSource
或EgressSource
中的允许条件搭配使用。
以下部分将通过示例场景介绍如何执行这些步骤来启用内部 IP 地址。
使用内部 IP 地址设置子网访问权限的示例
在以下示例中,您有两个项目:
网络宿主项目:
Project1
托管 VPC 网络:default
。Project1
中的两个虚拟机VM1
和VM2
将此网络用作网络接口来发送流量。Cloud Storage 项目:
Project2
包含 Cloud Storage 存储桶。
您可以使用 VPC Service Controls 仅允许 Project1
中的 VM1
使用内部 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-spec
YAML 文件。如需使用 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
。
如需了解详情,请参阅创建基本访问权限级别。
配置入站政策,以允许向 Cloud Storage 存储桶发送入站 API 流量
如需仅允许从 VM1
访问,请在 sp2
边界中配置入站流量政策,以允许 Cloud Storage API 流量进入边界。
创建用于定义 Ingress 政策的 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 地址欺骗的风险: