使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

IP 地址和端口

本页面介绍了 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 地址。这些地址会计入每个项目的配额
    • 使用自动分配时,您无法预测将会分配的下一个 IP 地址。如果您需要提前知道(例如为了创建许可名单)可能的 NAT IP 地址集,则应改用手动 NAT IP 地址分配。
    • 当自动添加的 NAT IP 地址不再使用时,它们会被移除。但是,Cloud NAT 仅在分配给该地址的最后一个虚拟机不再使用任何端口时取消分配地址。因此,当使用 Cloud NAT 的虚拟机数量减少时,您可能看不到 IP 地址减少,因为 Cloud NAT 不会动态地将虚拟机从一个 IP 地址重新分配给另一个 IP 地址,因为重新分配将会中断已建立的连接。只要至少有一个虚拟机正在使用某个 IP 地址,该 IP 地址就会保持活跃状态,并且可以将新的虚拟机分配给它。

      如果您希望能够手动将虚拟机从一个 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 规则的 NAT 网关相关联的 IP 地址,请参阅排空与 NAT 关联的外部 IP 地址。如需排空与使用 NAT 规则的 NAT 网关相关联的 IP 地址,请参阅更新 NAT 规则

端口

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

当 Cloud NAT 网关对虚拟机发送的数据包执行来源网络地址转换 (SNAT) 时,它会更改数据包的 NAT 来源 IP 地址和来源端口。

创建 Cloud NAT 网关时,您可以选择使用静态端口分配动态端口分配

静态端口分配

配置静态端口分配时,您需要指定每个虚拟机实例的端口数下限。

由于所有虚拟机都分配相同数量的端口,因此如果所有虚拟机具有类似的互联网使用量,则静态端口分配效果最佳。如果某些虚拟机使用的端口比其他虚拟机更多,则 Cloud NAT 网关中的端口可能未充分利用。如果互联网用量有所不同,请考虑配置动态端口分配

如果要在网关上配置端点独立映射,则必须使用静态端口分配。

动态端口分配

配置动态端口分配时,您需要指定每个虚拟机实例的端口数下限和上限。

通过配置动态端口分配,可以允许同一 Cloud NAT 网关根据虚拟机的使用量为每个虚拟机分配不同数量的端口。一开始,系统会为虚拟机分配每个虚拟机实例的端口数下限。如果虚拟机即将用完分配给它的所有端口,则分配给该虚拟机的端口数量将加倍。虚拟机可以重复请求更多端口,直到达到每个虚拟机实例的端口数上限。当端口使用量大幅减少时,端口将被释放,并且可以分配给使用相同 NAT 网关的其他虚拟机。

动态端口分配具有以下优点:

  • 减少已分配但未使用的端口数量。

  • NAT 网关监控每个虚拟机的端口使用量,并根据需求修改分配给每个虚拟机的端口数。您无需监控端口用量或调整 NAT 网关配置。

在使用动态端口分配之前,请考虑以下事项:

  • 如果在 Cloud NAT 网关上启用了端点独立映射,则无法配置动态端口分配。如果您需要端点独立映射,请使用静态端口分配

  • 在将其他端口分配给虚拟机时,您可能会看到连接超时。如需了解有助于防止连接中断的策略,请参阅使用动态端口分配减少连接中断

端口预留过程

Cloud NAT 使用此过程为 Cloud NAT 网关提供的每台虚拟机预配 NAT 来源地址和来源端口元组。

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

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

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

  2. 必要时,Cloud NAT 会调整每个虚拟机实例的端口数下限。如果配置了静态端口分配,并且网关为具有多个地址(网络掩码小于 /32)的别名 IP 地址范围执行 NAT,则 Cloud NAT 会将每个虚拟机的端口数下限调整为这两个值当中的最大值:

    • 您指定的每个虚拟机实例的端口数下限

    • 数字 1024

    在其他所有情况下,包括配置动态端口分配时,Cloud NAT 网关会使用指定的每个虚拟机实例端口数下限作为输入,继续执行下一步。如果未指定每个虚拟机实例的端口数下限,则使用默认值:64(静态端口分配)和 32(动态端口分配)。

  3. Cloud NAT 会为每个虚拟机预留 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 地址和来源端口元组的数量是固定的。即使在流量爆发期间,每个虚拟机使用的已分配来源 IP 地址和来源端口元组数都不能超过其数量。

      • 如果您已配置动态端口分配,则来源 IP 地址和来源端口元组的数量可能会根据需要而发生变化。如果虚拟机即将用尽其当前端口分配,则 Cloud NAT 会分配额外的端口,最高达到每个虚拟机实例的指定端口数上限值。在虚拟机的端口使用量低于阈值后,端口会被释放并且可以分配给其他虚拟机。

增加每个虚拟机的端口

如果您已使用静态端口分配配置 Cloud NAT 网关,则在增加网关上每个虚拟机的端口数下限时,流量不会中断。

如果您已使用动态端口分配配置 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 网关,进一步的配置更改可能会中断流量。更改配置后,当前分配给每个虚拟机的端口数可能会暂时重置为配置的最小数量。

端口和连接

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 地址和临时来源端口元组。在某些情况下,这会引发端点独立冲突

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

减少端点独立冲突

您可以更改配置以减少端点独立冲突。如需了解详情,请参阅丢包原因是端点独立冲突

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

在 Cloud NAT 网关关闭 TCP 连接之后,Google Cloud 会强制延迟,然后网关可以重复使用相同的 NAT 源 IP 地址和源端口元组以及相同的目标(目标 IP 地址、目标端口和协议)。延迟时间的长度由 TCP TIME_WAIT 超时设置控制。

如果需要,您可以减少此延迟时间,也可以进行以下更改之一:

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

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

来源端口和安全性

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

  • 增加每个虚拟机实例的最小端口数,以便端口预留过程为虚拟机分配更多 NAT 来源 IP 地址和来源端口元组。 此操作会随机为每个虚拟机分配一系列端口;但是,从该范围中选择的来源端口是有序的。

  • 为虚拟机分配外部 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 时,会发生以下情况:

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

    • 来源 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 网关:

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

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

后续步骤