使用 Cloud NAT NAT 规则

1. 概览

Cloud NAT 是一种强大的工具:借助它,Compute Engine 和 Google Kubernetes Engine (GKE) 工作负载能够以可伸缩且安全的方式访问互联网资源,而不会使用外部 IP 将在其上运行的工作负载暴露给外部访问。

Cloud NAT 采用无代理设计,直接在 Andromeda SDN 层实现 NAT。因此,您的工作负载不会对性能产生任何影响,并且可以毫不费力地扩展到许多虚拟机、区域和 VPC。

NAT 规则是对 Cloud NAT 的扩展。通过 Cloud NAT 中的 NAT 规则功能,您可以创建访问权限规则,以便定义如何使用 Cloud NAT 连接到互联网。目前,NAT 规则支持根据目标地址选择源 NAT 地址。

如果没有 NAT 规则,启用了 Cloud NAT 的虚拟机会使用同一组 NAT IP 地址访问所有互联网地址。

有时,NAT 用例会要求 Cloud NAT 针对特定目标使用不同的来源 IP 地址。NAT 规则定义了一个匹配和一个相应的操作。您指定 NAT 规则后,系统就会将数据包与每条 NAT 规则进行匹配。如果规则匹配成功,则执行与规则匹配的操作。

如需了解详情,请参阅有关 NAT 规则的文档部分

学习内容

  • 如何设置 Cloud NAT 网关,以便为 NAT 规则做好准备。
  • 如何使用通用表达式语言 (CEL) 设计 NAT 规则。
  • 如何创建 NAT 规则并将其附加到 NAT 网关。
  • 如何从实例测试 NAT 规则。
  • 如何更新 NAT 网关的规则。
  • 如何删除 NAT 规则并还原为默认的 Cloud NAT 行为。

所需条件

  • 具备 Google Compute Engine 的基础知识
  • 网络组建和管理以及 TCP/IP 基础知识
  • Unix/Linux 命令行基础知识
  • 完成 GCP 中的网络导览(例如 Google Cloud 中的网络实验)会很有帮助。
  • 了解 Cloud NAT 基础知识

2. 使用 Google Cloud 控制台和 Cloud Shell

为了与 GCP 交互,我们将在整个实验中同时使用 Google Cloud 控制台和 Cloud Shell。

Google Cloud Console

您可以访问 https://console.cloud.google.com 访问 Cloud 控制台。

75eef5f6fd6d7e41

自定进度的环境设置

  1. 登录 Cloud 控制台,然后创建一个新项目或重复使用现有项目。 如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

96a9c957bc475304

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • 项目名称是您用于该项目的个人标识符。您完全可以使用任何名称,只要遵循其命名惯例即可。
  • 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常您不在乎这是什么在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为 PROJECT_ID),因此,如果您不喜欢它,可以随机生成一个 ID;或者,您也可以尝试自己的项目 ID,看看它是否可用。然后,它会“冻结”创建项目后
  1. 接下来,您需要在 Cloud 控制台中启用结算功能,才能使用 Google Cloud 资源。

运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。请务必按照“清理”部分部分,其中会指导您如何关停资源,以免产生超出本教程范围的结算费用。Google Cloud 的新用户符合参与 300 美元的免费试用计划的条件。

启动 Cloud Shell

虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

在 GCP 控制台中,点击右上角工具栏上的 Cloud Shell 图标:

bce75f34b2c53987.png

预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:

f6ef2b5f13479f3a.png

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。只需一个浏览器,即可完成本实验中的所有工作。

3. 实验设置

在本实验中,您将使用一个项目,并创建两个 VPC,每个 VPC 各有一个子网。您将预留外部 IP 地址,然后创建和配置 Cloud NAT 网关(具有 Cloud Router)、两个提供方实例以及使用方实例。验证默认的 Cloud NAT 行为后,您将创建 Cloud NAT 自定义规则并验证其行为。

网络架构概览:

815147de3de0bd19

4. 预留外部 IP 地址

我们预留了所有外部 IP 地址,以便在本实验中使用。这将有助于您在使用方和提供方 VPC 中编写所有相关的 NAT 和防火墙规则。

在 Cloud Shell 中:

gcloud compute addresses  create nat-address-1 nat-address-2 nat-address-3 producer-address-1 producer-address-2 --region us-east4

输出:

Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-1].
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-2].
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-3].
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-1].
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-2].

填充预留为环境变量的 IP 地址。

export natip1=`gcloud compute addresses list --filter name:nat-address-1 --format="get(address)"`
export natip2=`gcloud compute addresses list --filter name:nat-address-2 --format="get(address)"`
export natip3=`gcloud compute addresses list --filter name:nat-address-3 --format="get(address)"`
export producerip1=`gcloud compute addresses list --filter name:producer-address-1 --format="get(address)"`
export producerip2=`gcloud compute addresses list --filter name:producer-address-2 --format="get(address)"`

预计不会有任何输出,但请确认地址已正确填充。我们输出所有环境变量的值。

$ env | egrep '^(nat|producer)ip[1-3]'

输出:

producerip1=<Actual Producer IP 1>
producerip2=<Actual Producer IP 2>
natip1=<NAT IP 1>
natip2=<NAT IP 2>
natip3=<NAT IP 3>

5. 提供方 VPC 和实例设置。

现在,我们将为提供方资源创建资源。在生产者 VPC 中运行的实例将使用两个公共 IP (Producer-address-1) 提供面向互联网的服务和“Producer-address-2”,了解所有最新动态。

首先,创建 VPC。在 Cloud Shell 中:

gcloud compute networks create producer-vpc --subnet-mode custom

输出:

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/networks/producer-vpc].
NAME      SUBNET_MODE  BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4
producer-vpc  CUSTOM       REGIONAL

Instances on this network will not be reachable until firewall rules
are created. As an example, you can allow all internal traffic between
instances as well as SSH, RDP, and ICMP by running:

$ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp,udp,icmp --source-ranges <IP_RANGE>
$ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp:22,tcp:3389,icmp

接下来,我们在 us-east4 中创建子网。在 Cloud Shell 中:

gcloud compute networks subnets create producer-e4 \
   --network producer-vpc --range 10.0.0.0/24 --region us-east4

输出:

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/regions/us-east4/subnetworks/producer-e4].
NAME              REGION       NETWORK       RANGE
producer-e4       us-east4  producer-vpc  10.0.0.0/24

接下来,我们来创建 VPC 防火墙规则,以允许 NAT IP 地址访问端口 8080 上的生产者实例。

对于第一条规则,在 Cloud Shell 中运行以下命令:

gcloud compute firewall-rules create producer-allow-8080 \
  --network producer-vpc --allow tcp:8080 \
  --source-ranges $natip1,$natip2,$natip3

输出:

Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/firewalls/producer-allow-8080].
Creating firewall...done.
NAME                 NETWORK       DIRECTION  PRIORITY  ALLOW     DENY  DISABLED
producer-allow-8080  producer-vpc  INGRESS    1000      tcp:8080        False

下一步是创建两个提供方实例。

生产者实例将在 Docker Hub 提供的 Docker 容器中运行 IP echo 服务(源代码可在服务作者的 GitHub 代码库中找到)。

为了快速为实例预配所有必需的软件,我们将使用在 Compute Engine 上部署容器功能。

为了能够编写 NAT 规则,我们将为每个实例预配不同的预留 IP 地址。

创建第一个实例。在 Cloud Shell 中:

gcloud compute instances create-with-container producer-instance-1 \
--zone=us-east4-a --machine-type=e2-medium \
--network-interface=address=producer-address-1,network-tier=PREMIUM,subnet=producer-e4 \
--container-image=mpolden/echoip --container-restart-policy=always

输出:

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/zones/us-east4-a/instances/producer-instance-1].
NAME                 ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
producer-instance-1  us-east4-a  e2-medium                  10.0.0.2     <producer IP 1>  RUNNING

然后创建第二个实例。在 Cloud Shell 中:

gcloud compute instances create-with-container producer-instance-2 \
 --zone=us-east4-a --machine-type=e2-medium \
--network-interface=address=producer-address-2,network-tier=PREMIUM,subnet=producer-e4 \
--container-image=mpolden/echoip --container-restart-policy=always

输出:

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/zones/us-east4-a/instances/producer-instance-2].
NAME                 ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
producer-instance-2  us-east4-a  e2-medium                  10.0.0.3     <producer IP 2>  RUNNING

6. 设置使用方 VPC、Cloud NAT 和实例

现在您已经创建了提供方服务,接下来可以创建使用方 VPC 及其 Cloud NAT 网关了。

创建 VPC 和子网后,我们将添加一条简单的入站防火墙规则,以允许针对 TCP 源 IP 地址范围的 IAP。这样,我们就可以使用 gcloud 直接通过 SSH 连接到使用方实例。

然后,我们将在手动分配模式下创建一个简单的 Cloud NAT 网关,并将预留地址“nat-address-1”及其关联。在此 Codelab 的后续部分中,我们将更新网关的配置以添加自定义规则。.

首先,创建 VPC。在 Cloud Shell 中:

gcloud compute networks create consumer-vpc --subnet-mode custom

输出:

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/networks/consumer-vpc].
NAME      SUBNET_MODE  BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4
consumer-vpc  CUSTOM       REGIONAL

Instances on this network will not be reachable until firewall rules
are created. As an example, you can allow all internal traffic between
instances as well as SSH, RDP, and ICMP by running:

$ gcloud compute firewall-rules create <FIREWALL_NAME> --network consumer-vpc --allow tcp,udp,icmp --source-ranges <IP_RANGE>
$ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp:22,tcp:3389,icmp

接下来,我们在 us-east4 中创建一个子网。在 Cloud Shell 中:

gcloud compute networks subnets create consumer-e4 \
   --network consumer-vpc --range 10.0.0.0/24 --region us-east4

输出:

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/regions/us-east4/subnetworks/consumer-e4].
NAME              REGION       NETWORK       RANGE
consumer-e4       us-east4  consumer-vpc  10.0.0.0/24

接下来,我们来创建一条 VPC 防火墙规则,以允许 IAP 范围地址访问端口 22 上的使用方实例。

对于第一条防火墙规则,请通过 Cloud Shell 运行以下命令:

gcloud compute firewall-rules create consumer-allow-iap \
  --network consumer-vpc --allow tcp:22 \
  --source-ranges 35.235.240.0/20

输出:

Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/firewalls/consumer-allow-iap].
Creating firewall...done.
NAME                 NETWORK       DIRECTION  PRIORITY  ALLOW     DENY  DISABLED
consumer-allow-iap  consumer-vpc  INGRESS    1000      tcp:22        False

创建 NAT 网关之前,我们需要先创建一个 Cloud Router 实例(我们使用专用 ASN 编号,但该编号与本实验的活动无关)。在 Cloud Shell 中:

gcloud compute routers create consumer-cr \
--region=us-east4 --network=consumer-vpc \
 --asn=65501

输出:

Creating router [consumer-cr]...done.
NAME         REGION       NETWORK
consumer-cr  us-east4  consumer-vpc

然后创建 NAT 网关实例。在 Cloud Shell 中:

gcloud compute routers nats create consumer-nat-gw \
    --router=consumer-cr \
    --router-region=us-east4 \
    --nat-all-subnet-ip-ranges \
    --nat-external-ip-pool=nat-address-1

输出:

Creating NAT [consumer-nat-gw] in router [consumer-cr]...done.

创建使用方测试实例。我们在此处填充预留的提供方 IP,以便稍后在实例中引用它们。在 Cloud Shell 中:

gcloud compute instances create consumer-instance --zone=us-east4-a \
--machine-type=e2-medium --network-interface=subnet=consumer-e4,no-address \
--metadata=producer-service-ip1=$producerip1,producer-service-ip2=$producerip2

输出:

Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/zones/us-east4-a/instances/consumer-instance].
NAME               ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
consumer-instance  us-east4-a  e2-medium                  10.0.0.2                  RUNNING

7. 验证默认 Cloud NAT 行为

此时,使用方实例使用默认 Cloud NAT 行为,该行为使用相同的预留 IP“nat-address-1”与所有外部地址进行通信

我们先验证此行为,然后再在 Cloud NAT 中使用新的 NAT 规则功能。

通过 SSH 连接到使用方实例。在 Cloud Shell 中:

gcloud compute ssh consumer-instance --zone=us-east4-a

现在,您应该已经位于实例 shell 中。

示例输出(为简洁起见,完整输出被截断)

No zone specified. Using zone [us-east4-a] for instance: [consumer-instance].
External IP address was not found; defaulting to using IAP tunneling.
...
...
<username>@consumer-instance:~$

我们首先从使用方实例中提取两个提供方 IP,并将它们作为环境变量进行填充

export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"`

export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`

然后尝试通过 curl 命令连接到这两个提供方实例,并观察返回的源 IP 地址。

<username>@consumer-instance:~$ curl http://$producerip1:8080
34.136.8.83
<username>@consumer-instance:~$ curl http://$producerip2:8080
34.136.8.83

您应该会看到这两个端点返回的是同一 IP 地址,该地址等于外部预留 IP“nat-address-1”的值。

同样,对任何外部 IP 反射器服务的 curl 都应显示相同的 IP,例如:

<username>@consumer-instance:~$ curl http://ifconfig.co
34.136.8.83
<username>@consumer-instance:~$ curl http://ifconfig.me
34.136.8.83
<username>@consumer-instance:~$ curl http://ip.fyr.io
34.136.8.83

暂时退出实例的 SSH 会话,在配置好 NAT 规则后,我们将通过 SSH 恢复会话。

8. 创建 Cloud NAT 规则

NAT 规则使用通用表达式语言语法编写。如需详细了解规则表达式语言,请参阅规则表达式语言

您也可以使用 gcloud 命令向现有 NAT 网关添加 NAT 规则。我们将探讨创建 Cloud NAT 规则的这两个选项。

首先,我们来创建一个 NAT 规则 YAML 文件。

在 Cloud Shell 中:

export projectid=`gcloud config get-value project`

cat <<EOF >natrulesfile.txt
rules:
 - ruleNumber: 100
   match: destination.ip == '$producerip2'
   action:
     sourceNatActiveIps:
     -  /projects/$projectid/regions/us-east4/addresses/nat-address-2
EOF

然后,使用此规则文件更新现有 NAT 网关。在 Cloud Shell 中:

gcloud alpha compute routers nats update consumer-nat-gw \
    --router=consumer-cr \
    --rules=natrulesfile.txt \
    --router-region=us-east4

您应该会看到以下输出:

Updating nat [consumer-nat-gw] in router [consumer-cr]...done.

验证是否已成功配置规则。在 Cloud Shell 中:

gcloud alpha compute routers nats rules list \
--nat=consumer-nat-gw --router=consumer-cr \
--router-region=us-east4

您应该会看到以下输出:

RULE_NUMBER  MATCH
100          destination.ip == '35.192.142.134'

我们尝试仅使用 gcloud 命令重新创建同一规则。首先,删除现有规则。在 Cloud Shell 中:

gcloud alpha compute routers nats rules delete 100 \
--nat=consumer-nat-gw --router=consumer-cr \
--router-region=us-east4 --quiet

您应该会看到以下输出:

Updated [https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/routers/consumer-cr]

然后,使用此 gcloud 命令重新创建该规则。在 Cloud Shell 中:

gcloud alpha compute routers nats rules create 100 \
 --match='destination.ip == "'$producerip2'"' \
--source-nat-active-ips=nat-address-2 --nat=consumer-nat-gw \
 --router=consumer-cr --router-region=us-east4

您应该会看到以下输出:

Creating Rule [100] in NAT [consumer-nat-gw]...done.

请重复前面的命令,再次验证规则是否已成功创建。这一次,我们将添加 YAML 格式设置开关,以查看相应规则的完整详情。

在 Cloud Shell 中:

gcloud alpha compute routers nats rules list\
 --nat=consumer-nat-gw --router=consumer-cr \
--router-region=us-east4  --format=yaml

您应该会看到以下输出:

---
action:
  sourceNatActiveIps:
  - https://www.googleapis.com/compute/alpha/projects/<Project-ID>/regions/us-east4/addresses/nat-address-2
match: destination.ip == <actual IP for producer-IP 2>
ruleNumber: 100

最后,请注意,现在“nat-address1”和“nat-address-2”外部地址会显示为“IN_USE”。如需查看该信息,请在 Cloud Shell 中运行以下命令:

$ gcloud compute addresses list

您应该会看到以下输出(实际 IP 地址应与您预留的地址匹配):

NAME                ADDRESS/RANGE   TYPE      PURPOSE  NETWORK  REGION       SUBNET  STATUS
nat-address-1       34.136.8.83     EXTERNAL                    us-east4          IN_USE
nat-address-2       34.70.137.35    EXTERNAL                    us-east4          IN_USE
nat-address-3       34.135.103.88   EXTERNAL                    us-east4          RESERVED
producer-address-1  34.66.0.105     EXTERNAL                    us-east4          IN_USE
producer-address-2  35.192.142.134  EXTERNAL                    us-east4          IN_USE

9. 验证 Cloud NAT 规则行为

此时,使用方实例应使用创建的 Cloud NAT 规则,以便使用 nat-address-2 与 Producer-address-2 进行通信。

我们来验证此行为。通过 SSH 连接到使用方实例。在 Cloud Shell 中:

gcloud compute ssh consumer-instance --zone=us-east4-a

现在,您应该已经位于实例 shell 中。

示例输出(为简洁起见,完整输出被截断)

No zone specified. Using zone [us-east4-a] for instance: [consumer-instance].
External IP address was not found; defaulting to using IAP tunneling.
...
...
<username>@consumer-instance:~$

我们首先从使用方实例中提取两个提供方 IP,并将它们作为环境变量进行填充

export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"`

export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`

然后尝试通过 curl 命令连接到这两个提供方实例,并观察返回的源 IP 地址。

<username>@consumer-instance:~$ curl http://$producerip1:8080
34.136.8.83
<username>@consumer-instance:~$ curl http://$producerip2:8080
34.70.137.35

现在,您应该会看到这两个端点都返回了不同的 IP 地址,第一个 IP 地址应该与默认行为相同。第二个 IP 地址应等于“nat-address-2”添加新 NAT 规则后生效。

任何外部 IP 反射器服务的 curl 都应仍显示与默认行为相同的 IP,例如:

<username>@consumer-instance:~$ curl http://ifconfig.co
34.136.8.83
<username>@consumer-instance:~$ curl http://ifconfig.me
34.136.8.83
<username>@consumer-instance:~$ curl http://ip.fyr.io
34.136.8.83

暂时退出实例的 SSH 会话,我们将通过 SSH 返回测试地址排空。

10. 更新(&G)删除 Cloud NAT 规则

您可以更新现有 Cloud NAT 规则。例如,您可以关联新的 IP 地址,排空与现有规则关联的现有 IP 地址。

我们来按如下方式更新 NAT 规则文件:

在 Cloud Shell 中:

export projectid=`gcloud config get-value project`

cat <<EOF >natrulesfile.txt
rules:
 - ruleNumber: 100
   match: destination.ip == '$producerip2'
   action:
     sourceNatDrainIps:
     -  /projects/$projectid/regions/us-east4/addresses/nat-address-2
     sourceNatActiveIps:
     -  /projects/$projectid/regions/us-east4/addresses/nat-address-3
EOF

这个新文件的作用现在是“nat-address-2”处于已排空状态然后添加“nat-address-3”有效状态这应该可以让使用 nat-address-2 的现有连接正常终止,而仅使用 nat-address-3 创建新连接。

然后,使用此规则文件更新现有 NAT 网关。在 Cloud Shell 中:

gcloud alpha compute routers nats update consumer-nat-gw \
    --router=consumer-cr \
    --rules=natrulesfile.txt \
    --router-region=us-east4

您应该会看到以下输出:

Updating nat [consumer-nat-gw] in router [consumer-cr]...done.

验证是否已成功配置规则。在 Cloud Shell 中:

gcloud alpha compute routers nats rules list \
--nat=consumer-nat-gw --router=consumer-cr \
--router-region=us-east4 --format=yaml

您应该会看到以下输出:

---
action:
  sourceNatActiveIps:
  - https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-3
  sourceNatDrainIps:
  - https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-2
match: destination.ip == '35.192.142.134'
ruleNumber: 100

请注意“nat-address-2”现已进入“已排空”状态我们将留给您做练习,以验证来自使用方 VPC 的新连接现在是否使用了正确的 NAT IP。

最后,从 Cloud NAT 网关删除 NAT 规则并还原为默认行为。您可以使用以下 gcloud 命令。在 Cloud Shell 中:

gcloud alpha compute routers nats rules delete 100 \
 --nat=consumer-nat-gw --router=consumer-cr \
 --router-region=us-east4 --quiet

您应该会看到以下输出:

Updated [https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/routers/consumer-cr]

为了验证是否不再存在 NAT 规则,我们使用 NAT 网关描述命令

gcloud alpha compute routers nats describe consumer-nat-gw \
 --router=consumer-cr --router-region=us-east4

您应该会看到以下输出:

enableEndpointIndependentMapping: false
name: consumer-nat-gw
natIpAllocateOption: MANUAL_ONLY
natIps:
- https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-1
sourceSubnetworkIpRangesToNat: ALL_SUBNETWORKS_ALL_IP_RANGES

请注意,没有什么“规则”:部分。指示未配置 NAT 规则。

11. 清理步骤

为避免重复收费,您应删除与此 Codelab 关联的所有资源。

首先删除所有实例。

在 Cloud Shell 中:

gcloud compute instances delete consumer-instance \
producer-instance-1 producer-instance-2 \
 --zone us-east4-a --quiet

预期输出:

Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/consumer-instance].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/producer-instance-1].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/producer-instance-2].

接下来,删除 Cloud Router 路由器。在 Cloud Shell 中:

gcloud compute routers delete consumer-cr \
--region us-east4 --quiet

您应该会看到以下输出:

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/routers/consumer-cr].

释放所有外部 IP 地址。在 Cloud Shell 中:

gcloud compute addresses delete nat-address-1 \
 nat-address-2 nat-address-3 producer-address-1 \
producer-address-2 --region us-east4 --quiet

您应该会看到以下输出:

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-1].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-2].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-3].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-1].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-2].

删除 VPC 防火墙规则。在 Cloud Shell 中:

gcloud compute firewall-rules delete consumer-allow-iap \
 producer-allow-8080 --quiet

您应该会看到以下输出:

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/consumer-allow-iap].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/producer-allow-8080].

删除子网。在 Cloud Shell 中:

gcloud compute networks subnets delete consumer-e4 \
producer-e4 --region=us-east4 --quiet

您应该会看到以下输出:

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/consumer-e4].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/producer-e4].

最后,我们来删除 VPC。在 Cloud Shell 中:

gcloud compute networks delete consumer-vpc \
producer-vpc --quiet

您应该会看到以下输出:

Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/consumer-vpc].
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/producer-vpc].

12. 恭喜!

您已完成 Cloud NAT 规则实验!

所学内容

  • 如何设置 Cloud NAT 网关,以便为 NAT 规则做好准备。
  • 如何使用通用表达式语言 (CEL) 设计 NAT 规则。
  • 如何创建 NAT 规则并将其附加到 NAT 网关。
  • 如何从实例测试 NAT 规则。
  • 如何更新 NAT 网关的规则。
  • 如何删除 NAT 规则并还原为默认的 Cloud NAT 行为。

后续步骤

  • 尝试创建更复杂的 NAT 规则,如此示例所示
  • 探索排空 NAT IP 地址并观察连接的影响。
  • 详细了解 Google Cloud Platform 上的网络

©Google, Inc. 或其关联公司。保留所有权利。请勿散布。