最后审核时间:2026年5月
使用原生 Terraform 构建 PCNE 考试中的 AWS 服务——每次构建一个代码块,并紧扣考试领域。相同的代码可在 OpenTofu 上运行。
到本实验结束时,你将使用纯 Terraform 部署一个 PCNE 架构的网络底层设施——Shared VPC 主机项目启用、一个带有私有 Google 访问通道 (Private Google Access) 的自定义 VPC(包含一个区域子网)、用于仅出站 egress 的 Cloud Router + Cloud NAT、两条带有子网 VPC Flow Logs 的防火墙规则,以及一个用于内部名称解析的 Cloud DNS 私有区域。这五个模块构成了 PCNE 的 hub-VPC + egress + DNS 参考架构。
将这些代码片段放入一个 main.tf 文件中,运行 terraform init,然后逐步运行 terraform apply。
注意:这个单项目实验演示了 Shared VPC 主机项目的启用,但实际上并没有与另一个服务项目共享 VPC(这需要 Org Admin 权限和两个项目,超出了快速实验的范围)。
>= 1.5 或 OpenTofu >= 1.6。roles/compute.xpnAdmin 权限——如果没有组织级权限,google_compute_shared_vpc_host_project 资源将会失败。如果你只有项目级权限,请跳过第 2 步并将其从 main.tf 中移除。your-project-id。近乎免费:
每月约 $0。运行成本低廉。
启用 Compute、DNS 和 Logging API。
terraform {
required_version = ">= 1.5"
required_providers {
google = { source = "hashicorp/google", version = "~> 6.0" }
}
}
provider "google" {
project = "your-project-id" # REPLACE
region = "us-central1"
}
locals {
labels = {
project = "certlabpro-pcne"
managed_by = "terraform"
}
}
resource "google_project_service" "compute" {
service = "compute.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "dns" {
service = "dns.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "logging" {
service = "logging.googleapis.com"
disable_on_destroy = false
}Shared VPC 是 PCNE 规范的多项目网络模式——一个主机项目 (host project) 拥有 VPC,多个服务项目 (service projects) 通过连接来使用它。服务项目中的工作负载可以从主机 VPC 的子网中获取 IP 地址,而主机项目无需拥有工作负载层资源。PCNE 考试将这种主机与服务的分离作为承载规模的关键模式进行考查。
我们会在当前项目上启用主机项目模式(google_compute_shared_vpc_host_project),然后划分一个 /20 子网,并启用私有 Google 访问通道 (Private Google Access)(允许没有外部 IP 的 VM 访问 *.googleapis.com)和 VPC Flow Logs。
data "google_project" "current" {}
resource "google_compute_shared_vpc_host_project" "host" {
project = data.google_project.current.project_id
depends_on = [google_project_service.compute]
}
resource "google_compute_network" "main" {
name = "certlabpro-pcne-vpc"
auto_create_subnetworks = false
routing_mode = "REGIONAL"
depends_on = [google_project_service.compute]
}
resource "google_compute_subnetwork" "main" {
name = "certlabpro-pcne-subnet"
ip_cidr_range = "10.10.0.0/20"
region = "us-central1"
network = google_compute_network.main.id
private_ip_google_access = true
log_config {
aggregation_interval = "INTERVAL_5_SEC"
flow_sampling = 0.5
metadata = "INCLUDE_ALL_METADATA"
}
}Cloud NAT 为子网提供出站互联网访问,而无需为每个 VM 分配外部 IP——这是 PCNE 规范的默认私有 egress 模式。其架构为:一个 Cloud Router 是 BGP 控制平面基元(由 NAT、VPN、Interconnect 使用);一个 Cloud NAT 附加到它并提供数据平面。
我们启用 AUTO_ONLY NAT IP 分配模式的 NAT(Google 自动选择 IP 地址;生产部署通常会固定到特定的保留 IP 以用于上游防火墙允许列表)。仅记录错误——完整日志模式会产生大量的 Cloud Logging 数据。
resource "google_compute_router" "nat_router" {
name = "certlabpro-pcne-router"
region = "us-central1"
network = google_compute_network.main.id
}
resource "google_compute_router_nat" "nat" {
name = "certlabpro-pcne-nat"
router = google_compute_router.nat_router.name
region = "us-central1"
nat_ip_allocate_option = "AUTO_ONLY"
source_subnetwork_ip_ranges_to_nat = "LIST_OF_SUBNETWORKS"
subnetwork {
name = google_compute_subnetwork.main.id
source_ip_ranges_to_nat = ["ALL_IP_RANGES"]
}
log_config {
enable = true
filter = "ERRORS_ONLY"
}
}PCNE 推荐的防火墙策略:默认拒绝入站流量(GCP 默认设置),只允许必需的流量。我们添加了内部允许所有流量(子网内 VM 之间任意 TCP / UDP / ICMP 流量)+ IAP SSH 允许流量(来自 Google IAP 网关范围的 TCP/22 流量,因此没有公共 IP 的 VM 仍然可以通过 gcloud compute ssh --tunnel-through-iap 进行 SSH 访问)。
这与 ACE 实验中的两规则模式相同——PCNE 通过组织/文件夹范围的防火墙策略(与项目级规则组合的分层防火墙;此处超出范围)来深化它。
resource "google_compute_firewall" "allow_internal" {
name = "certlabpro-pcne-allow-internal"
network = google_compute_network.main.name
direction = "INGRESS"
source_ranges = ["10.10.0.0/20"]
allow {
protocol = "tcp"
}
allow {
protocol = "udp"
}
allow {
protocol = "icmp"
}
}
resource "google_compute_firewall" "allow_iap_ssh" {
name = "certlabpro-pcne-allow-iap-ssh"
network = google_compute_network.main.name
direction = "INGRESS"
source_ranges = ["35.235.240.0/20"]
allow {
protocol = "tcp"
ports = ["22"]
}
}PCNE 规范模式:内部主机名通过连接到 VPC 的 Cloud DNS 私有区域 (private zone) 进行解析。VPC 中的 VM 可以看到此区域的记录;VPC 外部的 VM 则无法看到。用例:为服务(如 api.internal.acme.com、db.internal.acme.com)提供稳定、易读的主机名,这些主机名解析为 VM 的私有 IP。
我们创建区域 internal.acme.com 并添加一个示例 A 记录。生产部署通常会将其与用于混合设置的 Cloud DNS DNS 转发 (DNS forwarding) 结合使用(本地 DNS 查询转发到云区域,反之亦然,通过入站服务器策略实现)。有了这五个模块(provider+API、Shared VPC + 子网 + 流日志、Cloud NAT、防火墙、Cloud DNS 私有区域),PCNE 的底层设施就完成了。
resource "google_dns_managed_zone" "internal" {
name = "certlabpro-pcne-internal"
dns_name = "internal.acme.com."
description = "PCNE lab private DNS zone"
visibility = "private"
private_visibility_config {
networks {
network_url = google_compute_network.main.id
}
}
labels = local.labels
depends_on = [google_project_service.dns]
}
resource "google_dns_record_set" "api_example" {
managed_zone = google_dns_managed_zone.internal.name
name = "api.${google_dns_managed_zone.internal.dns_name}"
type = "A"
ttl = 300
rrdatas = ["10.10.0.10"]
}terraform destroy 会销毁所有资源。Shared VPC 主机项目将被禁用(必须首先移除任何服务项目附件——本实验中没有)。Cloud NAT + router 将被干净地分离。VPC + 子网 + 防火墙将被销毁。Cloud DNS 私有区域将被销毁(示例记录也随之消失)。VPC Flow Logs 将停止摄取日志。
PCNE 涵盖了本实验无法囊括的许多网络方面——Cloud VPN(HA / Classic)、Cloud Interconnect(Dedicated / Partner)、Network Connectivity Center (NCC——辐射型控制平面)、Cross-Cloud Interconnect、Private Service Connect(用于服务 / 端点 / 发布者模式的 PSC)、VPC 之间的 VPC 对等连接(与 Shared VPC 不同)、Cloud Load Balancing(整个 LB 系列——全球 HTTP(S)、区域内部、网络 LB、代理网络 LB)、Cloud CDN、Cloud Armor(WAF / DDoS)、Identity-Aware Proxy (IAP)、Cloud DNS DNS 转发 / 入站服务器策略(混合 DNS 架构)、Cloud DNS DNSSEC、旧版 Default Firewall Rules 策略、组织 / 文件夹范围的分层防火墙策略、Network Intelligence Center(连接测试 / 性能控制面板 / 防火墙洞察 / 网络拓扑)以及 VPC Service Controls 周边(在 [[gcp-pcse]] 中从数据泄露角度进行介绍)。
我们专注于 Shared VPC + 子网 + NAT + 防火墙 + 私有 DNS 这些基本元素,因为它们是所有更高级网络模式的 PCNE 基础。Cloud VPN / Interconnect 连接到同一个 Cloud Router。负载均衡器位于相同的防火墙保护的 VM 前面。PSC 将服务发布到同一个 VPC 中。分层防火墙位于项目级规则之上。掌握这些底层设施。
要了解每个服务的概念性覆盖范围,请参阅此认证页面的浏览、手册和 Editorial 部分。