

# 排查 NAT 网关的问题
<a name="nat-gateway-troubleshooting"></a>

以下主题可帮助您排查在创建或使用 NAT 网关时可能遇到的常见问题。

**Topics**
+ [NAT 网关创建失败](#nat-gateway-troubleshooting-failed)
+ [NAT 网关配额](#nat-gateway-troubleshooting-quota)
+ [弹性 IP 地址配额](#nat-gateway-troubleshooting-limits)
+ [不支持可用区](#nat-gateway-troubleshooting-unsupported-az)
+ [NAT 网关不再可见](#nat-gateway-troubleshooting-gateway-removed)
+ [NAT 网关不响应 Ping 命令](#nat-gateway-troubleshooting-ping)
+ [实例无法访问 Internet](#nat-gateway-troubleshooting-no-internet-connection)
+ [到目标的 TCP 连接失败](#nat-gateway-troubleshooting-tcp-issues)
+ [追踪路由输出未显示 NAT 网关私有 IP 地址](#nat-gateway-troubleshooting-traceroute)
+ [Internet 连接在 350 秒后中断](#nat-gateway-troubleshooting-timeout)
+ [无法建立 IPsec 连接](#nat-gateway-troubleshooting-ipsec)
+ [无法发起更多连接](#nat-gateway-troubleshooting-simultaneous-connections)

## NAT 网关创建失败
<a name="nat-gateway-troubleshooting-failed"></a>

**问题**  
您创建一个 NAT 网关，但它进入的状态为 `Failed`。

**注意**  
出现故障的 NAT 网关会被自动删除，通常在大约一小时内。

**原因**  
创建 NAT 网关时出错。返回的状态消息提供了出现此错误的原因。

**解决方案**  
要查看错误消息，请打开 Amazon VPC 控制台，然后选择 **NAT Gateways**（NAT 网关）。选择 NAT 网关对应的单选按钮，然后在 **Details**（详细信息）选项卡上找到 **State message**（状态消息）。

下表列出 Amazon VPC 控制台中指示的可能的失败原因。执行所示任何纠正步骤之后，您可以再次尝试创建 NAT 网关。


| 显示的错误 | 原因 | 解决方案 | 
| --- | --- | --- | 
| 子网没有足够的空闲地址来创建此 NAT 网关 | 指定的子网没有任何空闲的私有 IP 地址。NAT 网关需要从子网范围分配了私有 IP 地址的网络接口。 | 检查子网中可用的 IP 地址数，方法是在 Amazon VPC 控制台中前往 Subnets (子网) 页面。您可以在子网的详细信息创窗格中查看 Available IP。要在子网中创建空闲的 IP 地址，可以删除未使用的网络接口，或终止不需要的实例。 | 
| 网络 vpc-xxxxxxxx 未连接任何互联网网关 | 必须在具有 Internet 网关的 VPC 中创建 NAT 网关。 | 创建 Internet 网关，并将其连接到您的 VPC。有关更多信息，请参阅 [向子网添加互联网访问权限](working-with-igw.md)。 | 
| 弹性 IP 地址 eipalloc-xxxxxxxx 已关联 | 指定的弹性 IP 地址已与其他资源关联，无法与 NAT 网关相关联。 | 检查哪个资源与弹性 IP 地址相关联。前往 Amazon VPC 控制台中的 Elastic IPs (弹性 IP) 页面，并查看为实例 ID 或网络接口 ID 指定的值。如果该资源不需要该弹性 IP 地址，则可以解除两者的关联。或者，也可以向您的账户分配新的弹性 IP 地址。有关更多信息，请参阅 [开始使用弹性 IP 地址](WorkWithEIPs.md)。 | 

## NAT 网关配额
<a name="nat-gateway-troubleshooting-quota"></a>

您在尝试创建 NAT 网关时收到以下错误。

```
Performing this operation would exceed the limit of 5 NAT gateways
```

**原因**  
您已达到该可用区域的 NAT 网关数量的配额。

**解决方案**

如果您已达到此 NAT 网关在账户中的配额，则可以执行以下操作之一：
+ 使用 Service Quotas 控制台请求增加[每个可用区域的 NAT 网关配额](https://console.aws.amazon.com/servicequotas/home/services/vpc/quotas/L-FE5A380F)。
+ 检查 NAT 网关的状态。`Pending`、`Available` 或 `Deleting` 状态的网关就占用限额。如果您最近删除了 NAT 网关，请等待几分钟，以便状态从 `Deleting` 变为 `Deleted`。然后尝试新建一个 NAT 网关。
+ 如果您在特定可用区中不需要 NAT 网关，请尝试在未达到配额的可用区中创建 NAT 网关。

有关更多信息，请参阅 [Amazon VPC 配额](amazon-vpc-limits.md)。

## 弹性 IP 地址配额
<a name="nat-gateway-troubleshooting-limits"></a>

**问题**  
您在尝试为公用 NAT 网关分配弹性 IP 地址时收到以下错误。

```
The maximum number of addresses has been reached.
```

**原因**  
您已达到该区域账户的弹性 IP 地址数量的配额。

**解决方案**  
如果您的弹性 IP 地址数已达到配额，则可以取消弹性 IP 地址与其他资源的关联，或者，您可以使用 Service Quotas 控制台请求增加[弹性 IP 配额](https://console.aws.amazon.com/servicequotas/home/services/ec2/quotas/L-0263D0A3)。

## 不支持可用区
<a name="nat-gateway-troubleshooting-unsupported-az"></a>

**问题**  
您在尝试创建 NAT 网关时收到以下错误：`NotAvailableInZone`

**原因**  
您可能会尝试在受约束的可用区（即我们的扩展能力受约束的区域）中创建 NAT 网关。

**解决方案**  
我们无法在这些可用区中支持 NAT 网关。您可以在不同可用区中创建 NAT 网关并将它用于受约束区域中的私有子网。您还可以将资源移动到不受约束的可用区，以便您的资源和 NAT 网关处于同一区中。

## NAT 网关不再可见
<a name="nat-gateway-troubleshooting-gateway-removed"></a>

**问题**  
您创建了一个 NAT 网关，但它在 Amazon VPC 控制台中不可见。

**原因**  
创建 NAT 网关期间可能出错，创建失败。状态为 `Failed` 的 NAT 网关在 Amazon VPC 控制台中保持可见大约一小时。一个小时之后会被自动删除。

**解决方案**  
查看 [NAT 网关创建失败](#nat-gateway-troubleshooting-failed) 中的信息，然后尝试创建新 NAT 网关。

## NAT 网关不响应 Ping 命令
<a name="nat-gateway-troubleshooting-ping"></a>

**问题**  
如果您尝试从互联网（例如从家庭计算机）或从 VPC 中的任何实例对 NAT 网关的弹性 IP 地址或私有 IP 地址执行 ping 操作，则不会收到响应。

**原因**  
NAT 网关仅从私有子网中的实例向 Internet 传输流量。

**解决方案**  
要测试 NAT 网关是否正常运行，请参阅 [测试公有 NAT 网关](nat-gateway-scenarios.md#public-nat-gateway-testing)。

## 实例无法访问 Internet
<a name="nat-gateway-troubleshooting-no-internet-connection"></a>

**问题**  
您创建了一个公有 NAT 网关并按照步骤进行了测试，但 `ping` 命令失败，或者您私有子网中的实例无法访问互联网。

**原因**  
出现此问题的原因可能是以下原因之一：
+ NAT 网关尚未准备好提供流量。
+ 您的路由表未得到正确配置。
+ 您的安全组或网络 ACL 阻止入站或出站流量。
+ 您使用的是不受支持的协议。

**解决方案**  
检查以下信息：
+ 检查 NAT 网关是否处于 `Available` 状态。在 Amazon VPC 控制台中，转到 **NAT 网关**页面，然后在详细信息窗格中查看状态信息。如果 NAT 网关处于失败状态，则表示在创建它时可能发生了错误。有关更多信息，请参阅 [NAT 网关创建失败](#nat-gateway-troubleshooting-failed)。
+ 检查您是否正确配置了路由表：
  + NAT 网关所处的公有子网必须具有将 Internet 流量路由到 Internet 网关的路由表。
  + 实例所处的私有子网必须具有将 Internet 流量路由到 NAT 网关的路由表。
  + 检查是否没有其他路由表条目将全部或部分 Internet 流量路由到其他设备而不是 NAT 网关。
+ 确保私有实例的安全组规则允许出站 Internet 流量。要使 `ping` 命令正常运行，这些规则还必须允许出站 ICMP 流量。

   NAT 网关本身允许所有出站流量以及响应出站请求时收到的流量 (因此它是有状态的)。
+ 确保与私有子网和公有子网关联的网络 ACL 没有阻止入站或出站 Internet 流量的规则。要使 `ping` 命令正常运行，这些规则还必须允许入站和出站 ICMP 流量。

  可以启用流日志以帮助诊断由于网络 ACL 或安全组规则而中断的连接。有关更多信息，请参阅 [使用 VPC 流日志记录 IP 流量](flow-logs.md)。
+ 如果使用 `ping` 命令，请确保在对启用了 ICMP 的主机执行 ping 操作。如果未启用 ICMP，您不会收到应答数据包。要对此进行测试，请从您自己计算机上的命令行终端执行相同的 `ping` 命令。
+ 检查实例是否能够对其他资源成功执行 ping 操作，例如私有子网中的其他实例 (假设安全组规则允许这样做)。
+ 确保您的连接仅使用 TCP、UDP 或 ICMP 协议。

## 到目标的 TCP 连接失败
<a name="nat-gateway-troubleshooting-tcp-issues"></a>

**问题**  
在通过 NAT 网关从私有子网中的实例连接到特定目标时，有些 TCP 连接会成功，但也有些连接会失败或超时。

**原因**  
出现此问题的原因可能是以下原因之一：
+ 目标终端节点正在使用分段 TCP 数据包进行响应。NAT 网关不支持 TCP 或 ICMP 的 IP 碎片。有关更多信息，请参阅 [比较 NAT 网关和 NAT 实例](vpc-nat-comparison.md)。
+ 远程服务器上启用了 `tcp_tw_recycle` 选项，当 NAT 设备后有多个连接时，启用该选项会导致问题。

**解决方案**  
通过执行以下操作，验证您尝试连接的终端节点是否正在使用分段 TCP 数据包进行响应：

1. 使用具有公共 IP 地址的公有子网中的实例来触发足够大的响应，以产生来自特定终端节点的分段。

1. 使用 `tcpdump` 实用工具验证终端节点是否将发送分段数据包。
**重要**  
您必须使用公有子网中的实例来执行这些检查。您不能使用原始连接失败的实例，或者 NAT 网关或 NAT 实例后面的私有子网中的实例。

   发送或接收大型 ICMP 数据包的诊断工具将报告数据包丢失。例如，命令 `ping -s 10000 example.com` 将不会在 NAT 网关后面工作。

1. 如果终端节点发送分段 TCP 数据包，则可使用 NAT 实例代替 NAT 网关。

如果您有权访问远程服务器，则可以通过执行以下操作来验证是否已启用 `tcp_tw_recycle` 选项：

1. 在服务器上运行以下命令：

   ```
   cat /proc/sys/net/ipv4/tcp_tw_recycle
   ```

   如果输出为 `1`，则表明已启用 `tcp_tw_recycle` 选项。

1. 如果已启用 `tcp_tw_recycle` 选项，建议将其禁用。如果您需要重用连接，则 `tcp_tw_reuse` 是一个较为安全的选项。

如果您无权访问远程服务器，则可以通过临时禁用私有子网中的实例上的 `tcp_timestamps` 选项来进行测试。然后重新连接到远程服务器。如果连接成功，则上次连接失败的原因很可能是在远程服务器上启用了 `tcp_tw_recycle` 选项。如果可能，请与远程服务器的拥有者联系，以验证是否已启用此选项，如已启用，则请求将其禁用。

## 追踪路由输出未显示 NAT 网关私有 IP 地址
<a name="nat-gateway-troubleshooting-traceroute"></a>

**问题**  
您的实例可以访问 Internet，但是当您执行 `traceroute` 命令时，输出未显示 NAT 网关的私有 IP 地址。

**原因**  
您的实例在使用其他网关（例如互联网网关）访问互联网。

**解决方案**  
在实例所处的子网的路由表中，检查以下信息：
+ 确保存在将 Internet 流量发送到 NAT 网关的路由。
+ 确保没有其他特定路由将 Internet 流量发送到其他设备 (如虚拟私有网关或 Internet 网关)。

## Internet 连接在 350 秒后中断
<a name="nat-gateway-troubleshooting-timeout"></a>

**问题**  
您的实例可以访问互联网，但连接在 350 秒后断开。

**原因**  
如果使用 NAT 网关的连接空闲 350 秒或更长时间，则连接会超时。

如果连接超时，NAT 网关向 NAT 网关后方的任何资源返回 RST 数据包，尝试继续进行连接 (它不发送 FIN 数据包)。

**解决方案**  
要防止连接中断，您可以通过该连接发起更多流量。或者，您也可以在实例上启用值小于 350 秒的 TCP keepalive。

## 无法建立 IPsec 连接
<a name="nat-gateway-troubleshooting-ipsec"></a>

**问题**  
您无法与目标建立 IPsec 连接。

**原因**  
NAT 网关当前不支持 IPsec 协议。

**解决方案**  
您可以使用 NAT 遍历 (NAT-T) 将 IPsec 流量封装在 UDP（NAT 网关的支持协议）中。请确保您已测试您的 NAT-T 和 IPsec 配置，以验证您没有丢弃 IPsec 流量。

## 无法发起更多连接
<a name="nat-gateway-troubleshooting-simultaneous-connections"></a>

**问题**  
您有通过 NAT 网关与目标建立的现有连接，但您无法建立更多连接。

**原因**  
您可能已达到单个 NAT 网关的并发连接数限制。有关更多信息，请参阅 [NAT 网关基础知识](nat-gateway-basics.md)。如果私有子网中的实例创建了大量连接，则您可能会达到该限制。

**解决方案**  
请执行以下操作之一：
+ 对每个可用区创建一个 NAT 网关，并在这些区域间分布客户端。
+ 在公有子网中创建更多 NAT 网关并将客户端拆分到多个私有子网中 (各自具有指向不同 NAT 网关的路由)。
+ 限制客户端可对目的地创建的连接数。
+ 使用 CloudWatch 中的 [`IdleTimeoutCount` 指标](vpc-nat-gateway-cloudwatch.md)可监控空闲连接的增加。关闭空闲连接以释放容量。
+ 创建具有多个 IP 地址的 NAT 网关或向现有的 NAT 网关添加辅助 IP 地址。每个新的 IPv4 地址最多可以支持 55,000 个并发连接。有关更多信息，请参阅 [创建 NAT 网关](nat-gateway-working-with.md#nat-gateway-creating) 或 [编辑辅助 IP 地址关联](nat-gateway-working-with.md#nat-gateway-edit-secondary)。