如何排查在私有 VPC 上使用 NAT 网关的连接问题?

上次更新日期:2022 年 4 月 12 日

我正在使用 NAT 网关将私有 Virtual Private Cloud(Amazon VPC)子网中的实例连接到互联网。这些实例存在间歇性连接问题。如何排查此问题?

简短描述

私有子网资源可能会遇到间歇性的连接超时问题,原因如下:

  • 网络访问控制列表(ACL)规则。
  • NAT 网关上出现 ErrorPortAllocation 错误。
  • 客户端实例端口耗尽

由于以下原因,私有子网资源的连接可能会突然中断:

  • 释放容量时出现 IdleTimeoutCount 错误。

由于以下原因,私有子网资源的连接速度可能会变慢:

  • 每个 NAT 网关的带宽限制

解决方法

私有子网资源出现间歇性连接超时问题

网络 ACL 规则

确认与存在 NAT 网关的公有子网关联的网络 ACL 允许来自临时端口范围(1024-65535)的流量。如果网络 ACL 只允许临时端口范围的子集,而私有子网中的实例使用该范围之外的源端口,则流量将被丢弃。有关如何配置网络 ACL 的更多信息,请参阅适用于具有公有和私有子网(NAT)的 VPC 的推荐网络 ACL 规则

NAT 网关上出现 ErrorPortAllocation 错误

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

客户端实例端口耗尽

检查私有子网中的客户端实例是否已达到其操作系统级别的连接限制。要查看活动连接数,请运行 netstat 命令:

Linux:

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

Windows:

netstat -ano | find /i "estab" /c
netstat -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 秒的实例,启用 TCPkeepalive

私有子网资源连接速度缓慢

NAT 网关的带宽限制

  • NAT 网关支持 5Gbps 的带宽,并可自动扩展到 45Gbps。如果 NAT 网关后面的所有实例的联网吞吐量指标总和等于或大于 45Gbps 的突发流量,则流量传递速度会减慢。
  • 使用 CloudWatch 指标,带宽的计算公式为:(BytesOutToDestination + BytesOutToSource + BytesInFromDestination + BytesInFromSource)* 8 /时间段(单位:秒)。

针对每个 NAT 网关的带宽限制的解决方法:

如果 NAT 网关的带宽大于 45Gbps,则可以在多个子网之间分配资源并创建多个 NAT 网关。