Cloud NAT 规则

本页概述了适用于 Public NAT 的 Cloud NAT 规则。借助这些规则,您可以定义如何使用 Cloud NAT 连接到互联网。

Public NAT 的 Cloud NAT 规则支持基于来源(预览版)或目标地址的来源网络地址转换 (SNAT)。

NAT 规则

默认情况下,当您为 Public NAT 配置 Cloud NAT 网关时,由该 NAT 网关转换的数据包将使用同一组 NAT IP 地址访问所有互联网地址。如果您需要更好地控制由 Cloud NAT 转换的数据包,则可以添加 NAT 规则。

NAT 规则定义匹配条件和相应的操作。指定 NAT 规则后,每个数据包都将与每个 NAT 规则匹配。如果数据包与规则中设置的条件相匹配,则会发生与该匹配相对应的操作。

Public NAT 的 NAT 规则同时支持来源地址和目标地址匹配:

  • 在基于来源的规则(预览版)中,系统会根据数据包的来源 IP 地址来匹配数据包。仅支持 IPv4 源地址。
  • 在基于目的地的规则中,数据包按其目的地 IP 地址进行匹配。仅支持 IPv4 目标地址。

不允许在单个 NAT 规则中同时使用基于来源的条件和基于目标的条件。如需了解详情,请参阅 NAT 规则规范

Cloud NAT 规则配置示例

以下示例说明了当目标仅允许从少量 IP 地址进行访问时如何使用 NAT 规则。我们建议从专用子网中的 Google Cloud 虚拟机到此类目标的流量仅通过允许的 IP 地址进行 SNAT 转换。我们建议您不要将这些 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 时,使用 203.0.113.20 进行 NAT。
    2. Cloud NAT Gateway 1 中的 NAT 规则 2:当目标为 198.51.100.30198.51.100.31 时,使用 203.0.113.30 进行 NAT。
  2. 为该区域的其他子网创建一个名为 Cloud NAT Gateway 2 的网关,并将 NAT IP 地址分配为 203.0.113.10。此步骤不需要 NAT 规则。

NAT 规则规范

  • Cloud NAT 支持基于来源和目标的规则。每条规则都定义了一个基于源地址或目标地址(但不能同时基于两者)的条件。
  • 规则优先级可唯一标识 NAT 规则,范围为 0(最高优先级)到 65,000(最低优先级)。两条规则不能具有相同的优先级。
  • 每项 NAT 配置都有一条默认规则:
    • 如果同一 NAT 配置中没有其他 NAT 规则匹配,则应用默认规则。
    • 默认规则的规则优先级为 65001
    • 对于基于来源和基于目的地的规则,默认规则的 IP CIDR 范围均为 0.0.0.0/0
  • 仅当 NAT IP 分配选项的值为 MANUAL_ONLY 时,才支持 Cloud NAT 规则。
  • 在给定规则中配置的所有 IP 地址都必须属于同一层级。

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

  • 匹配条件中的 IP CIDR 范围不得跨 NAT 规则重叠。最多只能有一条规则适用于任何给定数据包。如果数据包同时符合基于来源的规则和基于目标的规则,Cloud NAT 会应用优先级较高的规则。

    您不能创建以 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 地址和目标 IP 地址。

属性名称 说明
source.ip 数据包的来源 IP 地址
destination.ip 数据包的目标 IP 地址

运维

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

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

表达式示例

您可以根据来源地址或目的地地址(但不能同时根据两者)来匹配数据包。

基于来源的匹配示例

匹配来源 IP 地址为 10.0.0.25 的数据包:

"source.ip == '10.0.0.25'"

匹配来源 IP 地址为 10.0.0.2510.0.0.26 的数据包:

"source.ip == '10.0.0.25' || source.ip == '10.0.0.26'"

匹配来源 IP 地址范围为 10.0.2.0/24 的数据包:

"inIpRange(source.ip, '10.0.2.0/24')"

匹配来源 IP 地址为 10.0.0.25 或来源 IP 地址范围为 10.0.2.0/24 的数据包:

"source.ip == '10.0.0.25' || inIpRange(source.ip, '10.0.2.0/24')"

基于目的地的匹配示例

匹配目标 IP 地址为 198.51.100.20 的数据包:

"destination.ip == '198.51.100.20'"

匹配目标 IP 地址为 198.51.100.20198.51.100.21 的数据包:

"destination.ip == '198.51.100.20' || destination.ip == '198.51.100.21'"

匹配目标 IP 地址范围为 198.51.100.10/30 的数据包:

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

匹配目标 IP 地址为 198.51.100.20 或目标 IP 地址范围为 198.51.100.10/30 的数据包:

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

后续步骤