通过


出站连接(经典)

Azure 通过多种不同的机制为客户部署提供出站连接。 本文介绍应用场景、应用方式、工作原理以及如何管理方案。

注释

本文仅涵盖经典部署。 查看 Azure 中所有资源管理器部署方案的 出站连接

Azure 中的部署可以在公共 IP 地址空间中与 Azure 外部的终结点通信。 当实例启动到公共 IP 地址空间中的目标的出站流时,Azure 会动态将专用 IP 地址映射到公共 IP 地址。 创建此映射后,此出站发起流的返回流量也可以到达流发起的专用 IP 地址。

Azure 使用源网络地址转换 (SNAT) 来执行此函数。 当多个专用 IP 地址伪装在单个公共 IP 地址后面时,Azure 使用 端口地址转换(PAT) 来伪装专用 IP 地址。 临时端口用于 PAT,并会根据池的大小预先分配。

存在多个 出站情境。 可以根据需要合并这些方案。 仔细查看它们,了解适用于部署模型和应用程序方案的功能、约束和模式。 查看 管理这些方案的指南。

场景概述

Azure 提供了三种不同的方法来实现出站连接经典部署。 并非所有经典部署都可使用这三种方案。

情景 方法 IP 协议 DESCRIPTION Web 工作者角色 IaaS
1.具有实例级公共 IP 地址的 VM SNAT,未启用端口伪装 TCP、UDP、ICMP、ESP Azure 使用公共 IP 分配的虚拟机。 此实例具有所有可用的临时端口。 是的
2. 公共负载均衡终结点 使用端口伪装 (PAT) 到公共终结点的 SNAT TCP、UDP Azure 使用公共 IP 地址公共终结点与多个专用终结点共享连接。 Azure 使用公共终结点的临时端口进行 PAT。 是的 是的
3. 独立 VM SNAT 与端口伪装 (PAT) TCP、UDP Azure 会自动为 SNAT 指定公共 IP 地址,与整个部署共享此公共 IP 地址,并使用公共终结点 IP 地址的临时端口进行 PAT。 这是上述方案的回退方案。 如果需要可见性和控制,不建议使用它。 是的 是的

这是 Azure 中 Resource Manager 部署可用的出站连接功能的子集。

经典版中的不同部署具有不同的功能:

经典部署 可用功能
虚拟机 方案 123
Web工作角色 仅方案 23

缓解策略 也有相同的差异。

用于为经典部署的 PAT 预分配临时端口的算法与 Azure 资源管理器资源部署相同。

方案 1:具有实例级公共 IP 地址的 VM

在这种情况下,VM 分配了一个实例级公共 IP(ILPIP)。 就出站连接而言,VM 是否具有负载均衡终结点并不重要。 此方案优先于其他方案。 使用 ILPIP 时,VM 对所有出站流使用 ILPIP。

分配给 VM 的公共 IP 是一种 1:1 关系(而不是 1:多),并作为无状态 1:1 NAT 实现。 未使用端口伪装(PAT),并且 VM 具有所有临时端口可供使用。

如果应用程序启动许多出站流,并且遇到 SNAT 端口耗尽,请考虑分配 ILPIP 来缓解 SNAT 约束。 完整回顾 SNAT 耗尽管理

方案 2:公共负载均衡终结点

在此方案中,VM 或 Web 工作角色通过负载均衡的终结点与公共 IP 地址相关联。 VM 没有为其分配公共 IP 地址。

负载均衡 VM 创建出站流时,Azure 会将出站流的专用源 IP 地址转换为公共负载均衡终结点的公共 IP 地址。 Azure 使用 SNAT 执行此函数。 Azure 还使用 PAT 在公共 IP 地址后面伪装多个专用 IP 地址。

负载均衡器的公共 IP 地址前端的临时端口用于区分 VM 发起的各个流。 创建出站流时,SNAT 动态使用 预先分配的临时端口 。 在此上下文中,用于 SNAT 的临时端口称为 SNAT 端口。

SNAT 端口已预先分配,如 “了解 SNAT 和 PAT ”部分中所述。 它们是一个有限的资源,可以耗尽。 了解它们的 使用方式非常重要。 若要了解如何针对此消耗进行设计并根据需要进行缓解,请查看 管理 SNAT 耗尽

当存在 多个公共负载均衡终结点 时,这些公共 IP 地址中的任何一个都是出站流的候选终结点,一个是随机选择的。

方案 3:无公共 IP 地址关联

在此场景中,VM 或 Web 工作者角色并不是公共负载均衡终结点的一部分。 在 VM 的情况下,它没有分配给它的 ILPIP 地址。 当 VM 创建出站流时,Azure 会将出站流的专用源 IP 地址转换为公共源 IP 地址。 用于此出站流的公共 IP 地址不可配置,并且不计入订阅的公共 IP 资源限制。 Azure 会自动分配此地址。

Azure 将 SNAT 与端口伪装(PAT)配合使用来执行此函数。 此方案类似于方案 2,但无法控制使用的 IP 地址。 这是一种回退方案,适用于方案 1 和 2 不存在的情况。 如果希望控制出站地址,不建议使用此方案。 如果出站连接是应用程序的关键部分,则应选择另一种方案。

SNAT 端口已预先分配,如 “了解 SNAT 和 PAT ”部分中所述。 共享公共 IP 地址的 VM 或 Web 辅助角色数决定了预先分配的临时端口数。 了解它们的 使用方式非常重要。 若要了解如何针对此消耗进行设计并根据需要进行缓解,请查看 管理 SNAT 耗尽

了解 SNAT 和 PAT

端口伪装 SNAT (PAT)

当部署建立出站连接时,将重写每个出站连接源。 源 IP 地址从专用 IP 地址空间转换为与部署关联的公共 IP(基于上述方案)。 在公共 IP 地址空间中,流(源 IP 地址、源端口、IP 传输协议、目标 IP 地址、目标端口)的 5 元组必须是唯一的。

临时端口(SNAT 端口)在重写专用源 IP 地址后用于实现此目的,因为多个流源自单个公共 IP 地址。

每个流会为单个目标 IP 地址、端口和协议消耗一个 SNAT 端口。 对于多个流向同一目标 IP 地址、端口和协议的情况,每个流都占用一个 SNAT 端口。 这可确保这些流源自同一公共 IP 地址时是唯一的,并转到相同的目标 IP 地址、端口和协议。

多个流(每个流到不同的目标 IP 地址、端口和协议)共享单个 SNAT 端口。 目标 IP 地址、端口和协议使流是唯一的,而无需其他源端口来区分公共 IP 地址空间中的流。

如果 SNAT 端口资源已经耗尽,那么在现有流释放 SNAT 端口之前出站流会失败。 负载均衡器会在流关闭时回收 SNAT 端口,并使用 4 分钟的空闲超时从空闲流中回收 SNAT 端口。

有关缓解通常导致 SNAT 端口耗尽的条件的模式,请查看 “管理 SNAT ”部分。

伪装 SNAT 的临时端口预分配 (PAT)

Azure 使用算法根据后端池的大小确定使用端口伪装 SNAT (PAT)时可用的预分配 SNAT 端口数。 SNAT 端口是可用于特定公共 IP 源地址的临时端口。

Azure 在部署实例时,会根据共享给定公共 IP 地址的 VM 或 Web 辅助角色实例的数量,预先分配 SNAT 端口。 创建出站流时,PAT 会在动态使用这些端口时消耗它们(最多达到预先分配的限制),并在流关闭或出现空闲超时时释放它们。

下表显示了后端池大小的不同层级的 SNAT 端口的预分配方案:

实例 每个实例预分配的 SNAT 端口
1-50 1,024
51-100 512
101-200 256
201-400 128

请记住,可用的 SNAT 端口数不会直接转换为流数。 单个 SNAT 端口可以用于多个不同的唯一目标。 仅当需要使流唯一时,才使用端口。 有关设计和缓解指南,请参阅 有关如何管理此可耗尽的资源 和描述 PAT 的部分的部分。

更改部署方案的规模可能会影响某些已建立的流。 如果后端池大小增加并转换到下一层,在过渡到下一个更大的后端池层期间,会回收预分配的 SNAT 端口的一半。 与回收的 SNAT 端口关联的流将超时,必须重新建立。 如果尝试新流,只要预先分配的端口可用,该流就会立即成功。

如果部署大小减少并转换为较低层,则可用 SNAT 端口数将增加。 在这种情况下,现有分配的 SNAT 端口及其各自的流不会受到影响。

如果云服务被重新部署或更改,基础设施可能会暂时报告后端池的大小达到实际大小的两倍,从而导致 Azure 预分配的每个实例的 SNAT 端口数少于预期。 这可以暂时增加 SNAT 端口耗尽的概率。 最终,池大小将转换为实际大小,Azure 将根据上表自动将预先分配的 SNAT 端口增加到预期的数量。 此行为是设计造成的,不可配置。

SNAT 端口分配特定于 IP 传输协议(TCP 和 UDP 单独维护),并按以下条件发布:

TCP SNAT 端口发布

  • 如果两个服务器/客户端都发送 FIN/ACK,SNAT 端口将在 240 秒后释放。
  • 如果看到 RST,SNAT 端口将在 15 秒后释放。
  • 已达到空闲超时

UDP SNAT 端口发布

  • 已达到空闲超时时间

解决问题

本部分旨在帮助缓解 SNAT 耗尽问题,以及 Azure 中出站连接可能发生的其他场景。

管理 SNAT (PAT) 端口耗尽

用于 PAT的临时端口是一种可耗尽的资源,如没有公共 IP 关联和公共负载均衡终结点中所述。

如果你知道你正在启动与同一目标 IP 地址和端口的多个出站 TCP 或 UDP 连接,并且你观察到出站连接失败,或者技术支持告知你正在耗尽 SNAT 端口(端口地址转换使用的预分配临时性端口),那么你有几个通用的缓解选项。 查看这些选项,确定哪些选项可用,最适合你的方案。 可能有一个或多个可以帮助管理这种局面。

如果在了解出站连接行为时遇到问题,可以使用 IP 堆栈统计信息(netstat)。 或者,使用数据包捕获来观察连接行为可能会有所帮助。

修改应用程序以重复使用连接

可以通过在应用程序中重用连接来减少对用于 SNAT 的临时端口的需求。 这尤其适用于 HTTP/1.1 等协议,其中连接重用是默认值。 使用 HTTP 作为传输的其他协议(例如 REST)可以反过来受益。

重用始终优于每个请求的单个、独立的 TCP 连接。 重复使用会导致性能更高、效率非常高的 TCP 事务。

修改应用程序以使用连接池

可以在应用程序中使用连接池方案,其中请求在内部分配到一组固定的连接上(每个连接都在可能的情况下重用)。 此方案限制正在使用的临时端口数,并创建更可预测的环境。 当单个连接正在等待一个操作的回复时,此方案还可以通过允许多个操作同时进行来增加请求的吞吐量。

连接池可能已经存在于您用于开发应用程序的框架中或应用程序的配置设置中。 您可以将连接池与连接复用相结合。 您的多个请求将消耗指向相同目标 IP 地址和端口的固定且可预测数量的端口。 这些请求还受益于有效使用 TCP 事务,从而减少延迟和资源利用率。 UDP 事务也可以受益,因为管理 UDP 流的数量反过来可以避免耗尽条件和管理 SNAT 端口利用率。

修改应用程序以使用主动性较低的重试逻辑

当用于PAT预分配临时端口耗尽或应用程序故障发生时,过于频繁或强行的重试而缺乏衰减和退避逻辑会导致资源耗尽发生或持续。 可以使用不太激进的重试逻辑来减少对临时端口的需求。

临时端口有4分钟的空闲超时时间(无法调整)。 如果重试过于频繁,疲惫就没有机会自行恢复。 因此,考虑应用程序重试事务的方式和频率是设计的关键部分。

向每个 VM 分配实例级别公共 IP

分配 ILPIP 会将方案更改为 VM 的实例级别公共 IP。 每个虚拟机使用的公共 IP 的所有临时端口都对虚拟机开放。 (与公共 IP 的临时端口与与相应部署关联的所有 VM 共享的情况相反。需要考虑一些权衡,例如允许列出大量单个 IP 地址的潜在影响。

注释

此选项不适用于 Web Worker 角色。

使用 keepalive 重置出站空闲超时

出站连接会有 4 分钟的空闲超时。 此超时不可调整。 但是,可以使用传输层(例如 TCP keepalives)或应用层 keepalives 来刷新空闲的数据流,并在必要时重置该空闲超时。 请与任何打包软件的供应商联系,了解这是否受支持或如何启用它。 通常,只有一端需要生成 keepalives 来重置空闲超时。

查找 VM 使用的公共 IP

有多种方法来确定出站连接的公共源 IP 地址。 OpenDNS 提供了一种服务可以向你显示 VM 的公共 IP 地址。

使用 nslookup 命令,可以将名称 myip.opendns.com 的 DNS 查询发送到 OpenDNS 解析程序。 该服务返回用于发送此查询的源 IP 地址。 在 VM 中运行以下查询时,返回的是用于该 VM 的公共 IP。

nslookup myip.opendns.com resolver1.opendns.com

后续步骤

  • 详细了解 Resource Manager 部署中使用的 负载均衡器
  • 了解 Resource Manager 部署中可用的 出站连接 方案的模式。