使用 Azure NAT 网关的源网络地址转换 (SNAT)

源网络地址转换(SNAT)允许来自专用虚拟网络的流量连接到 Internet,同时保持完全专用。 SNAT 将原始数据包的源 IP 和端口重写为公共 IP 和端口组合。 端口用作唯一标识符,用于区分彼此的不同连接。 Internet 使用五元组哈希(协议、源 IP/端口、目标 IP/端口)来提供此区别。

SNAT 还允许虚拟网络中的多个专用实例使用相同的单个公共 IP 地址或一组 IP 地址(前缀)连接到 Internet。

NAT 网关支持多对一 SNAT 功能。 子网中的许多私有实例可以使用 SNAT,把连接转换为绑定到 NAT 网关的公共 IP 地址,以便连接到 Internet。 当 NAT 网关与同一目标终结点建立多个连接时,每个新连接使用不同的 SNAT 端口,以便可以相互区分连接。

当源终结点耗尽可用 SNAT 端口以区分新连接时,会发生 SNAT 端口耗尽。 发生 SNAT 端口耗尽时,连接会失败。

扩展 NAT 网关中的 SNAT

缩放 NAT 网关主要是管理共享的可用 SNAT 端口清单的功能。

SNAT 端口库存由附加到 NAT 网关的公共 IP 地址、公共 IP 前缀或者两者共同提供。 SNAT 端口清单按需提供给附加到 NAT 网关的子网中的所有实例。 随着子网专用实例的工作负荷的缩放,NAT 网关会根据需要分配 SNAT 端口。

当虚拟网络中的多个子网附加到同一 NAT 网关资源时,NAT 网关提供的 SNAT 端口清单在所有子网之间共享。

单个 NAT 网关最多可扩展到 16 个 IP 地址。 每个 NAT 网关公共 IP 地址都提供 64,512 个 SNAT 端口,用于建立出站连接。 NAT 网关可以扩展到超过 100 万个 SNAT 端口。 TCP 和 UDP 是单独的 SNAT 端口清单,与 NAT 网关无关。

NAT 网关动态分配 SNAT 端口

NAT 网关跨子网的专用资源(例如虚拟机)动态分配 SNAT 端口。 所有可用的 SNAT 端口都由配置了 NAT 网关的子网中的任何虚拟机按需使用。

SNAT 端口分配示意图。

图:SNAT 端口分配

对于其他 SNAT 方法,需要将 SNAT 端口预分配到每个虚拟机。 SNAT 端口的这种预分配可能会导致某些虚拟机上的 SNAT 端口耗尽,而另一些虚拟机仍具有用于连接出站的 SNAT 端口。

使用 NAT 网关时,不需要预先分配 SNAT 端口,这意味着虚拟机不会主动使用这些端口。

发布 SNAT 端口后,它可供配置了 NAT 网关的子网中的任何虚拟机使用。 按需分配允许子网上的动态和不同工作负荷可以根据需要使用 SNAT 端口。 只要 SNAT 端口可用,SNAT 流就成功。

SNAT 端口耗尽示意图。

图:SNAT 端口耗尽

NAT 网关 SNAT 端口选择和重复使用

NAT 网关从可用的端口清单中随机选择 SNAT 端口,以建立新的出站连接。 如果 NAT 网关找不到任何可用的 SNAT 端口,则它将重复使用 SNAT 端口。 同一 SNAT 端口可用于同时连接到多个不同的目标。

可以重复使用 SNAT 端口连接到同一目标终结点。 在重复使用端口之前,NAT 网关在连接关闭后,将 SNAT 端口重用计时器放在端口上冷却。

SNAT 端口重用计时器有助于防止端口过快地被选择用于连接到同一目标。 当目标终结点配置防火墙或其他服务,这些服务在源端口上放置冷却计时器时,此过程非常有用。 SNAT 端口重用计时器因连接流关闭方式而异。 若要了解详细信息,请参阅端口重用计时器

SNAT 端口重用关系图。

图:SNAT 端口重用

NAT 网关中 SNAT 的示例流

多对一 SNAT 使用 NAT 网关

NAT 网关提供多对一配置,其中配置了 NAT 网关子网中的多个专用实例可以使用同一公共 IP 地址用于出站连接。

下表中,两个不同的虚拟机(10.0.0.1 和 10.2.0.1)连接到目标 IP 23.53.254.142。 使用公共 IP 地址 65.52.1.1 配置 NAT 网关时,每个虚拟机的源 IP 将转换为 NAT 网关的公共 IP 地址和 SNAT 端口:

Flow 源元组 进行 SNAT 之后的源元组 目标元组
1 10.0.0.1:4283 65.52.1.1:1234 23.53.254.142:80
2 10.0.0.1:4284 65.52.1.1:1235 23.53.254.142:80
3 10.2.0.1:5768 65.52.1.1:1236 23.53.254.142:80

IP 伪装端口伪装 是在连接到 Internet 之前将专用 IP 和端口替换为公共 IP 和端口的行为。 多个专用资源可以伪装在 NAT 网关的同一公共 IP 后面。

NAT 网关重复使用 SNAT 端口以连接到新目标

如前所述,NAT 网关可以重复使用同一 SNAT 端口以同时连接到新的目标终结点。 在下表中,NAT 网关将流 4 转换为已用于其他目标的 SNAT 端口(请参阅上表中的流 1)。

Flow 源元组 进行 SNAT 之后的源元组 目标元组
4 10.0.0.1:4285 65.52.1.1:1234 26.108.254.155:80

NAT 网关 SNAT 端口冷却,以便重复使用到同一目标

在 NAT 网关重复使用 SNAT 端口以建立与同一目标终结点的新连接的情况下,SNAT 端口首先放置在 SNAT 端口重用阶段,以便冷却。 SNAT 端口重用期有助于确保在连接到同一目标时 SNAT 端口不会重复使用太快。 在目标端点具有其自身源端口计时器的防火墙场景中,NAT 网关上 SNAT 端口的重用对于冷却非常有利。

为了演示此 SNAT 端口重用冷却行为,让我们仔细看看上表中的流 4。 流量4连接到一个由防火墙保护且具有20秒源端口冷却计时器的目标终端。

Flow 源元组 进行 SNAT 之后的源元组 目标元组 数据包类型连接已关闭 用于源端口的目标防火墙冷却计时器
4 10.0.0.1:4285 65.52.1.1:1234 26.108.254.155:80 TCP FIN 20 秒

连接流 4 使用 TCP FIN 数据包关闭。 由于连接使用 TCP FIN 数据包关闭,NAT 网关会将 SNAT 端口 1234 置于冷却状态 65 秒,然后才能重复使用。 由于端口 1234 的冷却时间长于防火墙源端口冷却计时器持续时间 20 秒,因此连接流 5 将继续重用 SNAT 端口 1234 而不出现问题。

Flow 源元组 进行 SNAT 之后的源元组 目标元组
5 10.2.0.1:5769 65.52.1.1:1234 26.108.254.155:80

请记住,NAT 网关会根据上一个连接关闭的方式,将 SNAT 端口分配到不同的 SNAT 端口重用冷却计时器中。 有关 SNAT 端口重用计时器的详细信息,请参阅 “端口重用计时器”。

不要依赖上述示例中分配源端口的特定方式。 前面的只是基本概念的插图。