如何解决在私有 Amazon VPC 上使用 NAT 网关时出现的连接问题?

2 分钟阅读
0

我想解决在我的私有 Amazon Virtual Private Cloud (Amazon VPC) 上使用 NAT 网关时遇到的连接问题。

简短描述

出于以下原因,私有子网资源可能会出现连接超时、连接突然中断或连接速度变慢的情况:

  • 网络访问控制列表(网络 ACL)规则
  • NAT 网关出现 ErrorPortAllocation 错误
  • 客户端实例端口耗尽
  • 释放容量时出现 IdleTimeoutCount 错误
  • 每个 NAT 网关的带宽限制

解决方法

根据以下原因排查连接超时、连接突然中断或连接速度慢的问题:

网络 ACL 规则

确保与 NAT 网关的公有子网关联的网络 ACL 允许来自临时端口范围 (1024-65535) 的流量。如果网络 ACL 允许端口范围的子集,而实例使用超出范围的源端口,则流量将被丢弃。有关更多信息,请参阅示例: 具有 NAT 且服务器位于私有子网中的 VPC

NAT 网关出现 ErrorPortAllocation 错误

对于每个目标,NAT 网关最多支持 55,000 个同时连接。如果超出此阈值,则与目标的新连接将失败,并且 Amazon CloudWatch 中 NAT 网关的 ErrorPortAllocation 指标会增加。要解决此问题,最多可将八个 IPv4 地址关联到 NAT 网关,以提高限额。您可以关联一个主 IPv4 地址和七个辅助 IPv4 地址。

**注意:**辅助 IPv4 地址会增加可用端口的数量。这意味着,您的工作负载可以用来连接 NAT 网关建立连接的并发连接数也会增加。

有关更多信息,请参阅如何解决 NAT 网关上的 ErrorPortAllocation 错误?

客户端实例端口耗尽

检查私有子网中的客户端实例是否已达到其操作系统 (OS) 连接限制:

查看有效连接数:

Linux:

netstat -ano | grep ESTABLISHED | wc --lnetstat -ano | grep TIME_WAIT | wc --l

Windows:

netstat -ano | find /i "estab" /cnetstat -ano | find /i "TIME_WAIT" /c

如果上述命令返回的值接近允许的本地端口范围(客户端连接的源端口),则可能会出现端口耗尽的情况。

要减少端口耗尽的情况,请完成以下任务:

  • 解决所有会耗尽可用连接的应用程序级别问题。
  • 增加操作系统本地(临时)端口范围:
net.ipv4.ip_local_port_range = 1025 61000

**注意:**由于静默关闭连接,端口范围的总数可能有助于解决端口分配问题,也可能无助于解决该问题。

释放容量时出现 IdleTimeoutCount 错误

如果使用 NAT 网关的连接持续空闲 350 秒或更长时间,则连接会超时。另外,IdleTimeoutCount 指标也会达到峰值。如果连接超时,NAT 网关会向 NAT 网关后面任何试图继续连接的资源返回 RST 数据包。NAT 网关不发送 FIN 数据包。

要解决或绕过 IdleTimeoutCount 错误,请完成以下任务:

  • 使用 Amazon CloudWatch 中的 IdleTimeoutCount 指标来监控空闲连接的增加情况。请务必配置 CloudWatch Contributor Insights,以了解导致客户端进程处于空闲状态的主要因素。
  • 关闭来自客户端的空闲连接以释放容量。
  • 通过连接发起更多流量。
  • 在值小于 350 秒的实例上启用 TCP keepalive

来自 NAT 网关的带宽限制

NAT 网关支持 5 Gbps 的带宽,并且可以纵向扩展到 100 Gbps。如果 NAT 网关中所有实例的网络吞吐量指标均等于或大于 100 Gbps,则流量会减慢。有关更多信息,请参阅 NAT 网关指标和维度

要解决或绕过 NAT 网关的带宽限制,请在多个子网之间分配资源并创建多个 NAT 网关。

有关更多信息,请参阅如何使用 Amazon CloudWatch 指标来确定 NAT 网关带宽问题?

相关信息

如何解决在使用 NAT 实例时出现的间歇性连接问题?

排查 NAT 网关存在的问题

AWS 官方
AWS 官方已更新 6 个月前