本文介绍NAT网关的常见故障及排查方案。

ECS实例配置DNAT条目,但是无法被公网访问

以下两种情况都可能导致上述问题。
  • 安全组不允许公网访问DNAT条目中配置的ECS实例的私网端口。

    请确认ECS实例中的安全组是否允许公网访问DNAT条目中配置的ECS实例的私网端口。如果安全组不允许ECS实例的私网端口,请开放该端口,具体操作,请参见添加安全组规则

    您可以在同VPC内的其他ECS实例执行 telnet <ECS实例私网IP地址> <私网端口>命令,确认DNAT条目中配置的ECS实例的私网端口是否可被访问。
    • 系统出现类似以下回显,表明DNAT条目中配置的ECS实例的私网端口可被访问。
      Connected to <ECS实例私网IP地址>
      表明DNAT条目中配置的ECS实例的私网端口可被访问。
    • 系统出现类似以下回显,表明DNAT条目中配置的ECS实例的私网端口不可被访问。
      unable connect to remote host: Connection timed out
    如果ECS实例的私网端口不可被私网访问,则也不可被公网访问。
  • 路由表中没有目标网段为0.0.0.0/0,下一跳为NAT网关的自定义路由条目。

    因为DNAT条目中配置的ECS实例被访问后回复响应报文时,也需要有去往NAT网关的路由。因此,请确认您使用的系统路由表或自定义路由表中是否有上述自定义路由条目,如果没有,请手动进行添加,具体操作,请参见添加路由表中的路由条目

VPC内新建交换机下的ECS实例无法通过SNAT访问公网,而该VPC内其他交换机下的ECS实例可以通过SNAT访问公网

以下两种情况都可能导致上述问题。
  • NAT网关中的SNAT条目中不包含新建的交换机的网段。

    NAT网关不会为新建的交换机配置SNAT条目,您需要检查新建的交换机的网段是否已经包含在NAT网关已有SNAT条目中。如果未包含,则该交换机下的ECS实例无法访问公网。请您手动配置SNAT条目,具体操作,请参见创建SNAT实现访问公网服务

  • 新建的交换机绑定了自定义路由表,但自定义路由表中没有目标网段为0.0.0.0/0,下一跳为NAT网关的自定义路由条目。

    请确认自定义路由表中是否有上述路由条目,如果没有,请手动进行添加,具体操作,请参见添加路由表中的路由条目

VPC内存在多个NAT网关时,某个交换机下的ECS实例不能访问公网

如果该VPC内只使用系统路由表,且只有一条目标网段为0.0.0.0/0,下一跳指向其中一个NAT网关的自定义路由条目。当VPC内某个交换机的网段不在该NAT网关的SNAT条目中,则该交换机下的ECS实例不能访问公网。

  • 如果无需使用多个NAT网关,建议您删除不需要使用的NAT网关,并为保留的NAT网关增加SNAT条目配置。
  • 如果需要使用多个NAT网关,请参见同VPC内多NAT网关部署方案

客户端(例如,ECS实例的应用程序)访问某公网服务时,出现连接超时、下载速度变慢等异常现象

  • 如果通过监控查看到以下两种情况并无异常,出现的异常为偶发现象,且您ECS实例较多不便排查ECS实例的异常流量情况,您可以开通NAT网关流量监控来排查异常流量来源。具体操作,请参见查看网关流量监控
    • 如果您的NAT网关是按固定规格计费,您可以通过NAT网关监控来查看并发连接数、新建连接速率是否存在超规格丢弃的情况。具体操作,请参见查看NAT网关监控。如果存在超规格丢弃的情况,建议您升级NAT网关的规格解决该问题。
    • 通过NAT网关监控排查您的NAT网关绑定的EIP监控是否存在超过带宽限制丢包的情况。具体操作,请参见查看NAT绑定的弹性公网IP监控。如果有这种情况,建议您升级EIP的带宽解决该问题。
  • 如果您存在多台Linux操作系统的ECS实例通过NAT网关并发访问基于Linux操作系统服务端的场景,由于Linux操作系统内核实现的原因,可能存在TCP连接请求被Linux操作系统内核丢弃而导致连接超时或失败的情况。建议您关闭服务端Linux net.ipv4.tcp_tw_recycle选项,或关闭客户端Linux net.ipv4.tcp_timestamps选项。