Amazon Virtual Private Cloud
用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

NAT 网关

您可以使用网络地址转换 (NAT) 网关允许私有子网中的实例连接到 Internet 或其他 AWS 服务,但是阻止 Internet 发起与这些实例的连接。有关 NAT 的更多信息,请参阅NAT

您在账户中创建和使用 NAT 网关会产生费用。NAT 网关小时使用费率和数据处理费率适用于此。Amazon EC2 数据传输费同样适用。有关更多信息,请参阅 Amazon VPC 定价

NAT 网关不支持 IPv6 流量,而是改用仅出口 Internet 网关。有关更多信息,请参阅 仅出口 Internet 网关

NAT 网关基本知识

要创建 NAT 网关,您必须指定 NAT 网关将处于哪个公有子网中。有关公有子网和私有子网的更多信息,请参阅子网路由。还必须在创建 NAT 网关时指定与该网关关联的弹性 IP 地址。创建 NAT 网关之后,必须更新与您的一个或多个私有子网关联的路由表,以将 Internet 绑定流量指向该 NAT 网关。这使您的私有子网中的实例可以与 Internet 通信。

每个 NAT 网关都在特定可用区中创建,并在该可用区进行冗余实施。您可以在一个可用区中创建的 NAT 网关存在数量限制。有关更多信息,请参阅 Amazon VPC 限制

注意

如果您在多个可用区中拥有资源,并且它们共享一个 NAT 网关,则在该 NAT 网关的可用区不可用时,其他可用区中的资源也无法访问 Internet。要创建不依赖于可用区的架构,请在每个可用区中都创建一个 NAT 网关,并配置路由以确保这些资源使用自身可用区中的 NAT 网关。

您可以删除不再需要的 NAT 网关。删除 NAT 网关会解除其弹性 IP 地址关联,但不会从您的账户释放该地址。

NAT 网关具有以下特征:

  • 一个 NAT 网关最多支持 10 Gbps 带宽的突增。如果您需要 10 Gbps 以上的突增能力,可以通过将资源拆分到多个子网中并在每个子网中都创建 NAT 网关来分配工作负载。

  • 每个 NAT 网关只能关联一个弹性 IP 地址。创建弹性 IP 地址后,无法解除该地址与 NAT 网关的关联。如果您需要为 NAT 网关使用不同的弹性 IP 地址,则必须创建具有所需地址的新 NAT 网关,更新路由表,然后删除现有 NAT 网关 (如果不再需要)。

  • NAT 网关支持以下协议:TCP、UDP 和 ICMP。

  • 不能为 NAT 网关关联安全组。可以为私有子网中的实例使用安全组以便控制进出这些实例的流量。

  • 您可以使用网络 ACL 控制进出 NAT 网关所在子网的流量。网络 ACL 适用于 NAT 网关的流量。NAT 网关使用端口 1024 - 65535。有关更多信息,请参阅 网络 ACL

  • NAT 网关在创建时会收到一个网络接口,该网络接口从您的子网的 IP 地址范围自动分配有一个私有 IP 地址。可以在 Amazon EC2 控制台中查看 NAT 网关的网络接口。有关更多信息,请参阅查看有关网络接口的详细信息。此网络接口的属性不可修改。

  • 不能通过与 VPC 关联的 ClassicLink 连接来访问 NAT 网关。

下图演示了一个包含 NAT 网关的 VPC 架构。主路由表将 Internet 流量从私有子网中的实例发送到 NAT 网关。NAT 网关通过使用自身的弹性 IP 地址作为源 IP 地址,将流量发送到 Internet 网关。

 具有公有和私有子网以及一个 NAT 网关的 VPC

从 NAT 实例迁移

如果您已在使用 NAT 实例,可以将它替换为 NAT 网关。为此,可以在您的 NAT 实例所在的同一子网中创建一个 NAT 网关,然后将路由表中指向该 NAT 实例的现有路由替换为指向该 NAT 网关的路由。若要对 NAT 网关使用当前用于 NAT 实例的同一个弹性 IP 地址,还须先解除该弹性 IP 地址与 NAT 实例的关联,并在创建 NAT 网关时将该地址与该网关关联。

注意

如果您将路由从 NAT 实例更改为 NAT 网关,或者,如果解除弹性 IP 地址与 NAT 实例的关联,则所有当前连接都会中断,必须重新建立。请确保您没有任何关键任务 (或任何通过 NAT 实例操作的其他任务) 正在运行。

将 NAT 网关用于 VPC 终端节点、VPN、AWS Direct Connect 或 VPC 对等连接

NAT 网关无法通过 VPC 终端节点、VPN 连接、AWS Direct Connect 或 VPC 对等连接发送流量。如果私有子网中的实例需要通过 VPC 终端节点、VPN 连接或 AWS Direct Connect 访问资源,请使用私有子网的路由表将流量直接路由到这些设备。

例如,如果私有子网的路由表包含以下路由:Internet 绑定流量 (0.0.0.0/0) 路由到一个 NAT 网关,Amazon S3 流量 (pl-xxxxxxxx;Amazon S3 的特定 IP 地址范围) 路由到一个 VPC 终端节点,而 10.25.0.0/16 流量路由到一个 VPC 对等连接。pl-xxxxxxxx 和 10.25.0.0/16 IP 地址范围比 0.0.0.0/0 更加具体;当实例将流量发送到 Amazon S3 或对等 VPC 时,流量会发送到 VPC 终端节点或 VPC 对等连接。当实例将流量发送到 Internet (非 Amazon S3 IP 地址) 时,流量会发送到 NAT 网关。

无法通过 VPC 对等连接、VPN 连接或 AWS Direct Connect 将流量路由到 NAT 网关。这些连接另一端的资源不能使用 NAT 网关。

使用 NAT 网关

您可以使用 Amazon VPC 控制台创建、查看和删除 NAT 网关。也可以使用 Amazon VPC 向导创建具有公有子网、私有子网和 NAT 网关的 VPC。有关更多信息,请参阅 场景 2:带有公有子网和私有子网 (NAT) 的 VPC

创建 NAT 网关

要创建 NAT 网关,必须指定子网和弹性 IP 地址。确保弹性 IP 地址当前未与实例或网络接口关联。若要从 NAT 实例迁移到 NAT 网关,并且希望重复使用 NAT 实例的弹性 IP 地址,则必须先解除该地址与 NAT 实例的关联。

创建 NAT 网关

  1. 打开 Amazon VPC 控制台 https://console.amazonaws.cn/vpc/

  2. 在导航窗格中,依次选择 NAT GatewaysCreate NAT Gateway

  3. 在对话框中,指定要在其中创建 NAT 网关的子网,并选择要与该 NAT 网关相关联的弹性 IP 地址。完成后,选择 Create a NAT Gateway

  4. NAT 网关会显示在控制台中。片刻之后,其状态会更改为 Available,此后它即准备好供您使用。

如果 NAT 网关变为 Failed 状态,则表示在创建过程中发生了错误。有关更多信息,请参阅 NAT 网关变为 Failed 状态

更新路由表

创建 NAT 网关之后,必须更新私有子网的路由表已将 Internet 流量指向该 NAT 网关。我们使用与流量匹配的最明确路由以判断数据流的路由方式 (最长前缀匹配)。有关更多信息,请参阅 路由优先级

为 NAT 网关创建路由

  1. 打开 Amazon VPC 控制台 https://console.amazonaws.cn/vpc/

  2. 在导航窗格中,选择 Route Tables

  3. 选择与私有子网关联的路由表,然后依次选择 RoutesEdit

  4. 选择 Add another route。对于 Destination,输入 0.0.0.0/0。对于 Target,选择 NAT 网关的 ID。

    注意

    若在从 NAT 实例进行迁移,则可以将指向该 NAT 实例的当前路由替换为指向 NAT 网关的路由。

  5. 选择 Save

为确保 NAT 网关可以访问 Internet,与 NAT 网关所在子网关联的路由表必须包含使 Internet 流量指向 Internet 网关的路由。有关更多信息,请参阅 创建自定义路由表。如果删除 NAT 网关,则 NAT 网关路由会保留为 blackhole 状态,直到您删除或更新这些路由。有关更多信息,请参阅 在路由表中添加和删除路由

删除 NAT 网关

可以使用 Amazon VPC 控制台删除 NAT 网关。删除了 NAT 网关之后,其条目会在短时间内 (通常为一小时) 在 Amazon VPC 控制台中保持可见,在此之后自动删除。您无法自己删除此条目。

删除 NAT 网关

  1. 打开 Amazon VPC 控制台 https://console.amazonaws.cn/vpc/

  2. 在导航窗格中,选择 NAT Gateways

  3. 选择 NAT 网关,然后选择 Delete NAT Gateway

  4. 在确认对话框中,选择 Delete NAT Gateway

测试 NAT 网关

创建 NAT 网关并更新路由表之后,可以从私有子网中的实例对 Internet 执行 ping 操作以测试它是否可以连接到 Internet。有关如何执行此操作的示例,请参阅测试 Internet 连接

如果能够连接到 Internet,还可以执行以下测试以确定 Internet 流量是否在通过 NAT 网关进行路由:

  • 您可以从私有子网中的实例跟踪流量的路由情况。为此,请从私有子网中的 Linux 实例运行 traceroute 命令。在输出中,应在一个跃点 (通常是第一个跃点) 中看到 NAT 网关的私有 IP 地址。

  • 从私有子网中的实例连接第三方网站或工具时,查看该网站或工具显示的源 IP 地址。源 IP 地址应是您的 NAT 网关的弹性 IP 地址。可以在 Amazon VPC 控制台中的 NAT Gateways 页面上查看 NAT 网关的信息,以获得其弹性 IP 地址和私有 IP 地址。

如果以上测试失败,请参阅 NAT 网关问题排查

测试 Internet 连接

以下示例演示如何测试私有子网中的实例是否可以连接到 Internet。

  1. 在公有子网中启动实例 (将使用此实例作为堡垒服务器)。有关更多信息,请参阅 在您的子网中启动一项实例。在启动向导中,确保选择一个 Amazon Linux AMI,并为实例分配公有 IP 地址。确保安全组规则允许来自本地网络的 IP 地址范围的入站 SSH 流量 (还可以对此测试使用 0.0.0.0/0) 以及发送到私有子网的 IP 地址范围的出站 SSH 流量。

  2. 在您的私有子网中启动实例。在启动向导中,确保选择一个 Amazon Linux AMI。请勿向实例分配公有 IP 地址。应确保安全组规则允许来自在公有子网中启动的实例的私有 IP 地址的入站 SSH 流量以及所有出站 ICMP 流量。必须选择用于在公有子网中启动实例的相同密钥对。

  3. 在本地计算机上配置 SSH 代理转发,并连接到公有子网中的堡垒服务器。有关更多信息,请参见 针对 Linux 或 OS X 配置 SSH 代理转发针对 Windows (PuTTY) 配置 SSH 代理转发

  4. 在堡垒服务器中,连接到私有子网中的实例,然后从私有子网中的实例测试 Internet 连接。有关更多信息,请参阅 测试 Internet 连接

针对 Linux 或 OS X 配置 SSH 代理转发

  1. 在您的本地计算机上,将私有秘钥添加到身份验证代理。

    对于 Linux,请使用以下命令:

    Copy
    ssh-add -c mykeypair.pem

    对于 OS X,请使用以下命令:

    Copy
    ssh-add -K mykeypair.pem
  2. 通过使用 -A 选项启用 SSH 代理转发来连接到公有子网中的实例,并使用该实例的公有地址;例如:

    Copy
    ssh -A ec2-user@54.0.0.123

针对 Windows (PuTTY) 配置 SSH 代理转发

  1. 如果尚未安装 Pageant,请从 PuTTY 下载页面下载并安装 Pageant。

  2. 将您的私有密钥转换为 .ppk 格式。有关更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的使用 PuTTYgen 转换您的私有密钥

  3. 启动 Pageant,右键单击任务栏上的 Pageant 图标 (可能已隐藏),并选择 Add Key。选择您创建的 .ppk 文件,输入密码 (如果需要),然后选择 Open

  4. 启动 PuTTY 会话,并使用公有 IP 地址连接到公有子网中的实例。有关更多信息,请参阅启动 PuTTY 会话。在 Auth (身份验证) 类别中,确保选择了 Allow agent forwarding (允许代理转发) 选项,将 Private key file for authentication (用于身份验证的私有密钥文件) 字段留空。

测试 Internet 连接

  1. 从公有子网中的实例,使用私有 IP 地址连接到私有子网中的实例,例如:

    Copy
    ssh ec2-user@10.0.1.123
  2. 从私有实例,通过对启用了 ICMP 的网站运行 ping 命令来测试是否可以连接到 Internet,例如:

    Copy
    ping ietf.org
    PING ietf.org (4.31.198.44) 56(84) bytes of data.
    64 bytes from mail.ietf.org (4.31.198.44): icmp_seq=1 ttl=47 time=86.0 ms
    64 bytes from mail.ietf.org (4.31.198.44): icmp_seq=2 ttl=47 time=75.6 ms
    ...

    按键盘上的 Ctrl+C 以取消 ping 命令。如果 ping 命令失败,请参阅 私有子网中的实例无法访问 Internet

  3. (可选) 终止您不再需要的实例。想要了解更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的终止您的实例

NAT 网关问题排查

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

NAT 网关变为 Failed 状态

如果您创建一个 NAT 网关并且它变为 Failed 状态,则表示在创建该网关时发生了错误。要查看错误消息,请转到 Amazon VPC 控制台,选择 NAT Gateways,选择您的 NAT 网关,然后在详细信息窗格中的 Status 字段中查看错误消息。

注意

失败的 NAT 网关会在短时间 (通常是大约一小时) 之后自动删除。

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

显示的错误 原因 纠正步骤
子网没有足够的空闲地址来创建此 NAT 网关 指定的子网没有任何空闲的私有 IP 地址。NAT 网关需要从子网范围分配了私有 IP 地址的网络接口。 您可以转到 Amazon VPC 控制台中的 Subnets 页面,然后在您子网的详细信息窗格中查看 Available IPs 字段,来检查子网中可用的 IP 地址数。要在子网中创建空闲的 IP 地址,可以删除未使用的网络接口,或终止不需要的实例。
网络 vpc-xxxxxxxx 未连接任何 Internet 网关 必须在具有 Internet 网关的 VPC 中创建 NAT 网关。 创建 Internet 网关,并将其连接到您的 VPC。有关更多信息,请参阅 连接 Internet 网关
弹性 IP 地址 eipalloc-xxxxxxxx 无法与此 NAT 网关相关联 指定的弹性 IP 地址不存在或无法找到。 检查弹性 IP 地址的分配 ID 以确保正确输入了它。确保指定的弹性 IP 地址与所创建的 NAT 网关在同一区域中。
弹性 IP 地址 eipalloc-xxxxxxxx 已关联 指定的弹性 IP 地址已与其他资源关联,无法与 NAT 网关相关联。 可以转到 Amazon VPC 控制台中的 Elastic IPs 页面,查看为实例 ID 或网络接口 ID 指定的值,来检查与弹性 IP 地址关联的资源。如果该资源不需要该弹性 IP 地址,则可以解除两者的关联。或者,也可以向您的账户分配新的弹性 IP 地址。有关更多信息,请参阅 使用弹性 IP 地址
此 NAT 网关在内部创建并使用的网络接口 eni-xxxxxxxx 处于无效状态。请重试。 为 NAT 网关创建或使用网络接口时出现问题。 无法修复此错误。请再次尝试创建 NAT 网关。

您已达到弹性 IP 地址或 NAT 网关限制

如果您已达到弹性 IP 地址限制,则可以从其他资源解除弹性 IP 的关联,也可以使用 Amazon VPC Limits form 请求提高限制。

如果您已达到 NAT 网关限制,则可以执行以下操作之一:

  • 使用 Amazon VPC Limits form 请求提高限制。NAT 网关限制针对每个可用区执行。

  • 检查 NAT 网关的状态。PendingAvailableDeleting 状态的网关就占用限额。如果您刚刚删除了 NAT 网关,请等待几分钟以便状态从 Deleting 变为 Deleted,然后尝试创建新 NAT 网关。

  • 如果您在特定可用区中不需要 NAT 网关,请尝试在未达到限制的可用区中创建 NAT 网关。

有关 限制的更多信息,请参阅 Amazon VPC 限制

不支持可用区 (NotAvailableInZone)

在某些情况下,您可能会尝试在受约束的可用区 (即我们的扩展能力受约束的区域) 中创建 NAT 网关。我们无法在这些区域中支持 NAT 网关。您可以在其他可用区中创建 NAT 网关并将它用于受约束区域中的私有子网。您还可以将资源移动到不受约束的可用区,以便您的资源和 NAT 网关处于同一可用区中。

您创建了 NAT 网关,但它不再可见

创建 NAT 网关时可能发生错误,该网关已失败。状态为 failed 的 NAT 网关在短时间内 (通常为一小时) 在 VPC 控制台中可见,之后会自动删除。查看 NAT 网关变为 Failed 状态 中的信息,然后尝试创建新 NAT 网关。

NAT 网关不响应 Ping 命令

如果您尝试从 Internet (例如从家庭计算机) 或从 VPC 中的任何实例对 NAT 网关的弹性 IP 地址或私有 IP 地址执行 ping 操作,则您不会收到响应。NAT 网关仅从私有子网中的实例向 Internet 传输流量。

要测试 NAT 网关是否正常运行,请参阅 测试 NAT 网关

私有子网中的实例无法访问 Internet

如果您按照以上步骤测试 NAT 网关,但是 ping 命令失败,或者实例无法访问 Internet,请检查以下信息:

  • 检查 NAT 网关是否处于 Available 状态。在 Amazon VPC 控制台中,转到 NAT Gateways 页面,然后在详细信息窗格中查看状态信息。如果 NAT 网关处于失败状态,则表示在创建它时可能发生了错误。有关更多信息,请参阅 NAT 网关变为 Failed 状态

  • 检查您是否正确配置了路由表:

    • NAT 网关所处的公有子网必须具有将 Internet 流量路由到 Internet 网关的路由表。有关更多信息,请参阅 创建自定义路由表

    • 实例所处的私有子网必须具有将 Internet 流量路由到 NAT 网关的路由表。有关更多信息,请参阅 更新路由表

    • 检查是否没有其他路由表条目将全部或部分 Internet 流量路由到其他设备而不是 NAT 网关。

  • 确保私有实例的安全组规则允许出站 Internet 流量。要使 ping 命令正常运行,这些规则还必须允许出站 ICMP 流量。

    注意

    NAT 网关本身允许所有出站流量以及响应出站请求时收到的流量 (因此它是有状态的)。

  • 确保与私有子网和公有子网关联的网络 ACL 没有阻止入站或出站 Internet 流量的规则。要使 ping 命令正常运行,这些规则还必须允许入站和出站 ICMP 流量。

    注意

    可以启用流日志以帮助诊断由于网络 ACL 或安全组规则而中断的连接。有关更多信息,请参阅 VPC 流日志

  • 如果使用 ping 命令,请确保在对启用了 ICMP 的网站执行 ping 操作。否则,您不会收到应答数据包。要对此进行测试,请从您自己计算机上的命令行终端执行相同的 ping 命令。

  • 检查实例是否能够对其他资源成功执行 ping 操作,例如私有子网中的其他实例 (假设安全组规则允许这样做)。

  • 确保您的连接仅使用 TCP、UDP 或 ICMP 协议。

与特定终端节点的 TCP 连接失败

如果与特定终端节点或主机的 TCP 连接失败,则即使与其他终端节点的 TCP 连接运行正常,也请验证您尝试连接到的终端节点是否将通过分段 TCP 数据包响应。NAT 网关当前不支持 TCP 的 IP 分段。有关更多信息,请参阅 NAT 实例与 NAT 网关的比较

要检查终端节点是否将发送分段 TCP 数据包,请使用包含公有 IP 地址的公有子网中的实例执行下列操作:

  • 触发足够大的响应以产生来自特定终端节点的分段。

  • 使用 tcpdump 实用工具验证终端节点是否将发送分段数据包。

重要

您必须使用公有子网中的实例执行这些检查;您不能使用原始连接失败的实例,或 NAT 网关或 NAT 实例后面的私有子网中的实例。

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

注意

NAT 网关也不支持 ICMP 协议的 IP 分段。发送或接收大型 ICMP 数据包的诊断工具将报告数据包丢失。例如,命令 ping -s 10000 example.com 将不会在 NAT 网关后面工作。

追踪路由输出未显示 NAT 网关私有 IP 地址

您的实例可以访问 Internet,但是当您执行 traceroute 命令时,输出未显示 NAT 网关的私有 IP 地址。这种情况说明您的实例在使用不同设备 (例如 Internet 网关) 访问 Internet。在实例所处的子网的路由表中,检查以下信息:

  • 确保存在将 Internet 流量发送到 NAT 网关的路由。

  • 确保没有其他特定路由将 Internet 流量发送到其他设备 (如虚拟专用网关或 Internet 网关)。

Internet 连接在 5 分钟之后中断

如果使用 NAT 网关的连接空闲 5 分钟或更长时间,则连接会超时。您可以通过该连接发起更多流量或使用 TCP 保持连接信号防止连接中断。

无法建立 IPSec 连接

NAT 网关当前不支持 IPSec 协议。

无法向目标发起更多连接

您可能已达到并发连接数限制。对于每个唯一目标,NAT 网关最多可以支持 65000 个并发连接。如果私有子网中的实例创建了大量连接,则您可能会达到此限制。您可以执行以下操作之一:

  • 对每个可用区创建一个 NAT 网关,并在这些区域间分布客户端。

  • 在公有子网中创建更多 NAT 网关并将客户端拆分到多个私有子网中 (各自具有指向不同 NAT 网关的路由)。

  • 限制客户端可对目标创建的连接数。

  • 关闭空闲连接以释放容量。

注意

如果目标 IP 地址、目标端口或协议 (TCP/UDP/ICMP) 发生更改,则可以再创建 65000 个连接。

控制 NAT 网关的使用

默认情况下,IAM 用户无权使用 NAT 网关。您可以创建一个 IAM 用户策略,以向用户授予创建、描述和删除 NAT 网关的权限。我们目前对所有 ec2:*NatGateway* API 操作都不支持资源级权限。有关用于 Amazon VPC 的 IAM 策略的更多信息,请参阅 控制访问 Amazon VPC 资源

API 和 CLI 概述

您可以使用命令行或 API 执行此页面上介绍的任务。有关命令行界面的更多信息以及可用 API 操作的列表,请参阅 访问 Amazon VPC

创建 NAT 网关

描述 NAT 网关

删除 NAT 网关