Cloud NAT 规则

NAT 规则功能可让您创建访问规则,用于定义 Cloud NAT 如何连接到互联网。NAT 规则支持基于目标地址的来源 NAT。

配置没有 NAT 规则的 NAT 网关时,使用 NAT 网关的虚拟机将使用同一组 NAT IP 地址访问所有互联网地址。如果您需要更好地控制通过 Cloud NAT 的数据包,则可以添加 NAT 规则。NAT 规则定义匹配条件和相应的操作。指定 NAT 规则后,每个数据包都将与每个 NAT 规则匹配。如果数据包与规则中设置的条件相匹配,则会发生与该匹配相对应的操作。

Cloud NAT 规则配置示例

以下示例说明了当目标仅允许从少量 IP 地址进行访问时如何使用 NAT 规则。我们建议从专用子网中的 Google Cloud 虚拟机到这些目标的流量仅通过允许的 IP 地址进行源 NAT 转换。我们建议您不要将这些 IP 地址用于其他目标。

对于 Subnet-1 (10.10.10.0/24)(位于 VPC 网络 test 的区域 A 中)的虚拟机,请考虑以下要求:

  • 虚拟机必须使用 NAT IP 地址 203.0.113.20 将流量发送到目标 198.51.100.20/30
  • 虚拟机必须使用 NAT IP 地址 203.0.113.30 才能将流量发送到目标 198.51.100.30198.51.100.31
  • 虚拟机必须使用 NAT IP 地址 203.0.113.40 才能向任何其他互联网目标发送流量。

此 VPC 网络还包含同一区域中的两个额外子网。这些虚拟机必须使用 NAT IP 地址 203.0.113.10 将流量发送到任何目标。

包含两个 Cloud NAT 网关的 Cloud NAT 配置。
具有两个 Cloud NAT 网关的 Cloud NAT 配置(点击可放大)。

您可以对此示例使用 NAT 规则,但需要两个 NAT 网关,因为 Subnet-1 (10.10.10.0/24) 具有与其他子网不同的 NAT 规则。如需创建此配置,请执行以下步骤:

  1. 使用 NAT IP 地址 203.0.113.40Subnet-1 创建一个名为 Cloud NAT Gateway 1 的网关,并添加以下规则:
    1. Cloud NAT Gateway 1 中的 NAT 规则 1:当目标为 198.51.100.20/30 时,使用源 NAT 和 203.0.113.20
    2. Cloud NAT Gateway 1 中的 NAT 规则 2:当目标为 198.51.100.30198.51.100.31 时,使用源 NAT 和 203.0.113.30
  2. 为该区域的其他子网创建一个名为 Cloud NAT Gateway 2 的网关,并将 NAT IP 地址分配为 203.0.113.10。此步骤不需要 NAT 规则。

NAT 规则规范

在使用 NAT 规则之前,请注意以下规范:

  • 规则编号可唯一标识 NAT 规则。两条规则不能具有相同的规则编号。
  • 每项 NAT 配置都有一条默认规则:
    • 如果同一 NAT 配置中没有其他 NAT 规则匹配,则应用默认规则。
    • 默认规则的规则号为 65001
    • 默认规则的目标 IP 地址 CIDR 范围为 0.0.0.0/0
  • 仅当 NAT IP 分配选项的值为 MANUAL_ONLY 时,才支持 Cloud NAT 规则。
  • 在给定规则中配置的所有 IP 地址都必须属于同一层级。

    您不能在同一规则(包括默认规则)中同时使用高级层级和标准层级 IP 地址。

  • 匹配条件中的目标 IP 地址 CIDR 范围不得跨 NAT 规则重叠。最多只能有一条与任何给定数据包匹配的规则。

    您不能创建目标 IP 地址 CIDR 范围为 0.0.0.0/0 的 NAT 规则,因为默认规则中使用了该范围。

  • NAT 规则中的 NAT IP 地址不得重叠。

  • 规则必须具有非空 Active 或非空 Drain IP 地址。如果规则的 Active IP 地址为空,则与 NAT 规则匹配的新连接会被丢弃。

  • NAT 规则无法添加到启用了端点独立映射的 NAT 网关。您无法在包含 NAT 规则的 NAT 网关上启用端点独立映射。

此外,所有虚拟机都会根据每个 Cloud NAT 规则的每个虚拟机的最小端口值为其分配端口。如果从 NAT 规则分配给虚拟机的端口已用尽,则与 NAT 规则匹配的新连接会断开。

例如,如果您为每个虚拟机配置 4,096 个端口,并且有 16 个虚拟机和 2 个 NAT 规则(rule1 具有 1 个 IP 地址,rule2 具有 2 个 IP 地址),以及具有 2 个 IP 地址的默认规则 (default),则所有 16 个虚拟机将获得 4,096 每个 NAT 规则包中的端口。在此示例中,defaultrule2 虚拟机的所有虚拟机都没有问题,但 rule1 无法为其所有虚拟机分配端口。因此,来自需要流经 rule1 的虚拟机的流量可能会被丢弃,并显示由于资源未使用默认规则而导致资源用尽的迹象。

规则表达式语言

NAT 规则使用通用表达式语言语法编写。

表达式需要两个组成部分:

  • 可以在规则表达式中检查的属性。
  • 可以作为表达式的一部分对属性执行的操作。

例如,以下表达式在操作 inIpRange() 中使用属性 destination.ip198.51.100.0/24。在这种情况下,如果 destination.ip198.51.100.0/24 IP 地址范围内,则表达式返回 true。

inIpRange(destination.ip, '198.51.100.0/24')

NAT 规则仅支持以下特性和操作:

特性

特性表示来自传出数据包的信息,例如目标 IP 地址。

特性名称 说明
destination.ip 数据包的目标 IP 地址

运维

以下参考文档介绍了可用于属性定义的规则表达式的运算符。

操作 说明
inIpRange(string, string) -> bool 如果 IP CIDR 范围 Y 包含 IP 地址 X,则 inIpRange(X, Y) 返回 true。
|| 逻辑运算符。如果 x 或 y 为 true,则 x || y 返回 true。
== 等于运算符。如果 x 等于 y,x == y 返回 true。

表达式示例

匹配目标 IP 地址为 198.51.100.20 的流量。

"destination.ip == '198.51.100.20'"

匹配目标 IP 地址为 198.51.100.10/30198.51.100.20 的流量。

"inIpRange(destination.ip, '198.51.100.10/30') || destination.ip == '198.51.100.20'"

后续步骤