用于出站连接的源网络地址转换 (SNAT)

某些方案要求虚拟机或计算实例与 Internet 建立出站连接。 可使用公共负载均衡器的前端 IP 为后端实例提供到 Internet 的出站连接。 此配置使用源网络地址转换 (SNAT) 将虚拟机的专用 IP 将转换为负载均衡器的公共 IP 地址。 SNAT 将后端的 IP 地址映射到负载均衡器的公共 IP 地址。 SNAT 可以防止外部源直接访问后端实例。

Azure 的出站连接方法

以下方法用于在 Azure 中启用出站连接:

# 方法 端口分配类型 生产级? Rating
1 使用负载均衡器的前端 IP 地址通过出站规则建立出站连接 静态,显式 是,但不是大规模 OK
2 将 NAT 网关关联到子网 动态、显式 最佳
3 将公共 IP 分配到虚拟机 静态,显式 OK
4 使用默认出站访问 隐式 最差

Azure 出站选项示意图。

1. 使用负载均衡器的前端 IP 地址通过出站规则建立出站连接

示意图:使用出站规则的公共负载均衡器。

使用出站规则可以为标准 SKU 公共负载均衡器显式定义 SNAT(源网络地址转换)。 通过此配置,可以使用负载均衡器的一个或多个公共 IP 建立后端实例的出站连接。

此配置可实现:

  • IP 伪装

  • 简化允许列表

  • 减少用于部署的公共 IP 资源的数量。

使用出站规则,你可以完全声明性地控制出站 Internet 连接。 出站规则可让你通过手动分配端口来根据特定需求缩放和优化此功能。 根据后端池大小和 frontendIPConfigurations 的数量手动分配 SNAT 端口可以帮助避免 SNAT 耗尽。

可以按“每个实例的端口数”或“后端实例的最大数量”手动分配 SNAT 端口。 如果后端有虚拟机,建议按“每个实例的端口数”分配端口以获得最大 SNAT 端口使用率。

每个实例的端口数的计算方式应如下所示:

前端 IP 数 * 64K / 后端实例数

如果后端有虚拟机规模集,建议按“后端实例的最大数量”分配端口。 如果添加到后端的 VM 多于允许的剩余 SNAT 端口,则可能会阻止虚拟机规模集纵向扩展,否则新 VM 将无法获得足够的 SNAT 端口。

有关出站规则的详细信息,请参阅出站规则

2. 将 NAT 网关关联到子网

NAT 网关与公共负载均衡器示意图。

虚拟网络 NAT 简化了虚拟网络仅限出站的 Internet 连接。 在子网中配置后,所有出站连接将使用指定的静态公共 IP 地址。 无需使用负载均衡器或将公共 IP 地址直接附加到虚拟机,即可建立出站连接。 NAT 是完全托管式的,且具有很高的复原能力。

使用 NAT 网关是出站连接的最佳方法。 NAT 网关具有高度的可扩展性和可靠性,没有 SNAT 端口耗尽的问题。

有关 Azure 虚拟网络 NAT 的详细信息,请参阅什么是 Azure 虚拟网络 NAT

3. 将公共 IP 分配到虚拟机

具有实例级公共 IP 地址的虚拟机示意图

关联 方法 IP 协议
VM NIC 上的公共 IP SNAT(源网络地址转换)
未使用。
TCP(传输控制协议)
UDP(用户数据报协议)
ICMP(Internet 控制消息协议)
ESP(封装安全有效负载)

流量将从虚拟机的公共 IP 地址(实例级别 IP)返回请求客户端。

Azure 将分配给实例 NIC 的 IP 配置的公共 IP 用于所有出站流。 此实例具有所有可用的临时端口。 VM 是否负载均衡无关紧要。 此方案优先于其他方案。

分配到 VM 的公共 IP 属于 1 对 1 关系(而不是 1 对多关系),并实现为无状态的 1 对 1 NAT。

4. 默认出站访问

默认出站访问示意图。

注意

不建议对生产工作负载使用此方法,因为此方法会增加耗尽端口的风险。 请不要对生产工作负载使用此方法,以避免潜在的连接故障。

符合以下条件的任何 Azure 资源都将分配最少数量的出站端口:没有与之关联的公共 IP、前面没有具有出站规则的负载均衡器、不属于虚拟机规模集灵活业务流程模式的一部分或没有 NAT 网关资源与其子网关联。 这种访问方法称为“默认出站访问”,在为应用程序提供出站连接时,此方法为下下策。

默认出站访问的其他一些示例如下:

  • 使用基本 SKU 负载均衡器
  • Azure 中的虚拟机(没有上述关联)。 在这种情况下,出站连接是由默认出站访问 IP 提供的。 此 IP 是 Azure 分配的动态 IP,你无法对其进行控制。 不建议对生产工作负载使用默认 SNAT,这可能会导致连接失败。
  • 没有出站规则的负载均衡器后端池中的虚拟机。 因此,你使用负载均衡器的前端 IP 地址建立出站和入站连接,更容易出现 SNAT 端口耗尽导致的连接失败。

什么是 SNAT 端口?

端口用于生成用于维护不同流的唯一标识符。 Internet 使用五元组来提供这种区别。

如果一个端口用于入站连接,它将有一个用于该端口上入站连接请求的侦听器。 此端口不能用于出站连接。 若要建立出站连接,使用临时端口为目标提供一个端口,在该端口上进行通信并维护不同的通信流。 当这些临时端口用于执行 SNAT 时,它们称为 SNAT 端口。

根据定义,每个 IP 地址具有 65,535 个端口。 每个端口都可以用于 TCP(传输控制协议)和 UDP(用户数据报协议)的入站或出站连接。 将公共 IP 地址作为前端 IP 添加到负载均衡器时,有 64,000 个端口可用作 SNAT。 虽然可以分配添加为前端 IP 的所有公共 IP,但一次只使用一个前端 IP。 例如,如果为两个后端实例的每一个都分配 64,000 个端口,这些端口有权访问 2 个前端 IP,则两个后端实例都会使用第一个前端 IP 中的端口,直到所有 64,000 个端口都耗尽。

负载均衡或入站 NAT 规则中采用的每个端口使用 64,000 个可用 SNAT 端口中的 8 个端口。 如果对出站连接使用同一前端 IP,那么这种用法减少了符合 SNAT 条件的端口数。 如果在负载均衡或入站 NAT 规则中使用的端口与另一规则使用的端口位于包含 8 个端口的同一个块中,则不需要额外的端口。

默认 SNAT 的工作原理是什么?

当 VM 创建出站流时,Azure 会将源 IP 地址转换为临时 IP 地址。 此转换通过 SNAT 完成。

如果在没有出站规则的情况下通过公共负载均衡器使用 SNAT,则会预先分配 SNAT 端口,如下面的默认 SNAT 端口分配表中所述。

默认端口分配表

下面的表显示了不同后端池大小的 SNAT 端口预分配情况:

池大小(VM 实例) 每个 IP 配置的默认 SNAT 端口
1-50 1,024
51-100 512
101-200 256
201-400 128
401-800 64
801-1,000 32

端口耗尽

每个连接到同一目标 IP 和目标端口的连接都将使用 SNAT 端口。 此连接维护从后端实例或从客户端到服务器的不同流量 。 这个过程为服务器提供了一个不同的端口来处理流量。 如果没有此过程,客户端计算机将无法知道数据包属于哪个流。

假设有多个浏览器将访问 https://www.microsoft.com ,即:

  • 目标 IP = 23.53.254.142

  • 目标端口 = 443

  • 协议 = TCP

如果返回流量的目标端口(用于建立连接的 SNAT 端口)都相同,客户端将无法将一个查询结果与另一个查询结果分开。

出站连接可能会突发。 后端实例可能无法分配到足够的端口。 在应用程序中使用连接重用功能。 如果没有连接重用功能,则会增加 SNAT 端口耗尽的风险。

若要详细了解如何将连接池与 Azure 应用服务配合使用,请参阅排查 Azure 应用服务中的间歇性出站连接错误

当端口耗尽时,与目标 IP 的新出站连接将失败。 当端口变为可用时,连接将成功。 当来自 IP 地址的 64,000 个端口在许多后端实例上分散分布时,就会发生这种耗尽。 有关缓解 SNAT 端口耗尽的指导,请参阅故障排除指南

对于 TCP 连接,负载均衡器将为每个目标 IP 和端口使用一个 SNAT 端口。 这种多用途允许使用相同 SNAT 端口建立与相同目标 IP 的多个连接。 如果连接不是指向不同的目标端口,那么这种多用途是有限的。

对于 UDP 连接,负载均衡器使用端口受限的 cone NAT 算法,无论目标端口是什么,每个目标 IP 都会消耗一个 SNAT 端口。

可以在无限数量的连接中重复使用端口。 仅当目标 IP 或端口不同时,才可重复使用端口。

约束

  • 如果连接处于闲置状态且没有发送新的数据包,则将在 4 - 120 分钟后释放端口。

    • 可以通过出站规则配置此阈值。
  • 每个 IP 地址提供 64,000 个端口,这些端口可用于 SNAT。

  • 每个端口都可以用于到目标 IP 地址的 TCP 和 UDP 连接

    • 无论目标端口是否唯一,都需要 UDP SNAT 端口。 对于每个到目标 IP 的 UDP 连接,将使用一个 UDP SNAT 端口。

    • 如果目标端口不同,则可以将一个 TCP SNAT 端口用于到同一目标 IP 的多个连接。

  • 当后端实例用完给定的 SNAT 端口时,会发生 SNAT 耗尽。 负载均衡器仍然可以有未使用的 SNAT 端口。 如果后端实例的已用 SNAT 端口超过其给定的 SNAT 端口,它将无法建立新的出站连接。

  • 除非出站连接通过 VM 的 NIC 上的实例级公共 IP,否则碎片化的数据包将被丢弃。

  • 网络接口的辅助 IP 配置不通过负载均衡器进行出站通信(除非已将公共 IP 与之关联)。

后续步骤