1. 简介
Cloud Next Generation Firewall (NGFW)
Cloud Next Generation Firewall 是一种完全分布式的防火墙服务,具有高级保护功能、微细分和广泛的覆盖范围,可保护您的 Google Cloud 工作负载免遭内部和外部攻击。
Cloud NGFW 具有以下优势:
- 分布式防火墙服务:Cloud NGFW 在每个工作负载上提供基于有状态的完全分布式主机强制执行,以实现零信任安全架构。
- 简化配置和部署:Cloud NGFW 实现网络和分层防火墙政策,可以附加到资源层次结构节点。这些政策在 Google Cloud 资源层次结构中提供一致的防火墙体验。
- 精细控制和微细分:防火墙政策和 Identity and Access Management (IAM) 控制的标记相结合,可以跨虚拟私有云 (VPC) 网络对南北向和东西向流量进行精细控制,并精确到单个虚拟机。
网络防火墙政策
网络防火墙政策充当防火墙规则的容器。在网络防火墙政策与 VPC 网络关联之前,系统不会在任何位置强制执行该政策中定义的规则。每个 VPC 网络都可以关联一个网络防火墙政策。网络防火墙政策支持防火墙规则中的 IAM 治理的标记(或简称为标记),可用于为工作负载提供身份。
在网络之间共享网络防火墙政策以及与 IAM 治理的标记集成,可极大地简化防火墙的配置和管理。
随着网络防火墙政策的推出,Google Cloud 的防火墙政策现在包含以下组件:
资源层次结构中的组织节点和文件夹节点支持分层防火墙政策,而 VPC 防火墙规则和网络防火墙政策则在 VPC 级层应用。VPC 防火墙规则与网络防火墙政策之间的一大区别在于,VPC 防火墙规则只能应用于单个 VPC 网络,而网络防火墙政策可以附加到单个 VPC 或一组 VPC,此外还具有批量更新等优势。
在本实验中,我们将测试分层防火墙政策和全球网络防火墙政策。
最后,我们还有每个 VPC 网络都附带的隐式防火墙规则:
- 出站流量规则,其操作为“允许”,目的地为 0.0.0.0/0
- 入站规则的操作为“拒绝”,来源为 0.0.0.0/0
默认情况下,强制执行顺序如下图所示:

IAM 治理的标记
集成在防火墙政策规则中的新标记是在 Google Cloud 资源层次结构的组织级或项目级定义的键值对资源。顾名思义,此类标记包含一个 IAM 访问权限控制,用于指定谁可以对标记执行什么操作。例如,通过 IAM 权限,您可以指定哪些主账号可为标记分配值,以及哪些主账号可将标记附加到资源。将标记应用于资源后,防火墙政策规则可以使用该标记来允许和拒绝流量。
标记遵循 Google Cloud 的继承资源模型,这意味着标记及其值会从父级沿层次结构向下传递。因此,标记可以在一个位置创建,然后由整个资源层次结构中的其他文件夹和项目使用。如需详细了解标记和访问限制,请访问此页面。
不应将标记与网络标记混淆,后者是可以添加到 Compute Engine 实例的字符串;它们与实例相关联,并在实例停用时消失。VPC 防火墙规则可能包含网络标记,但由于它们不被视为云资源,因此不受 IAM 访问权限控制的约束。如需详细了解两者之间的区别,请访问此页面。
2. 学习内容
- 如何创建受 IAM 管控的标签,以用于 Cloud NGFW 且具有全局范围。
- 如何将标记附加到虚拟机。
- 如何创建分层防火墙政策并将其与文件夹关联。
- 如何在分层防火墙政策中创建防火墙规则,以及如何使用受 IAM 管控的标记指定来源和目标。
3. 实验整体架构

组织和文件夹:
- 您将在组织下直接创建两个文件夹:
folder1和folder2。
项目:
- 在
folder1内,您将创建一个宿主项目。此项目将包含共享 VPC 网络。 - 在
folder2中,您将创建一个服务项目。此项目将包含使用共享 VPC 的虚拟机。
网络:
- 系统将在宿主项目中创建一个名为
mynet的 VPC 网络,并将其配置为共享 VPC。这样,服务项目中的资源便可使用该网络。 - 两个虚拟机将在服务项目中创建,并连接到
mynet共享 VPC。
IAM 治理的标记:
- 您将在组织级层创建一个名为
http_tags的 IAM 治理的标记,其中包含两个值,名称分别为http_server和http_client。这些标记/值将用于标识虚拟机并向其应用防火墙规则。
防火墙政策:
- 系统将创建分层防火墙政策并将其与
folder1相关联。此政策中的一条规则将使用受 IAM 管控的标记来允许流量从http-client流向http-server(通过端口 80)。 - 系统将在宿主项目中创建网络防火墙政策,并将其与
mynetVPC 相关联。此政策将包含一项规则,允许通过 IAP SSH 访问虚拟机以进行测试。
4. 准备步骤
首先,在 Google Cloud 组织中设置必要的 IAM 角色、网络基础设施和实例。
完成实验所需的 IAM 角色
我们首先在组织级层为 GCP 账号分配所需的 IAM 角色。
- 组织管理员 (
roles/resourcemanager.organizationAdmin):此角色可让您管理 IAM 政策,以及查看组织、文件夹和项目的组织政策。 - Tag Administrator(
roles/resourcemanager.tagAdmin):此角色允许您创建、更新和删除安全标记。 - Tag User 角色 (
roles/resourcemanager.tagUser):此角色可让您访问安全标记的列表,并管理这些标记与资源之间的关联。 - Compute Organization Firewall Policy Admin 角色 (
roles/compute.orgFirewallPolicyAdmin):此角色可让您完全控制 Compute Engine 组织防火墙政策。 - Compute Organization Resource Admin 角色 (
roles/compute.orgSecurityResourceAdmin):此角色可让您完全控制与组织或文件夹关联的 Compute Engine 防火墙政策。 - Compute Network Admin (
roles/compute.networkAdmin):此角色可让您完全控制 Compute Engine 网络资源。 - Compute Instance Admin(Beta 版)(
roles/compute.instanceAdmin):此角色可让您完全控制 Compute Engine 实例资源。 - Logging 管理员 (
roles/logging.admin):此角色可让您使用所有日志记录权限和相关权限。 - Service Account Admin (
roles/iam.serviceAccountAdmin):此角色可让您创建和管理服务账号。 - Service Usage Admin (
roles/serviceusage.serviceUsageAdmin):此角色可让您能够启用、停用和检查使用方项目的服务状态和操作,以及使用该项目的配额和结算服务。 - Compute Shared VPC Admin (
roles/compute.xpnAdmin):此角色可让您管理共享 VPC 网络 (XPN)。
创建文件夹和项目
在 Cloud Shell 中,执行以下操作以创建 folder1 和 folder2:
gcloud auth login
export org_id=$(gcloud organizations list --format='value(ID)')
export BILLING_ACCOUNT_ID=$(gcloud billing accounts list --format='value(ACCOUNT_ID)')
export folder1=[FOLDER1 NAME]
export folder2=[FOLDER2 NAME]
export hostproject=[HOST PROJECT NAME]
export serviceproject=[SERVICE PROJECT NAME]
export regionname=[REGION NAME]
export zonename=[COMPUTE ZONE NAME]
gcloud resource-manager folders create --display-name=$folder1 --organization=$org_id
export folder1_id=$(gcloud resource-manager folders list --organization=$org_id --filter="displayName=$folder1" --format="value(ID)")
gcloud resource-manager folders create --display-name=$folder2 --organization=$org_id
export folder2_id=$(gcloud resource-manager folders list --organization=$org_id --filter="displayName=$folder2" --format="value(ID)")
在 Cloud Shell 中,执行以下操作以在 folder1 下创建宿主项目:
gcloud projects create --name=$hostproject --folder=$folder1_id
您将看到以下内容。按 Y 键以使用新的项目 ID 创建项目。
No project ID provided.
Use [NEW-PROJECT-ID] as project ID (Y/n)?
记下项目 ID。在 Cloud Shell 中,执行以下操作,将其导出到 hostproject_id:
export hostproject_id=[HOSTPROJECT ID]
在 Cloud Shell 中,执行以下操作,将宿主项目与结算账号相关联:
gcloud billing projects link $hostproject_id \
--billing-account=$BILLING_ACCOUNT_ID
在 Cloud Shell 中,执行以下操作以在 folder2 下创建服务项目:
gcloud projects create --name=$serviceproject --folder=$folder2_id
您将看到以下内容。按 Y 键以使用新的项目 ID 创建项目。
No project ID provided.
Use [NEW-PROJECT-ID] as project ID (Y/n)?
记下项目 ID。在 Cloud Shell 中,执行以下操作,将其导出到 serviceproject_id:
export serviceproject_id=[SERVICEPROJECT ID]
在 Cloud Shell 中,执行以下操作,将服务项目与结算账号相关联:
gcloud billing projects link $serviceproject_id \
--billing-account=$BILLING_ACCOUNT_ID
创建 IAM 治理的标记
标记是一种可以关联到组织、文件夹或项目的键值对。如需了解详情,请参阅创建和管理标记以及所需权限。
我们在组织级层创建一个标记 http-tags。标记的用途是供 Cloud NGFW 使用。我们不会将范围限制为单个网络,而是采用全局范围。稍后,我们将此标记应用于在 folder2 下的服务项目中创建的虚拟机。
在 Cloud Shell 中,执行以下操作:
gcloud resource-manager tags keys create http_tags \
--parent=organizations/$org_id \
--purpose GCE_FIREWALL \
--purpose-data organization=auto
我们将在创建虚拟机期间使用标记键 ID 来注释虚拟机。在 Cloud Shell 中,执行以下操作以获取标记键 ID:
export http_tags_id=$(gcloud resource-manager tags keys describe $org_id/http_tags --format="value(name)")
echo $http_tags_id
在 Cloud Shell 中,执行以下操作以创建两个新的标记值 http_server 和 http_client:
gcloud resource-manager tags values create http_server \
--parent $org_id/http_tags
gcloud resource-manager tags values create http_client \
--parent $org_id/http_tags
我们将在创建期间使用标记 ID 和标记值 ID 来注释虚拟机。在 Cloud Shell 中,执行以下操作以获取 http_server 和 http_client 的标记值 ID:
export http_tags_http_server_id=$(gcloud resource-manager tags values describe $org_id/http_tags/http_server --format="value(name)")
echo $http_tags_http_server_id
export http_tags_http_client_id=$(gcloud resource-manager tags values describe $org_id/http_tags/http_client --format="value(name)")
echo $http_tags_http_client_id
在宿主项目和服务项目中启用 API
在 Cloud Shell 中,执行以下操作:
gcloud services enable compute.googleapis.com --project=$serviceproject_id
gcloud services enable compute.googleapis.com --project=$hostproject_id
在宿主项目中创建 VPC
在宿主项目中,创建一个具有自定义子网模式的 VPC 网络,在 Cloud Shell 中执行以下操作:
gcloud compute networks create mynet \
--subnet-mode=custom \
--project=$hostproject_id
在宿主项目中创建子网
在 Cloud Shell 中,执行以下操作以创建 IPv4 子网:
gcloud compute networks subnets create mysubnet \
--network=mynet \
--range=10.0.0.0/28 \
--region=$regionname \
--project=$hostproject_id
在宿主项目中启用共享 VPC
在 Cloud Shell 中,执行以下操作以在宿主项目中启用共享 VPC:
gcloud compute shared-vpc enable $hostproject_id
在宿主项目中关联服务项目以使用共享 VPC
在 Cloud Shell 中,执行以下操作,以在宿主项目中关联服务项目以使用共享 VPC:
gcloud compute shared-vpc associated-projects add $serviceproject_id --host-project=$hostproject_id
在宿主项目中创建 Cloud Router 和 Cloud NAT
Cloud NAT 用于允许虚拟机进行互联网出站流量,以便下载和安装应用。
gcloud compute routers create $regionname-cr \
--network=mynet \
--region=$regionname \
--project=$hostproject_id
gcloud compute routers nats create $regionname-nat \
--router=$regionname-cr \
--region=$regionname \
--nat-all-subnet-ip-ranges \
--auto-allocate-nat-external-ips \
--project=$hostproject_id
在服务项目中创建实例
在服务项目中,在您刚刚在宿主项目的共享 VPC 中创建的子网中创建两个实例。一个实例名为 http-server,我们使用值 http_server 为 http_tags 的标记添加注释。另一个实例名为 http-client,我们使用值 http_client 为 http_tags 的标记添加注释。在 Cloud Shell 中运行以下命令:
gcloud compute instances create http-client \
--project=$serviceproject_id \
--subnet=projects/$hostproject_id/regions/$regionname/subnetworks/mysubnet \
--zone=$zonename \
--no-address \
--resource-manager-tags=$http_tags_id=$http_tags_http_client_id
gcloud compute instances create http-server \
--project=$serviceproject_id \
--subnet=projects/$hostproject_id/regions/$regionname/subnetworks/mysubnet \
--zone=$zonename \
--no-address \
--resource-manager-tags=$http_tags_id=$http_tags_http_server_id \
--metadata startup-script='#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
a2enmod ssl
sudo a2ensite default-ssl
echo "I am a Http Server." | \
tee /var/www/html/index.html
systemctl restart apache2'
记下 http-server 的内部 IP。我们将在后面的防火墙规则测试步骤中使用它。
export http_server_ip=$(gcloud compute instances describe http-server --zone $zonename --format='value(networkInterfaces[0].networkIP)' --project $serviceproject_id)
echo $http_server_ip
5. 在宿主项目中创建全球网络防火墙政策
我们将在宿主项目中创建全球网络防火墙政策,并将其与宿主项目中的共享 VPC 相关联。
gcloud config set project $hostproject_id
gcloud compute network-firewall-policies create mynet-fw-policy \
--global \
--project=$hostproject_id
gcloud compute network-firewall-policies associations create \
--firewall-policy=mynet-fw-policy \
--network=mynet \
--name=mynet-fw-policy \
--global-firewall-policy \
--project=$hostproject_id
如需允许 IAP 连接到您的虚拟机实例,请在网络防火墙政策中创建防火墙规则:
- 适用于您希望使用 IAP 可访问的所有虚拟机实例。
- 允许来自 IP 范围 35.235.240.0/20 的入站流量。此范围包含 IAP 用于 TCP 转发的所有 IP 地址。
gcloud compute network-firewall-policies rules create 1000 \
--action=ALLOW \
--firewall-policy=mynet-fw-policy \
--description="mynet-allow-iap" \
--direction=INGRESS \
--src-ip-ranges=35.235.240.0/20 \
--layer4-configs=tcp:22 \
--global-firewall-policy \
--project=$hostproject_id
在控制台中,您可以前往宿主项目,然后在“防火墙政策”下找到新创建的全球网络防火墙政策。您可以在网络防火墙政策中查看新创建的防火墙规则。点击此控制台链接即可前往。请确保您已在控制台中将项目选择器更改为宿主项目。
6. 测试从 http-client 虚拟机到 http-server 虚拟机的访问权限
通过 SSH 连接到名为 http-client 的虚拟机,并测试该虚拟机是否可以通过 HTTP 80 端口访问 http-server。
在 Cloud Shell 中,执行以下操作:
gcloud compute ssh \
--zone=$zonename "http-client" \
--tunnel-through-iap \
--project=$serviceproject_id
使用 curl 访问 Web 服务器。
curl -m 10 [http_server_ip]
您将看到 curl 命令结果。没有入站防火墙规则允许 http-server 的端口 80。
连接在 10000 毫秒后超时。
退出 SSH 会话,返回到 Cloud Shell。
exit
7. 创建分层防火墙政策和防火墙规则
我们将在 folder1 中创建分层防火墙政策,并将该政策与 folder1 相关联。相应政策中的防火墙规则将应用于 folder1 下的宿主项目。
创建分层防火墙政策
gcloud compute firewall-policies create \
--folder=$folder1_id \
--short-name=my-folder1-fw-policy
在分层防火墙政策中创建防火墙规则
该规则允许标记值为 http_tags/http_client 的虚拟机通过 TCP 端口 80 访问标记值为 http_tags/http_server 的虚拟机。
gcloud compute firewall-policies rules create 100 \
--organization=$org_id \
--firewall-policy my-folder1-fw-policy \
--direction=INGRESS \
--layer4-configs=tcp:80 \
--action=allow \
--src-secure-tags=$org_id/http_tags/http_client \
--target-secure-tags=$org_id/http_tags/http_server \
--description=folder1-allow-http
将分层防火墙政策与 folder1 关联
gcloud compute firewall-policies associations create \
--firewall-policy=my-folder1-fw-policy \
--folder=$folder1_id \
--name=my-folder1-fw-policy\
--organization=$org_id
在控制台中,您可以前往 folder1,然后在“防火墙政策”下找到新创建的分层防火墙政策。防火墙政策显示在“位于该文件夹内的防火墙政策”中。您可以在分层防火墙政策中查看新创建的防火墙规则。点击此控制台链接即可前往。请确保在控制台中将项目选择器更改为 folder1。
8. 测试从 http-client 虚拟机到 http-server 虚拟机的访问权限
检查应用于宿主项目中共享 VPC 的有效防火墙政策。
在 Cloud Shell 中,执行以下操作:
gcloud compute networks get-effective-firewalls mynet --project=$hostproject_id
您将看到继承的分层防火墙政策,如下所示:
TYPE: org-firewall
FIREWALL_POLICY_NAME: <NUMBER_FOR_YOUR_FW_POLICY>
FIREWALL_POLICY_PRIORITY:
PRIORITY: 100
ACTION: ALLOW
DIRECTION: INGRESS
DISABLED: False
IP_RANGES:
You will see the network firewall policy to the VPC like this:
TYPE: network-firewall-policy
FIREWALL_POLICY_NAME: mynet-fw-policy
FIREWALL_POLICY_PRIORITY: 1000
PRIORITY: 1000
ACTION: ALLOW
DIRECTION: INGRESS
DISABLED: False
IP_RANGES: 35.235.240.0/20
通过 SSH 连接到名为 http-client 的虚拟机,并测试该虚拟机是否可以通过 HTTP 80 端口访问 http-server。
在 Cloud Shell 中,执行以下操作:
gcloud compute ssh \
--zone=$zonename "http-client" \
--tunnel-through-iap \
--project=$serviceproject_id
使用 curl 访问 Web 服务器。
curl [http_server_ip]
您会看到 curl 命令成功返回来自 http-server 的响应。
I am a Http Server.
分层防火墙政策中的入站防火墙规则允许从 http-client 通过端口 80 访问 http-server。
退出 SSH 会话,返回到 Cloud Shell。
exit
9. 清理
清理服务项目中的虚拟机
在 Cloud Shell 中,执行以下操作:
gcloud compute instances delete http-server --zone $zonename --project=$serviceproject_id
gcloud compute instances delete http-client --zone $zonename --project=$serviceproject_id
清理分层防火墙政策
在 Cloud Shell 中,执行以下操作:
gcloud compute firewall-policies associations delete my-folder1-fw-policy \
--firewall-policy=my-folder1-fw-policy \
--organization=$org_id
gcloud compute firewall-policies rules delete 100 \
--organization=$org_id \
--firewall-policy=my-folder1-fw-policy
gcloud compute firewall-policies delete my-folder1-fw-policy \
--organization=$org_id
清理组织级层的标记
在 Cloud Shell 中,执行以下操作:
gcloud resource-manager tags values delete $http_tags_http_server_id
gcloud resource-manager tags values delete $http_tags_http_client_id
gcloud resource-manager tags keys delete $http_tags_id
清理宿主项目
在 Cloud Shell 中,执行以下操作:
gcloud compute shared-vpc associated-projects remove $serviceproject_id --host-project=$hostproject_id
gcloud compute shared-vpc disable $hostproject_id
gcloud projects delete $hostproject_id
清理服务项目
在 Cloud Shell 中,执行以下操作:
gcloud projects delete $serviceproject_id
清理文件夹
在 Cloud Shell 中,执行以下操作:
gcloud resource-manager folders delete $folder1_id
gcloud resource-manager folders delete $folder2_id
10. 恭喜
您已成功测试了采用 IAM 控制的标记的分层防火墙政策。