使用 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 端口用于出站连接。
借助 NAT 网关,无需预分配 SNAT 端口,这意味着 SNAT 端口不会因虚拟机无主动需求而闲置。
释放 SNAT 端口后,它可供使用 NAT 网关配置的子网中的任何虚拟机使用。 按需分配允许子网上的动态和分散工作负载按需使用 SNAT 端口。 只要有 SNAT 端口可用,SNAT 流便会成功。
图:SNAT 端口耗尽
NAT 网关 SNAT 端口选择和重用
NAT 网关可从可用的端口库存中随机选择一个 SNAT 端口来建立新的出站连接。 如果 NAT 网关没有找到任何可用的 SNAT 端口,那么它将重用一个 SNAT 端口。 可以使用同一 SNAT 端口同时连接到多个不同的目标。
可以重用 SNAT 端口来连接到同一目标终结点。 在重用端口之前,NAT 网关会在端口上设置 SNAT 端口重用计时器以进行冷却。
SNAT 端口重用计时器有助于防止端口选择太快而无法连接到同一目标。 如果目标终结点配置了防火墙或其他服务,而防火墙或这些服务在源端口上设置了冷却计时器,则此过程会非常有用。 SNAT 端口重用计时器因连接流关闭方式而异。 若要了解详细信息,请参阅端口重用计时器。
图:SNAT 端口重用
NAT 网关的示例 SNAT 流
使用 NAT 网关的多对一 SNAT
NAT 网关提供了多对一配置,在此配置中,配置了 NAT 网关的子网中的多个专用实例可以使用同一公共 IP 地址建立出站连接。
在下表中,两个不同的虚拟机(10.0.0.1 和 10.2.0.1)连接到 目标 IP 23.53.254.142。 将 NAT 网关配置为公共 IP 地址 65.52.1.1 时,每个虚拟机的源 IP 会转换为 NAT 网关的公共 IP 地址和 SNAT 端口:
流向 | 源元组 | 进行 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 |
连接到 Internet 之前,通过IP 伪装或端口伪装操作,可将专用 IP 和端口替换为公共 IP 和端口。 多个专用资源可以伪装在 NAT 网关的同一个公共 IP 之后。
NAT 网关可重用 SNAT 端口以连接到新目标
如前所述,NAT 网关可以重用同一 SNAT 端口以同时连接到新的目标终结点。 在下表中,NAT 网关将流 4 转换为已用于其他目标的 SNAT 端口(请参阅上表中的流 1)。
流向 | 源元组 | 进行 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 秒源端口冷却计时器的防火墙。
流向 | 源元组 | 进行 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 秒,然后才可以重用该端口。 由于此端口处于冷却状态的时间比防火墙源端口冷却计时器持续时间 20 秒更长,因此连接流 5 将通过重用 SNAT 端口 1234 继续运行而不会出现问题。
流向 | 源元组 | 进行 SNAT 之后的源元组 | 目标元组 |
---|---|---|---|
5 | 10.2.0.1:5769 | 65.52.1.1:1234 | 26.108.254.155:80 |
请记住,NAT 网关根据前一连接的关闭方式,将 SNAT 端口置于不同的 SNAT 端口重用冷却计时器下。 要详细了解这些 SNAT 端口重用计时器,请参阅端口重用计时器。
请不要依赖于上面示例中源端口的特定分配方式。 上面的示例仅用于演示基本概念。