IP 地址和端口

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

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

Public NAT IP 地址

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

如需将网络地址转换 (NAT) IP 地址分配给 Public NAT 网关,请使用以下任一方法:

  • NAT IP 地址自动分配。选择此方法或选择 Google Cloud 默认值时,Public NAT 会根据以下内容自动向您的网关添加区域级外部 IP 地址:

    • 您选择的网络层级
    • 使用网关的虚拟机数量
    • 为每个虚拟机预留的端口数

    当 Public NAT 不再需要某个 NAT IP 地址上的任何来源端口时,Public NAT 还会自动移除该 NAT IP 地址。

    以下是自动 NAT IP 地址分配的特征:

    • 当 Public NAT 网关添加 NAT IP 地址时,它会在您配置网关时选择的网络层级中创建一个静态(预留)区域级外部 IP 地址。例如,如果您选择了高级层级,则 Public NAT 网关会在该层级创建 IP 地址。支持的网络层级为高级层级(默认选项)和标准层级。

      您可以在静态外部 IP 地址列表中查看自动添加的 NAT IP 地址。这些地址不会计入每个项目的配额

    • 如果您更改 Public NAT 网关的网络层级,则系统会释放该网关的现有 IP 地址,并分配所选层级中的一组新 IP 地址。
    • 使用自动分配时,您无法预测将会分配的下一个 IP 地址。如果您需要提前知道(例如为了创建许可名单)可能的 NAT IP 地址集,则应改用手动 NAT IP 地址分配。
    • 当自动添加的 NAT IP 地址不再使用时,它们会被移除。但是,仅当分配给该地址的最后一个虚拟机不再使用任何端口时,Public NAT 才会取消分配地址。因此,当使用 Public NAT 的虚拟机数量减少时,您可能看不到 IP 地址减少。这是因为 Public NAT 不会动态地将虚拟机从一个 IP 地址重新分配给另一个 IP 地址,因为重新分配将会中断已建立的连接。只要至少有一个虚拟机正在使用某个 IP 地址,该 IP 地址就会保持活跃状态,并且可以将新的虚拟机分配给它。

      如果您希望能够手动将虚拟机从一个 IP 地址重新分配给另一个 IP 地址,以最大限度地减少 IP 地址用量,请使用手动 NAT IP 地址分配。手动 NAT IP 地址分配允许排空 Public NAT IP 地址

    • 如果您日后切换为手动 NAT IP 地址分配,系统会删除自动预留的地区级外部 IP 地址。如需了解详情,请参阅切换分配方法

  • NAT IP 地址手动分配。如果选择此选项,您可以创建静态(预留)地区级外部 IP 地址并将其手动分配给 Public NAT 网关。根据conditions,您可以手动分配高级层级和/或标准层级中的 IP 地址。

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

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

手动分配高级层级和标准层级 IP 地址的组合

使用手动 NAT IP 地址分配方法创建 Public NAT 网关时,您可以分配高级层级和标准层级 IP 地址的组合,只要不同网络层级的 IP 地址不属于相同的规则(包括默认规则)。

在规则(包括默认规则)内,分配给有效范围的所有 IP 地址必须属于同一网络层级。如果您尝试将不同层级的 IP 地址用作同一规则的一部分,则 Google Cloud 会拒绝该配置。

切换分配方法

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

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

排空 Public NAT IP 地址

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

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

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

Private NAT IP 地址

专用 NAT 需要两个 Virtual Private Cloud (VPC) 网络,每个网络都配置为在同一 Network Connectivity Center 中心上的 VPC spoke。如需详细了解 VPC spoke 和 Network Connectivity Center,请参阅 VPC spoke 概览

专用 NAT 地址是区域级内部 IPv4 地址,来自与专用 NAT 网关位于同一区域和 VPC 网络的专用 NAT 子网的主要 IPv4 地址范围。专用 NAT IP 地址在互联网上无法路由。专用 NAT 子网的主要 IPv4 地址范围中的 IP 地址只能由专用 NAT 网关使用。如需创建专用 NAT 子网,请使用 Google Cloud CLI 和 --purpose=PRIVATE_NAT 标志添加仅限 IPv4 的子网

将专用 NAT 网关配置为为连接到 Network Connectivity Center 中心的 VPC 网络中的子网提供 NAT 服务后,该子网中具有网络接口的虚拟机就可以向位于中心其他 VPC spoke 的资源发送数据包。在出站流量时,Google Cloud 会将来源 IP 地址更改为与网关关联的专用 NAT 子网中的 IP 地址。

以下是 Private NAT IP 地址的特征:

  • 您无法将专用 NAT IP 地址分配给专用 NAT 网关。相反,在专用 NAT 网关中创建规则时,您可以手动指定一个或多个专用 NAT 子网。专用 NAT 子网必须与网关位于同一 VPC 网络和区域中。网关仅使用专用 NAT 子网的主要 IPv4 地址范围中的 IP 地址。
  • 如需确定每个专用 NAT 子网可以提供的 NAT IP 地址数量,请使用以下公式:2(32 - PREFIX_LENGTH) - 4,其中 PREFIX_LENGTH 是专用 NAT 子网的主要 IPv4 地址范围的子网掩码长度。在每个子网的主要 IPv4 地址范围中,四个 IP 地址不可用

端口

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

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

创建 Cloud NAT 网关时,您可以选择使用静态端口分配动态端口分配。 更改端口分配模式时,所有使用 Public NAT 网关的现有连接都必须关闭,并且必须重新建立。

如果您为公共 NAT 网关手动分配了多个静态(预留)区域级外部 IP 地址,则使用该网关的单个虚拟机可以从任何已分配的 NAT IP 地址(即使同时从多个 NAT IP 地址)获取所需的端口。

静态端口分配

配置静态端口分配时,您需要指定每个虚拟机实例的端口数下限。如果您未指定虚拟机的最小端口数,则 Google Cloud 将使用默认值。

默认情况下,系统会为 Public NAT 启用静态端口分配。另一方面,Private NAT 默认使用动态端口分配。

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

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

动态端口分配

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

默认情况下,系统会为 Private NAT 启用动态端口分配。对于 Public NAT,您需要手动配置动态端口分配

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

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

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

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

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

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

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

切换端口分配方法

您可以在给定的 Cloud NAT 网关的静态端口分配和动态端口分配之间切换。

仅当满足以下任一条件时,切换到动态端口分配方法才会破坏现有的 NAT 连接:

  • 您需要将每个虚拟机的端口数上限设置为小于上一个 NAT 配置中指定的每个虚拟机的端口数下限(使用静态端口分配)的值。

    如果在上一个配置中,每个虚拟机的端口数下限设置为超过 1024,并且如果新配置中将 1024 指定为每个虚拟机的端口数上限,则现有连接中断,因为第一个条件优先。

  • 您需要将每个虚拟机的端口数上限设置为小于 1024 的值。

除非满足上述任一条件,否则切换到动态端口分配不会破坏现有的 NAT 连接。

停用动态端口分配并切换到静态端口分配会造成中断,并且会破坏所有活跃的 NAT 连接。

端口预留过程

Public NAT 使用以下过程为 Public NAT(Public NAT 和 Private NAT)网关提供的每台虚拟机预配 NAT 来源地址和来源端口元组。

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

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

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

    由于 Private NAT 网关已配置为针对虚拟机网络接口使用的子网的所有 IP 地址范围执行 NAT,因此该网关会对该子网中的所有 IP 范围执行 NAT。

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

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

    • 数字 1024

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

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

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

    对于 Private NAT,Google Cloud 会为每个虚拟机分配所需数量的最小端口数的两倍,以实现可靠性。确保 Private NAT 分配 IP 地址和端口的子网大小适当。

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

    • Cloud NAT 网关为每个虚拟机分配来源 IP 地址和来源端口元组。

      • 如果您已配置静态端口分配,则来源 IP 地址和来源端口元组的数量是固定的。即使在流量爆发期间,每个虚拟机使用的已分配来源 IP 地址和来源端口元组数都不能超过其数量。

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

增加每个虚拟机的端口

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

如果您已使用动态端口分配配置 Cloud NAT 网关,则增加每个虚拟机的端口数下限、上限或两者的数量不会破坏现有 NAT 连接或中断流经 NAT 网关的流量。

增加虚拟机的端口数时,请考虑以下事项:

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

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

  • 使用 Private NAT 时,请确保网关分配 IP 地址的子网具有足够的 IP 地址。

减少每个虚拟机的端口

如果您已使用静态端口分配配置 Cloud NAT 网关,并减少网关上每个虚拟机的端口数下限,则连接不会排空。已建立的 NAT 连接会立即中断,并且客户端必须建立新的 TCP 连接。

如果您已使用动态端口分配配置 Cloud NAT 网关,则以下语句为 true:

  • 减少每个虚拟机的端口数下限不会破坏现有 NAT 连接,也不会中断流经 NAT 网关的流量。
  • 减少每个虚拟机的端口数上限会立即破坏所有现有 NAT 连接,并且所有虚拟机的已分配端口数会暂时重置为针对每个虚拟机的最小端口数指定的值

端口和连接

Public 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 地址和来源端口元组就可以同时重用于许多其他连接。

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

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

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

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

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

减少端点独立冲突

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

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

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

如果需要,您可以通过修改 TCP TIME_WAIT 超时的默认值来减少此延迟。如需了解如何修改 NAT 超时,请参阅更改 NAT 超时。或者,您也可以执行以下某项更改:

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

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

来源端口和安全性

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

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

  • 为虚拟机分配外部 IP 地址,而不是使用 Public NAT。

示例

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

端口预留

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

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

  • 如果您使用手动分配方法为 Public 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 个虚拟机

假设您要配置 Private NAT 网关来为子网的所有 IP 地址提供 NAT:

  • 您可以创建的最小子网大小为 8 个 IPv4 地址,即子网掩码为 /29。如果您配置 Private NAT 网关的 NAT 子网大小下限,并将每个虚拟机实例的端口数下限设置为 64,则网关可为多达 2016 个虚拟机提供 NAT 服务:

    ⌊(2(32-29) - 4) 1 个 NAT IP 地址 ×(每个地址 64,512 个端口)/(每个虚拟机 64 个端口)⌋ = 2,016 个虚拟机

    在前面的示例中,如果您将每个虚拟机实例的端口数下限设置为 1024,则网关可以为最多 126 个虚拟机提供 NAT 服务:

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

  • 如果您配置 NAT 子网掩码为 /28 的Private NAT 网关,并将每个虚拟机实例的端口数下限设置为 64,则网关可为多达 6048 个虚拟机提供 NAT 服务:

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

端点独立映射冲突

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

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

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

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

    • 来源内部 IP 地址和端口:10.0.0.2:10002
    • 目标 3 元组:203.0.113.2:80(使用 TCP)
    • Public NAT 也可能选择对此连接使用同一 NAT 来源 IP 地址和来源端口元组 192.0.2.10:30009您可以为不同的客户端 IP 地址和临时来源端口使用相同的 NAT 来源 IP 地址和来源端口元组。
  3. 当第一个连接和第二个连接都处于活跃状态时,Public 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。但是,到 203.0.113.2:80 的第二个 TCP 连接已在使用 192.0.2.10:30009

  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,从而使用 NAT 来源 IP 地址和来源端口 192.0.2.10:30009 通过 TCP 与 203.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 地址和端口。

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

后续步骤