我想解决在我的私有 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 网关存在的问题