NAT 网关 - Amazon Virtual Private Cloud

NAT 网关

NAT 网关是一种网络地址转换 (NAT) 服务。您可以使用 NAT 网关,以便私有子网中的实例可以连接到 VPC 外部的服务,但外部服务无法启动与这些实例的连接。

在创建 NAT 网关时,您指定以下连接类型之一:

  • 公开 –(默认)私有子网中的实例可以通过公共 NAT 网关连接到互联网,但不能接收来自互联网的未经请求的入站连接。您在公有子网中创建公有 NAT 网关,并且必须在创建时将弹性 IP 地址与 NAT 网关相关联。您可以将流量从 NAT 网关路由到 VPC 的互联网网关。或者,您可以使用公有 NAT 网关连接到其他 VPC 或本地部署网络。在这种情况下,您可以借助中转网关或虚拟私有网关路由来自 NAT 网关的流量。

  • 私密 – 私有子网中的实例可以通过私有 NAT 网关连接到其他 VPC 或您的本地部署网络。您可以借助中转网关或虚拟私有网关路由来自 NAT 网关的流量。您不能将弹性 IP 地址与私有 NAT 网关相关联。您可以将互联网网关连接到具有私有 NAT 网关的 VPC,但如果您将流量从私有 NAT 网关路由到互联网网关,则互联网网关会丢弃流量。

NAT 网关将实例的源 IP 地址替换为 NAT 网关的 IP 地址。对于公有 NAT 网关,这是 NAT 网关的弹性 IP 地址。对于私有 NAT 网关,这是 NAT 网关的私有 IP 地址。向实例发送响应流量时,NAT 设备会将地址转换回原始源 IP 地址。

Pricing

当您预置 NAT 网关时,NAT 网关可用的每个小时及其处理的每个 GB 数据都需支付费用。有关更多信息,请参阅 Amazon VPC 定价

以下策略可帮助您降低 NAT 网关的数据传输费用:

  • 如果您的 AWS 资源会跨可用区发送或接收大量流量,则请确保资源与 NAT 网关位于同一可用区,或者在与资源相同的可用区中创建 NAT 网关。

  • 如果通过 NAT 网关的大多数流量是到支持接口端点或网关端点的 AWS 服务,则请考虑为这些服务创建接口端点或网关端点。有关潜在成本节约的更多信息,请参阅 AWS PrivateLink 定价

NAT 网关基础知识

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

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

以下特征和规则适用于 NAT 网关:

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

  • IPv4 或 IPv6 流量支持 NAT 网关。对于 IPv6 流量,NAT 网关将执行 NAT64。通过与 DNS64 结合使用(在 Route 53 Resolver 上可用),Amazon VPC 子网中的 IPv6 工作负载可以与 IPv4 资源进行通信。这些 IPv4 服务可能存在于同一 VPC(在单独子网中)或其他 VPC、本地环境或互联网上。

  • NAT 网关支持 5 Gbps 带宽并会自动扩展到 45 Gbps。如果您需要更大的带宽,您可以将资源拆分到多个子网中,并在每个子网中创建 NAT 网关。

  • NAT 网关可以每秒处理一百万个数据包,并自动扩展到每秒 400 万个数据包。超出此限制后,NAT 网关将丢弃数据包。为防止数据包丢失,请将资源拆分到多个子网中,并为每个子网中创建单独的 NAT 网关。

  • 对于每个唯一目的地,NAT 网关最多可以支持 55000 个并发连接。如果您每秒创建了大约 900 个与单个目的地的连接 (大约每分钟 55,000 个连接),该限制也适用。如果目的地 IP 地址、目的地端口或协议 (TCP/UDP/ICMP) 发生更改,则可以再创建 55,000 个连接。若超过 55000 个连接,因接口分配错误导致连接错误的机会将提升。您可以通过查看您的 NAT 网关的 ErrorPortAllocation CloudWatch 指标来监视这些错误。有关更多信息,请参阅 使用 Amazon CloudWatch 监控 NAT 网关

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

  • 私有 NAT 网关从配置该网关的子网接收可用的私有 IP 地址。您无法分离此私有 IP 地址,也无法附加其他私有 IP 地址。

  • 不能为 NAT 网关关联安全组。您可以将安全组与实例相关联,以控制入站和出站流量。

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

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

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

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

控制 NAT 网关的使用

默认情况下,IAM 用户无权使用 NAT 网关。您可以创建一个 IAM 用户策略,以向用户授予创建、描述和删除 NAT 网关的权限。有关更多信息,请参阅 适用于 Amazon VPC 的 Identity and Access Management

使用 NAT 网关

您可以使用 Amazon VPC 控制台创建和管理 NAT 网关。也可以使用 Amazon VPC 向导创建具有公有子网、私有子网和 NAT 网关的 VPC。有关更多信息,请参阅 带有公有和私有子网的 VPC (NAT)

创建 NAT 网关

要创建 NAT 网关,请输入可选名称、子网和可选连接类型。使用公有 NAT 网关,您必须指定可用的弹性 IP 地址。私有 NAT 网关会收到一个随机从其子网中选择的主要私有 IP 地址。您不能分离主要私有 IP 地址或添加辅助私有 IP 地址。

创建 NAT 网关

  1. 通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/

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

  3. 选择 Create NAT Gateway(创建 NAT 网关)并执行以下操作:

    1. (可选)指定 NAT 网关的名称。这将创建一个标签,其中键为 Name,值是您指定的名称。

    2. 选择要在其中创建 NAT 网关的子网。

    3. 对于 Connectivity type (连接类型),选择 Private (私有) 可创建私有 NAT 网关,或者 Public (公有)(默认值)可创建公有 NAT 网关。

    4. (仅限公有 NAT 网关)对于 Elastic IP allocation ID (弹性 IP 分配 ID),选择要与 NAT 网关关联的弹性 IP 地址。

    5. (可选)对于每个标签,选择 Add new tag(添加新标签),然后输入键名称和值。

    6. 选择 Create a NAT Gateway (创建 NAT 网关)

  4. NAT 网关的初始状态为 Pending。状态更改为 Available 后,NAT 网关即可供您使用。将路由到 NAT 网关添加到私有子网的路由表,并将路由添加到 NAT 网关的路由表中。

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

标记 NAT 网关

您可以对 NAT 网关进行标记,以帮助您识别它或根据组织的需要对其进行分类。有关使用标签的信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南 中的标记您的 Amazon EC2 资源

对于 NAT 网关支持成本分配标签。因此,您还可以使用标签来整理 AWS 账单并反映您自己的成本结构。有关更多信息,请参阅 AWS Billing and Cost Management 用户指南中的使用成本分配标签。有关设置包含标签的成本分配报告的更多信息,请参阅关于 AWS 账户账单中的月度成本分配报告

删除 NAT 网关

您可以删除不再需要的 NAT 网关。删除 NAT 网关之后,其条目在一小时左右在 Amazon VPC 控制台中保持可见,在此之后自动删除。您无法自己删除此条目。

删除 NAT 网关会解除其弹性 IP 地址关联,但不会从您的账户释放该地址。如果删除 NAT 网关,则 NAT 网关路由会保留为 blackhole 状态,直到您删除或更新这些路由。

删除 NAT 网关

  1. 通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/

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

  3. 选择 NAT 网关对应的单选按钮,然后选择 Actions(操作)、Delete NAT gateway(删除 NAT 网关)。

  4. 提示进行确认时,输入 delete,然后选择 Delete(删除)。

  5. 如果您不再需要与公有 NAT 网关关联的弹性 IP 地址,建议您释放该地址。有关更多信息,请参阅 释放弹性 IP 地址

NAT 网关方案

以下是公有和私有 NAT 网关的使用案例示例。

场景:从私有子网访问互联网

您可以使用公有 NAT 网关,以启用私有子网中的实例,将出站流量发送到互联网,但互联网无法建立到这些实例的连接。

下图阐明了该使用案例的架构。可用区 A 中的公有子网包含 NAT 网关。可用区 B 中的私有子网包含实例。路由器将互联网流量从私有子网中的实例发送到 NAT 网关。NAT 网关通过使用自身的弹性 IP 地址作为源 IP 地址,将流量发送到互联网网关。


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

以下路由表与可用区 A 中的公有子网关联。第一个条目是 VPC 中本地路由的默认条目;此条目使 VPC 中的实例能够彼此通信。第二个条目将所有其他子网流量发送到互联网网关;这允许 NAT 网关访问互联网。

目的地 目标
10.0.0.0/16 本地
0.0.0.0/0 internet-gateway-id

以下路由表与可用区 B 中的私有子网关联。第一个条目是 VPC 中本地路由的默认条目;此条目使 VPC 中的实例能够彼此通信。第二个条目将所有其他子网流量(例如互联网流量)发送到 NAT 网关。

目的地 目标
10.0.0.0/16 本地
0.0.0.0/0 nat-gateway-id

测试公有 NAT 网关

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

如果能够连接到互联网,还可以测试互联网流量是否通过 NAT 网关进行路由:

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

  • 从私有子网中的实例连接第三方网站或工具时,查看该网站或工具显示的源 IP 地址。源 IP 地址应是 NAT 网关的弹性 IP 地址。

如果这些测试失败,请参阅排查 NAT 网关的问题

测试互联网连接

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

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

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

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

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

为 Linux 或 macOS 配置 SSH 代理转发

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

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

    ssh-add -c mykeypair.pem

    对于 macOS,请使用以下命令。

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

    ssh -A ec2-user@54.0.0.123

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

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

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

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

  4. 启动 PuTTY 会话,并使用公有 IP 地址连接到公有子网中的实例。有关更多信息,请参阅连接到您的 Linux 实例。在 Auth 类别中,确保选中了 Allow agent forwarding 选项,并将 Private key file for authentication 框留空。

测试 Internet 连接

  1. 从公有子网中的实例,使用私有 IP 地址连接到私有子网中的实例,如以下示例所示。

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

    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. (可选) 如果您不再需要实例,请将其终止。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南 中的终止实例

场景:允许从允许列出的 IP 地址访问您的网络

您无需从允许访问您的本地网络的 IP 地址范围中为每个实例分配一个单独的 IP 地址,而是可以在 VPC 中创建一个具有允许 IP 地址范围的子网,在子网中创建一个私有 NAT 网关,然后通过 NAT 网关将来自 VPC 的流量路由到本地部署网络。

从 NAT 实例迁移到 NAT 网关

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

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

API 和 CLI 概述

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

创建 NAT 网关

描述 NAT 网关

标记 NAT 网关

删除 NAT 网关

DNS64 和 NAT64

NAT 网关支持从 IPv6 到 IPv4 的网络地址转换,这通常称为 NAT64。NAT64 可以帮助您的 IPv6 AWS 资源与同一 VPC 或其他 VPC、本地网络或互联网中的 IPv4 资源进行通信。您可以在 Amazon Route 53 Resolver 上结合使用 NAT64 和 DNS64,也可以使用自己的 DNS64 服务器。

什么是 DNS64?

在 VPC 中运行的仅 IPv6 工作负载只能发送和接收 IPv6 网络数据包。如果没有 DNS64,则对仅 IPv4 服务的 DNS 查询将生成 IPv4 目标地址作为响应,而且仅 IPv6 服务无法与其进行通信。为了弥合这一通信缺口,您可以为子网启用 DNS64,它适用于该子网中的所有 AWS 资源。使用 DNS64,Amazon Route 53 Resolver 将查找所查询的服务的 DNS 记录,然后执行以下操作之一:

  • 如果记录包含 IPv6 地址,则它将返回原始记录并建立连接,而不会通过 IPv6 进行任何转换。

  • 如果 DNS 记录中没有与目标关联的 IPv6 地址,则 Route 53 Resolver 会在记录中的 IPv4 地址前面添加 RFC6052 (64:ff9b::/96) 中定义的已知 /96 前缀,以便合成一个地址。仅 IPv6 服务会将网络数据包发送到合成的 IPv6 地址。然后,您需要通过 NAT 网关路由此流量,该网关将对流量执行所需的转换,以允许子网中的 IPv6 服务访问该子网外部的 IPv4 服务。

您可以通过 AWS CLI 或 VPC 控制台使用 modify-subnet-attribute 来启用或禁用子网上的 DNS64,方法是选择子网,然后选择 Actions >(操作)Modify DNS64 settings(修改 DNS64 设置)。

什么是 NAT64?

通过使用 NAT64,Amazon VPC 中的仅 IPv6 服务能够与同一 VPC(不同子网中)或已连接的 VPC、本地网络或互联网中的仅 IPv4 服务进行通信。

NAT64 将在现有的 NAT 网关或您创建的任何新 NAT 网关上自动可用。您无法启用或禁用此功能。

一旦启用 DNS64 并且仅 IPv6 服务通过 NAT 网关将网络数据包发送到合成的 IPv6 地址后,将发生以下情况:

  • NAT 网关可通过 64:ff9b::/96 前缀识别出原始目标是 IPv4,并且会将 IPv6 数据包转换为 IPv4,方法是:

    • 将源 IPv6 替换为自己的私有 IP,该 IP 将被互联网网关转换为弹性 IP 地址。

    • 通过截断 64:ff9b::/96 前缀将目标 IPv6 转换为 IPv4。

  • NAT 网关通过互联网网关、虚拟私有网关或转换网关将转换后的 IPv4 数据包发送到目标,然后启动连接。

  • 仅 IPv4 主机将发回 IPv4 响应数据包。建立连接后,NAT 网关将接受来自外部主机的响应 IPv4 数据包。

  • 响应 IPv4 数据包的目标是 NAT 网关,该网关将接收数据包,并通过将其 IP(目标 IP)替换为主机的 IPv6 地址并将 64:ff9b::/96 添加回源 IPv4 地址来取消 NAT。然后,数据包将按照本地路由流向主机。

通过这种方式,NAT 网关使 Amazon VPC 子网中的仅 IPv6 工作负载能够与子网外部的仅 IPv4 服务进行通信。

配置 DNS64 和 NAT64

按照本节中的步骤配置 DNS64 和 NAT64,以便与仅 IPv4 服务进行通信。

通过 AWS CLI 与互联网上的仅 IPv4 服务进行通信

如果您有一个包含仅 IPv6 工作负载的子网,它需要与其外部的仅 IPv4 服务进行通信,本示例将向您展示如何让这些仅 IPv6 服务与互联网上的仅 IPv4 服务进行通信。

您应该首先在公有子网(与包含仅 IPv6 工作负载的子网分开)中配置 NAT 网关。例如,包含 NAT 网关的子网应该具有0.0/0 指向互联网网关的路由。

完成以下步骤以使这些仅 IPv6 的服务能够与互联网上的仅 IPv4 服务建立连接:

  1. 将以下三个路由添加到包含仅 IPv6 工作负载的子网的路由表中:

    • 指向 NAT 网关的 IPv4 路由(如果有)。

    • 64:ff9b::/96指向 NAT 网关的 路由。这将允许通过 NAT 网关路由发往仅 IPv4 服务的仅 IPv6 的工作负载中的流量。

    • 指向仅出口互联网网关(或互联网网关)的 IPv6 ::/0 路由。

    请注意,将 ::/0 指向互联网网关将允许外部 IPv6 主机(VPC 外)通过 IPv6 发起连接。

    aws ec2 create-route --route-table-id rtb-34056078 --destination-cidr-block 0.0.0.0/0 –-nat-gateway-id nat-05dba92075d71c408

    aws ec2 create-route --route-table-id rtb-34056078 –-destination-ipv6-cidr-block 64:ff9b::/96 –-nat-gateway-id nat-05dba92075d71c408

    aws ec2 create-route --route-table-id rtb-34056078 –-destination-ipv6-cidr-block ::/0 --egress-only-internet-gateway-id eigw-c0a643a9
  2. 在包含仅 IPv6 工作负载的子网中启用 DNS64 功能。

    aws ec2 modify-subnet-attribute --subnet-id subnet-1a2b3c4d –-enable-dns64

现在,私有子网中的资源可以通过互联网与 IPv4 和 IPv6 服务建立有状态的连接。正确配置安全组和 NACL,以允许至 64:ff9b::/96 流量的出口和入口流量。

在您的本地环境中启用与仅 IPv4 服务的通信

Amazon Route 53 Resolver 使您能够将 DNS 查询从 VPC 转发到本地网络,反之亦然。您可以通过以下步骤实现上述目的:

  • 您可以在 VPC 中创建一个 Route 53 Resolver 出站端点,并为其分配您希望 Route 53 Resolver 通过其转发查询的 IPv4 地址。对于本地 DNS 解析程序,这些是 DNS 查询源自的 IP 地址,因此,应为 IPv4 地址。

  • 您可以创建一个或多个规则,用于指定您希望 Route 53 Resolver 转发到本地解析程序的 DNS 查询的域名。此外,您还可以指定本地解析程序的 IPv4 地址。

  • 既然您已设置 Route 53 Resolver 出站端点,那么,您需要在包含仅 IPv6 工作负载的子网上启用 DNS64,然后通过 NAT 网关路由发往本地网络的任何数据。

DNS64 如何适用于本地网络中的仅 IPv4 目标:

  1. 将 IPv4 地址分配给 VPC 中的 Route 53 Resolver 出站端点。

  2. 来自 IPv6 服务的 DNS 查询通过 IPv6 转至 Route 53 Resolver。Route 53 Resolver 将根据转发规则匹配查询,并获取本地解析程序的 IPv4 地址。

  3. Route 53 Resolver 会将查询数据包从 IPv6 转换为 IPv4,并将其转发到出站端点。端点的每个 IP 地址代表一个 ENI,用于将请求转发到 DNS 解析程序的本地 IPv4 地址。

  4. 本地解析程序通过 IPv4 将响应数据包从出站端点返回 Route 53 Resolver。

  5. 假设查询是来自支持 DNS64 的子网进,则 Route 53 Resolver 将会执行以下两项操作:

    1. 检查响应数据包的内容。如果记录中有 IPv6 地址,则它会将保持内容原样,但如果它只包含 IPv4 记录。它还会通过向 IPv4 地址追加 64:ff9b::/96 来合成 IPv6 记录。

    2. 重新打包内容,并通过 IPv6 将其发送到 VPC 中的服务。