Cloud NAT 地址和端口概览

本页面介绍了 Cloud NAT 网关如何使用外部 IP 地址,以及它们如何将来源端口分配给使用网关的 Compute Engine 虚拟机实例和 Google Kubernetes Engine (GKE) 节点。

在查看这些信息之前,请先熟悉 Cloud NAT 概览

NAT IP 地址

NAT IP 地址是可在互联网上路由的、地区级外部 IP 地址。如果某台虚拟机在由 Cloud NAT 网关提供的子网中没有外部 IP 地址,它在将数据包发送到互联网上的目标位置时会使用 NAT IP 地址。

如需将 NAT IP 地址分配给 Cloud NAT 网关,请使用以下任一方法:

  • NAT IP 地址自动分配。选择此选项或选择 Google Cloud 默认值时,Cloud NAT 会根据使用网关的虚拟机的数量和为每个虚拟机预留的端口数量自动为网关添加地区级外部 IP 地址。当 Cloud NAT 不再需要某个 NAT IP 地址上的任何来源端口时,还会自动移除该 NAT IP 地址。

    • 当 Cloud NAT 网关添加 NAT IP 地址时,它会创建静态(预留)地区级外部 IP 地址。这些地址会计入每个项目的配额
    • 使用自动分配时,您无法预测将会分配的下一个 IP 地址。如果您需要提前知道(例如为了创建许可名单)可能的 NAT IP 地址集,则应改用手动 NAT IP 地址分配。
    • 如果您日后切换为手动 NAT IP 地址分配,系统会删除自动预留的地区级外部 IP 地址。如需了解详情,请参阅切换分配方法
  • NAT IP 地址手动分配。如果选择此选项,您可以创建静态(预留)地区级外部 IP 地址并将其手动分配给 Cloud NAT 网关。您可以通过修改 Cloud NAT 网关来增加或减少手动分配的 NAT IP 地址的数量。

    • 使用手动 NAT IP 地址分配时,您必须计算 Cloud NAT 网关所需的地区级外部 IP 地址的数量。如果网关的 NAT IP 地址已用尽,Cloud NAT 会丢弃数据包。当您使用 Cloud NAT 日志记录启用错误日志记录功能时,系统会记录已丢弃的数据包。
    • 如需查看示例计算,请参阅端口预留示例

如需查看自动分配或手动分配的 NAT IP 地址的数量上限,请参阅 Cloud NAT 限制

切换分配方法

您可以将 Cloud NAT 网关从自动 NAT IP 地址分配切换为手动 NAT IP 地址分配;但是,NAT IP 地址无法保留。即使自动分配的 NAT IP 地址是静态的,它们也无法切换至手动 NAT IP 地址分配。例如,您无法在开始时使用具有自动分配的 NAT IP 地址的 Cloud NAT 网关,然后在将 NAT 网关切换为手动分配的 NAT IP 地址时使用相同的地址。

Cloud NAT 用于自动 NAT IP 地址分配的一组地区级外部 IP 地址不同于您可以手动选择的一组地区级外部 IP 地址。

排空 NAT IP 地址

当您在配置采用手动 NAT IP 地址分配的 Cloud NAT 网关时,可以选择在需要减少该网关使用的 NAT IP 地址数量时会发生的情况:

  • 如果您移除手动分配的 NAT IP 地址,已建立的 NAT 连接会立即中断。

  • 您可以改为选择排空手动分配的 NAT IP 地址。排空操作会指示 Cloud NAT 网关停止为新连接使用 NAT IP 地址,但继续将其用于已建立的连接。已建立的连接可以正常关闭,而不是突然终止。有关说明,请参见排空与 NAT 关联的外部 IP 地址

端口

Cloud NAT 网关上的每个 NAT IP 地址都提供 64512 个 TCP 来源端口和 64512 个 UDP 来源端口。TCP 和 UDP 均支持每个 IP 地址 65536 个端口,Cloud NAT 不会使用前 1024 个已知(特权)端口。

创建 Cloud NAT 网关时,您需要指定每个虚拟机实例的端口数下限。当 Cloud NAT 网关对虚拟机发送的数据包执行来源网络地址转换 (SNAT) 时,它会更改数据包的 NAT 来源 IP 地址和来源端口。

端口预留过程

Cloud NAT 使用此过程为 Cloud NAT 网关提供的每台虚拟机预配 NAT 来源地址和来源端口元组。当您使用 Cloud NAT 网关为专用 Google Kubernetes Engine 集群提供 NAT 服务时,NAT 来源 IP 地址和来源端口元组的数量将分配给由节点上所有 Pod 共用的整个节点虚拟机。

  1. 确定应为其执行 NAT 的虚拟机内部 IP 地址。Cloud NAT 网关应为其执行 NAT 的虚拟机内部 IP 地址取决于网关已配置为提供的子网 IP 地址范围

    • 如果 Cloud NAT 网关已配置为针对虚拟机的网络接口使用的子网的主要 IP 地址范围执行 NAT,则该网关会同时为这台虚拟机的主要内部 IP 地址及子网的主要 IP 地址范围中的任意一个别名 IP 范围执行 NAT。

    • 如果 Cloud NAT 网关已配置为针对虚拟机网络接口使用的子网的次要 IP 地址范围执行 NAT,则该网关会对该子网的次要 IP 地址范围内的任意别名 IP 范围执行 NAT。

  2. 必要时调整每个虚拟机实例的端口数下限。如果网关对具有多个地址(网络掩码小于 /32)的别名 IP 范围执行 NAT,请将每个虚拟机的端口数下限调整为以下两个值的上限:

    • 您指定的每个虚拟机实例的端口数下限(默认值为 64)
    • 数字 1024

    在其他所有情况下,Cloud NAT 网关都会使用每个虚拟机实例的指定端口数下限作为输入,继续执行下一步。

  3. 为每个虚拟机预留 NAT 来源 IP 地址和来源端口元组。Cloud NAT 网关使用上一步中为每个虚拟机实例给定或调整的端口数下限,计算要分配给虚拟机的 NAT 来源 IP 地址和来源端口元组的数量。

    Cloud NAT 以 2 的幂的倍数分配 NAT 来源 IP 地址和来源端口元组,以使 NAT 来源 IP 地址和来源端口元组的数量大于或等于您为每个虚拟机实例指定的端口数下限。

    • 如果 Cloud NAT 网关使用了两个或更多个 NAT IP 地址,则 NAT 来源 IP 地址和来源端口元组可以跨多个 NAT IP 地址。单个 NAT IP 地址可能没有足够的可用来源端口,无法适应虚拟机所需的 NAT 来源 IP 地址和来源端口元组的数量。

    • Cloud NAT 网关为每个虚拟机分配固定数量的来源 IP 地址和来源端口元组。即使在流量爆发期间,每个虚拟机使用的已分配来源 IP 地址和来源端口元组数都不能超过其数量。

    • 您可以通过增加每个虚拟机值的端口数下限,增加 Cloud NAT 网关分配给每个虚拟机的 NAT 来源 IP 地址和来源端口元组的数量。例如,如果虚拟机在将 5 元组重复用于新的 TCP 连接之前的两分钟延时内需要建立与同一目标的更多新连接,则可能需要增加端口数下限。

增加每个虚拟机的端口数下限

增加现有 Cloud NAT 网关上每个虚拟机的端口数下限时,流量不会中断。但是,如果您使用手动 NAT IP 地址分配,则必须确保网关具有足够数量的 NAT IP 地址:

  • 使用手动 NAT IP 地址分配时,您必须计算所需的 NAT 来源 IP 地址的数量。在增加每个虚拟机的端口数下限之前,请至少为 Cloud NAT 网关分配多个 NAT IP 地址。

  • 使用自动 NAT IP 地址分配时,如果增加每个虚拟机的端口数下限,则会使 Cloud NAT 网关自动获取和分配更多区域外部 IP 地址。

减少每个虚拟机的端口数下限

当您减少现有 Cloud NAT 网关上每个虚拟机的端口数下限时,连接不会排空。已建立的 NAT 连接会立即中断,并且客户端必须建立新的 TCP 连接。

端口和连接

Cloud NAT 网关为虚拟机预留的 NAT 来源 IP 地址和来源端口元组的数量会限制虚拟机可与唯一目标建立的连接数:

  • 唯一目标表示由目标 IP 地址、目标端口和 IP 协议(例如 TCP 或 UDP)组成的唯一 3 元组

  • 连接表示由 NAT 来源 IP 地址和来源端口元组以及唯一的目标 3 元组组成的唯一 5 元组。由于 UDP 协议是无连接的,因此连接的概念简化为与唯一 UDP 数据报关联的 5 元组。

假设 Cloud NAT 网关按照端口预留过程计算的虚拟机固定端口数为 1024。Cloud NAT 网关为虚拟机保留 1024 个唯一的 NAT 来源 IP 地址和来源端口元组组合。Cloud NAT 网关可处理与每个唯一目标 3 元组建立 1024 个并发连接的操作。但是,Cloud NAT 会认为关闭的连接在连接关闭后 120 秒内不可用,这可能会影响同时使用的连接数。

示例:

  • 网关支持使用 TCP 协议与端口 80 上的目标 IP 地址 203.0.113.99 建立 1024 个并发连接。

  • 网关支持使用 TCP 协议与端口 443 上的同一目标 IP 地址再建立 1024 个并发连接。

  • 网关支持使用 TCP 协议与端口 80 上的其他目标 IP 地址再建立 1024 个并发连接。

同时重用端口和端点独立映射

只要目标 3 元组(目标 IP 地址、目标端口、协议)中的至少一项信息发生更改,同一 NAT 来源 IP 地址和来源端口元组就可以同时重用于许多其他连接。

由于 Cloud NAT 使用端点独立映射(如 RFC 5128 第 2.3 节中所定义),因此,如果 Cloud NAT 将同一 NAT 来源 IP 地址和来源端口元组分配给客户端虚拟机的多个内部 IP 地址和临时来源端口,则可以减少客户端虚拟机可与唯一目标 3 元组建立的并发连接数。如果客户端虚拟机拥有大量内部来源 IP 地址并与同一目标 3 元组建立大量连接,则发生这种情况的几率就会增大。客户端虚拟机首次从内部 IP 地址和临时来源端口发送数据包时,Cloud NAT 会在以下各项之间创建多对一端点独立映射:

  • 内部 IP 地址和临时来源端口元组
  • 唯一的 NAT 来源 IP 地址和来源端口元组

例如,当客户端虚拟机使用临时来源端口 10001 从其内部 IP 地址 10.0.0.2 发送数据包时,Cloud NAT 会为 10.0.0.2:10001 分配一个 NAT 来源 IP 地址和来源端口元组,用于从 10.0.0.2:10001 到任何目标 3 元组的所有后续连接。

如果同一虚拟机使用不同的临时来源端口来发送数据包,例如 10.0.0.2:20002,Cloud NAT 还会为从 10.0.0.2:20002 到任何目标 3 元组的所有后续连接分配 NAT 来源 IP 地址和来源端口元组。Cloud NAT 可能会将这个 NAT 来源 IP 地址和来源端口元组分配给这些内部 IP 地址和临时来源端口元组。在某些情况下,这会引发端点独立冲突

如需查看更详细的示例,请参阅端点独立映射冲突示例

减少端点独立冲突

您可以使用以下方法降低端点独立冲突的可能性:

  • 停用端点独立映射。 这样,来自给定来源 IP 地址和端口的新连接可以使用不同于之前所用的 NAT 来源 IP 地址和端口。

  • 增加每个虚拟机实例的最小端口数,以便端口预留过程可以为每个客户端虚拟机分配更多 NAT 来源 IP 地址和来源端口元组。这样可以降低为以下 2 个或更多客户端 IP 地址和临时来源端口元组分配相同的 NAT 来源 IP 地址和来源端口元组的可能性。

  • 将虚拟机实例配置为使用更多临时来源端口:

    • 在 Linux 虚拟机上,您可以使用以下命令将 ip_local_port_range 设置为临时来源端口数最大值 (64512):

      echo 1024 65535 > /proc/sys/net/ipv4/ip_local_port_range
      
    • 在 Windows 虚拟机上,您可以使用以下命令将临时来源 TCP 和 UDP 端口的数量设置为最大值 (64512):

      netsh int ipv4 set dynamicport tcp start=1024 num=64512
      netsh int ipv4 set dynamicport udp start=1024 num=64512
    • 在 GKE 节点上,您可以使用具有特权的 DaemonSet 自动完成此配置。

  • 对于 GKE 集群,请对发送到相关目标的数据包停用在每个节点上执行的来源 NAT。您可以使用以下两种方式之一来执行此操作:

延迟以重复使用 TCP 来源端口

在 Cloud NAT 网关关闭 TCP 连接之后,Google Cloud 会强制延迟两分钟,然后网关可以重复使用相同的 NAT 来源 IP 地址和来源端口元组以及相同的目标(目标 IP 地址、目标端口和协议)。

您无法缩短此延迟;但是,您可以执行以下任一操作:

  • 增加每个虚拟机实例的最小端口数,以便端口预留过程为虚拟机分配更多 NAT 来源 IP 地址和来源端口元组。

  • 如果虚拟机需要使用同一协议快速打开和关闭指向同一目标 IP 地址和目标端口的 TCP 连接,请为虚拟机分配外部 IP 地址并使用防火墙规则来限制未经请求的入站连接,而不是使用 Cloud NAT。

来源端口和安全性

如果您依靠随机选择来源端口作为安全措施,则需要考虑执行以下操作:

示例

以下示例演示了 Cloud NAT 如何为虚拟机保留 NAT 来源地址和来源端口,以及如何为发送到互联网的数据包执行 NAT。

端口预留

以下示例展示了端口预留过程的应用。

假设您要配置 Cloud NAT 网关,以便为子网的主要 IP 地址范围提供 NAT,而使用该子网的虚拟机没有该子网主要 IP 地址范围中的任何别名 IP 范围。将任意除法运算的结果向下舍入到最接近的整数。⌊⌋ 是 FLOOR(最大整数)函数,表示舍弃除法的任何小数结果。

  • 如果您使用手动分配方法为 Cloud NAT 网关配置单个 NAT IP 地址,并且将每个虚拟机实例的端口数下限设置为 64,则网关可为多达 1008 个虚拟机提供 NAT 服务:

    ⌊(1 个 NAT IP 地址)×(每个地址 64512 个端口)/(每个虚拟机 64 个端口)⌋ = 1008 个虚拟机

  • 如果您需要支持超过 1008 个虚拟机,则可以为 Cloud NAT 网关分配第二个 NAT IP 地址。使用两个 NAT IP 地址,将每个虚拟机的端口数下限保持在 64,您可以支持 2016 个虚拟机:

    ⌊(2 个 NAT IP 地址)×(每个地址 64512 个端口)/(每个虚拟机 64 个端口)⌋ = 2016 个虚拟机

  • 如果将每个虚拟机的端口数下限设置为 4096,则每个 NAT IP 地址可支持 15 个虚拟机。此计算结果向下舍入到最接近的整数:

    ⌊(1 个 NAT IP 地址)×(每个地址 64512 个端口)/(每个虚拟机 4096 个端口)⌋ = 15 个虚拟机

端点独立映射冲突

以下示例演示了端点独立映射如何减少从客户端虚拟机到同一目标 3 元组的并发连接数,即使是在客户端虚拟机有足够的可用 NAT 来源 IP 地址和来源端口元组的情况下。

假设您已配置 Cloud NAT 网关,用于为子网的主要 IP 地址范围提供 NAT。您已创建了一个客户端虚拟机,它的一个网络接口的主要内部 IP 地址在该子网中为 10.0.0.2。示例虚拟机没有为其网络接口分配外部 IP 地址。

  1. 虚拟机打开具有以下特征的连接:

    • 来源内部 IP 地址和端口:10.0.0.2:10001
    • 目标 3 元组:203.0.113.1:80(使用 TCP)
    • Cloud NAT 使用以下 NAT 来源 IP 地址和来源端口元组:192.0.2.10:30009
  2. 虚拟机打开具有以下特征的第二个连接:

    • 来源内部 IP 地址和端口:10.0.0.2:10002
    • 目标 3 元组:203.0.113.2:80(使用 TCP)
    • Cloud NAT 也可能选择对此连接使用同一 NAT 来源 IP 地址和来源端口元组 192.0.2.10:30009您可以为不同的客户端 IP 地址和临时来源端口使用相同的 NAT 来源 IP 地址和来源端口元组。
  3. 当第一个连接和第二个连接都处于活跃状态时,Cloud NAT 将无法打开具有以下特征的第三个 TCP 连接:

    • 来源内部 IP 地址和端口与第一个连接的相同:10.0.0.2:10001
    • 目标 3 元组与第二个连接的相同:203.0.113.2:80(使用 TCP)

    第三个连接尝试已放弃,出现了“端点独立冲突”错误,因为由第一个连接建立的端点独立映射要求所有来自 10.0.0.2:10001 的连接必须使用相同的 NAT 来源 IP 地址和来源端口元组 192.0.2.10:30009,但 192.0.2.10:30009 已被指向 203.0.113.2:80 的第二个 TCP 占用。

  4. 为消除歧义,只要满足以下任一条件,本例中后续的连接尝试就会成功:

    • 第一个 TCP 连接已关闭。这样将移除 10.0.0.2:10001192.0.2.10:30009 之间的端点独立映射,因此第三个连接可映射到其他 NAT 来源 IP 地址和来源端口元组,以使用 TCP 与 203.0.113.2:80 进行通信。
    • 第二个 TCP 连接已关闭。这样可释放 10.0.0.2:10001 以使用 TCP 通过 NAT 来源 IP 地址和来源端口 192.0.2.10:30009203.0.113.2:80 进行通信。
    • 第三个连接尝试选择其他临时(内部)来源端口。在此示例中,端点独立映射为内部 NAT 来源 IP 地址以及来源端口 10.0.0.2:1000110.0.0.2:10002 建立了多对一映射,以便在使用 TCP 与 203.0.113.2:80 通信时使用 192.0.2.10:30009。如果第三个连接尝试使用与 1000110002 不同的临时来源端口,则有可能使用 TCP 通过其他 NAT 来源 IP 地址和来源端口与 203.0.113.2:80 进行通信。
    • 关闭端点独立。这样来自 10.0.0.2:10001 的新连接无需使用 192.0.2.10:30009,从而可以使用其他 NAT 来源 IP 地址和端口。

如需了解可用于避免冲突的方法,请参阅减少端点独立冲突

NAT 流

在此例中,主要内部 IP 地址为 10.240.0.4 且没有外部 IP 地址的虚拟机需要从外部 IP 地址 203.0.113.1 下载更新。您已按如下方式配置 nat-gw-us-east 网关:

  • 每个实例的最小端口数:64
  • 手动分配了两个 NAT IP 地址:192.0.2.50192.0.2.60
  • subnet-1 的主要 IP 地址范围提供了 NAT。
Cloud NAT 转换示例(点击可放大)。
Cloud NAT 转换示例(点击可放大)

Cloud NAT 按照端口预留过程为网络中的每个虚拟机预留以下 NAT 来源 IP 地址和来源端口元组。例如,Cloud NAT 网关会为内部 IP 地址为 10.240.0.4 的虚拟机预留 64 个来源端口。NAT IP 地址 192.0.2.50 有 64 个未预留端口,因此网关为该虚拟机预留以下这组 64 个 NAT 来源地址和来源端口元组:

  • 192.0.2.50:34000192.0.2.50:34063

当虚拟机使用 TCP 协议将数据包发送到目标端口 80 上的更新服务器 203.0.113.1 时,会发生以下情况:

  • 虚拟机发送的请求包具有以下属性:

    • NAT 来源 IP 地址:10.240.0.4,虚拟机的主要内部 IP 地址
    • 来源端口:24000,虚拟机操作系统选择的临时来源端口
    • 目标地址:203.0.113.1,更新服务器的外部 IP 地址
    • 目标端口:80,指向更新服务器的 HTTP 流量的目标端口
    • 协议:TCP
  • nat-gw-us-east 网关会对出站流量执行 SNAT,并重写请求数据包的 NAT 来源 IP 地址和来源端口。如果 VPC 网络对 203.0.113.1 目标有下一个跃点为默认互联网网关的路由,则会将修改后的数据包发送到互联网。默认路由通常符合此要求。

    • NAT 来源 IP 地址:192.0.2.50,来自虚拟机预留的 NAT 来源 IP 地址和来源端口元组
    • 来源端口:34022,来自虚拟机预留的来源端口元组之一的未使用的来源端口
    • 目标地址:203.0.113.1,未更改
    • 目标端口:80,未更改
    • 协议:TCP,未更改
  • 当更新服务器发送一个响应数据包时,该数据包会到达具有以下属性的 nat-gw-us-east 网关:

    • NAT 来源 IP 地址:203.0.113.1,更新服务器的外部 IP 地址
    • 来源端口:80,来自更新服务器的 HTTP 响应
    • 目标地址:192.0.2.50,与请求数据包的原始 NAT 来源 IP 地址一致
    • 目标端口:34022,与请求数据包的来源端口一致
    • 协议:TCP,未更改
  • nat-gw-us-east 网关会对响应数据包执行目标网络地址转换 (DNAT),重写响应数据包的目标地址和目标端口,以便将数据包传送到虚拟机:

    • NAT 来源 IP 地址:203.0.113.1,未更改
    • 来源端口:80,未更改
    • 目标地址:10.240.0.4,虚拟机的主要内部 IP 地址
    • 目标端口:24000,与请求数据包的原始临时来源端口一致
    • 协议:TCP,未更改

后续步骤