用于出站连接的源网络地址转换 (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 端口。

使用出站规则配置了多个前端 IP 时,出站连接可能来自配置为后端实例的任何前端 IP。 建议不要生成可能会为其选择前端 IP 进行连接的任何依赖项。

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

2. 将 NAT 网关关联到子网

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

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

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

NAT 网关优先于其他出站连接方法,包括负载均衡器、实例级公共 IP 地址和 Azure 防火墙。

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

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

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

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

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

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

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

4. 默认出站访问

默认出站访问示意图。

在 Azure 中,在未定义显式出站连接的虚拟网络中创建的虚拟机将获分配默认出站公共 IP 地址。 此 IP 地址允许启用从资源到 Internet 的出站连接。 此访问称为“默认出站访问”。 不建议使用此访问方法,因为它不安全,且 IP 地址可能会更改。

重要

2025 年 9 月 30 日,新部署的默认出站访问将停用。 有关详细信息,请查看官方公告。 建议使用上述选项 1-3 所示的显式连接形式之一。

什么是 SNAT 端口?

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

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

根据定义,每个 IP 地址具有 65,535 个端口。 每个端口都可以用于 TCP(传输控制协议)和 UDP(用户数据报协议)的入站或出站连接。 将公共 IP 地址作为前端 IP 添加到负载均衡器时,有 64,000 个端口可用作 SNAT。

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

注意

如果需要连接到任何受支持的 Azure PaaS 服务(如 Azure 存储、Azure SQL 或 Azure Cosmos DB),则可以利用 Azure 专用链接完全避免 SNAT。 Azure 专用链接通过 Microsoft Azure 主干网络(而不是通过 Internet)将来自虚拟网络的流量发送到 Azure 服务。

关于对 Azure 托管服务的专用访问,建议首选专用链接而不是服务终结点。 有关专用链接和服务终结点之间的差异的详细信息,请参阅比较专用终结点和服务终结点

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

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

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

默认端口分配表

如果选择了负载均衡规则以使用默认端口分配,或者出站规则配置为“使用默认出站端口数”,则默认情况下会根据后端池大小分配 SNAT 端口。 对于每个前端 IP,后端将接收表定义的端口数(最多 1024 个端口)。

例如,在后端池中有 100 个 VM,并且只有一个前端 IP,那么每个 VM 接收 512 个端口。 如果添加了第二个前端 IP,则每个 VM 将接收额外的 512 个端口。 这意味着每个 VM 总共分配了 1024 个端口。 因此,添加第三个前端 IP 不会使分配的 SNAT 端口数超过 1024 个端口。

根据经验,应用默认端口分配时提供的 SNAT 端口数可以计算为:MIN(基于池大小提供的默认 SNAT 端口数 * 与池关联的前端 IP 数,1024)

表显示了单个前端 IP 的 SNAT 端口预分配,具体取决于后端池大小:

池大小(VM 实例) 默认 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 端口。 对于与同一目标 IP 的连接,只要目标端口不同,就可以重用单个 SNAT 端口。 如果已存在与同一目标 IP 和端口的连接,则无法重用。

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

在允许重用的情况下(即目标 IP 或端口不同时),可以重用各个端口来建立无限数量的连接。

在下表中的示例中,专用 IP 为 10.0.0.1 的后端实例正在与目标 IP 23.53.254.142 和 26.108.254.155 建立 TCP 连接,而负载均衡器配置了前端 IP 地址 192.0.2.0。 由于目标 IP 不同,可以重用同一个 SNAT 端口来建立多个连接。

流向 源元组 进行 SNAT 之后的源元组 目标元组
1 10.0.0.1:80 192.0.2.0:1 23.53.254.142:80
2 10.0.0.1:80 192.0.2.0:1 26.108.254.155:80

约束

  • 如果连接处于闲置状态且没有发送新的数据包,则将在 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 与之关联)。

后续步骤