NAT 实例 - Amazon Virtual Private Cloud

NAT 实例

重要

NAT AMI 基于 Amazon Linux 的最新版本 (2018.03) 建立,该版本于 2020 年 12 月 31 日终止了标准支持。有关更多信息,请参阅以下博客文章:Amazon Linux AMI 生命周期终止。此功能只会收到重要的安全更新(不会有定期更新)。

如果您使用现有的 NAT AMI,AWS 建议您尽快迁移到 NAT 网关或在 Amazon Linux 2 上创建自己的 NAT AMI。有关如何迁移实例的信息,请参阅 从 NAT 实例迁移

您可以创建自己的网络地址转换 AMI,并在您的 VPC 中公有子网内在作为 NAT 实例的 EC2 实例中运行,从而让私有子网中的实例发起到 Internet 或其他 AWS 服务的出站 IPv4 流量,但阻止这些实例接收由 Internet 上的用户发起的入站流量。

有关公有子网和私有子网的更多信息,请参阅子网路由。有关 NAT 的更多信息,请参阅适用于您的 VPC 的 NAT 设备

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

您的 NAT 实例配额取决于您在该区域的实例配额。有关更多信息,请参阅 EC2 常见问题

注意

您也可以使用 NAT 网关,该网关是托管的 NAT 服务,可提供更高的可用性、更大的带宽,但所需的管理工作更少。对于常见使用案例,我们建议您使用 NAT 网关而不是 NAT 实例。有关更多信息,请参阅 NAT 网关比较 NAT 网关和 NAT 实例

NAT 实例基础知识

下图展示了 NAT 实例的基本信息。主路由表与私有子网关联,并将来自私有子网中实例的流量发送到公有子网中的 NAT 实例。然后,NAT 实例再将流量发送到 VPC 的互联网网关。流量由 NAT 实例的弹性 IP 地址产生。NAT 实例为响应指定了一个较高的端口号;响应返回后,NAT 实例会根据响应的端口号将其发送给私有子网中的相应实例。

来自私有子网中实例的互联网流量将路由到 NAT 实例,然后由该实例与互联网通信。因此,NAT 实例必须能够访问互联网。它必须位于公有子网(路由表中包含通往互联网网关的路由的子网)中,并且必须具有公有 IP 地址或弹性 IP 地址。


        NAT 实例设置

NAT 实例 AMI

尽管 Amazon 提供了经过配置作为 NAT 实例运行的 Amazon Linux AMI,但它们是基于 Amazon Linux 的最新版本 (2018.03) 构建的,该版本已在 2020 年 12 月 31 日后终止接收标准支持,仅会收到重要的安全更新(不会有定期更新)。如果您使用现有的 NAT AMI(这些 AMI 的名称中包含字符串 amzn-ami-vpc-nat),AWS 建议您尽快迁移到 NAT 网关或在 Amazon Linux 2 上创建自己的 NAT AMI。

创建您的 NAT AMI

您可以从现有的 Amazon AMI 开始,然后进行适当的自定义以创建自己的 AMI,作为 NAT 实例运行。您可以在下次您需要启动 NAT 实例时使用此 AMI。我们建议您使用最新的 Amazon Linux 2 AMI 来构建自己的 NAT AMI。有关如何创建 AMI 的信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的创建由 Amazon EBS 支持的 AMI

更新现有的 NAT 实例

如果您已使用 NAT AMI,我们建议您迁移到 NAT 网关或在 Amazon Linux 2 上创建自己的 NAT AMI。

设置 NAT 实例

在开始之前,请创建一个 AMI,并将其配置作为 NAT 实例运行。有关更多信息,请参阅 创建您的 NAT AMI。若您选择的筛选条件为我拥有的,则此 AMI 将在Amazon Elastic Compute Cloud Console 导航窗格中的映像下显示。

要使用控制台设置 VPC 和 NAT 实例,请执行以下步骤:

  1. 创建带有两个子网的 VPC。

    1. 创建 VPC (参见 创建 VPC)

    2. 创建两个子网 (参见 创建子网)

    3. 将互联网网关附加到 VPC(请参阅创建并附加互联网网关

    4. 创建一个用于将流向 VPC 外的流量发送到互联网网关的自定义路由表,然后将该路由表与一个子网关联,使其成为公有子网(请参阅创建自定义路由表

  2. 创建 NATSG 安全组 (参见创建 NATSG 安全组)。您应在启动 NAT 实例时指定此安全组。

  3. 将实例从已经配置为作为 NAT 实例运行的 AMI 推送到您的公有子网。

    1. 打开 Amazon EC2 控制台。

    2. 在控制面板上,选择 Launch Instance 按钮,然后按如下所示完成向导:

      1. 选择 Amazon 系统映像 (AMI) 页面上,将筛选条件设置为我拥有的,然后选择您的 AMI。

      2. Choose an Instance Type 页上,选择要启动的实例类型,然后选择 Next: Configure Instance Details

      3. Configure Instance Details (配置实例详细信息) 页上,从 Network (网络) 列表中选择您创建的 VPC,然后从 Subnet (子网) 列表中选择您的公有子网。

      4. (可选) 选中 Public IP (公有 IP) 复选框以要求您的 NAT 实例接收公有 IP 地址。如果决定现在不分配公有 IP 地址,则可分配弹性 IP 地址,并在启动您的实例后向其分配该地址。有关在启动时分配公有 IP 的更多信息,请参阅在实例启动期间分配公有 IPv4 地址。选择 Next: Add Storage

      5. 可决定向您的实例添加存储,并可在下一页上添加标签。完成时选择 Next: Configure Security Group

      6. Configure Security Group (配置安全组) 页上,选择 Select an existing security group (选择一个现有的安全组) 选项,然后选择您创建的 NATSG 安全组。选择 Review and Launch

      7. 检视您已经选择的设置。执行所需的任何更改,然后选择 Launch 以选择一个密钥对并启动您的实例。

  4. 禁用 NAT 实例的SrcDestCheck属性 (参见禁用源/目标检查)

  5. 如果没有在启动期间向您的 NAT 实例分配公有 IP 地址(第 3 步),则需要将弹性 IP 地址与该实例关联。

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

    2. 在导航窗格中,选择 Elastic IPs,然后选择 Allocate new address

    3. 选择 Allocate

    4. 从列表中选择弹性 IP 地址,然后选择 ActionsAssociate address

    5. 选择网络接口资源,然后选择 NAT 实例的网络接口。从 Private IP 列表中选择要与弹性 IP 地址关联的地址,然后选择 Associate

  6. 更新主路由表以将流量发送至 NAT 实例。有关更多信息,请参阅 更新主路由表

使用命令行启动 NAT 实例

要在子网中启用 NAT 实例,请使用以下命令之一。有关更多信息,请参阅 访问 Amazon VPC。您可以使用配置作为 NAT 实例运行的 AMI 的 AMI ID。有关如何在 Amazon Linux 2 上创建 AMI 的信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的创建 由 Amazon EBS 支持的 AMI

创建 NATSG 安全组

根据下表的描述定义 NATSG 安全组,以允许您的 NAT 实例从私有子网实例接收 Internet 绑定流量以及来自您的网络的 SSH 流量。NAT 实例也可以向 Internet 发送流量,即允许私有子网中的实例获取软件更新。

Inbound
Source Protocol Port range Comments

10.0.1.0/24

TCP

80

允许来自私有子网服务器的入站 HTTP 数据流

10.0.1.0/24

TCP

443

允许来自私有子网服务器的入站 HTTPS 数据流

您家庭网络的公共 IP 地址范围

TCP

22

允许从您的家庭网络对 NAT 实例进行入站 SSH 访问(通过互联网网关)

Outbound

Destination Protocol Port range Comments

0.0.0.0/0

TCP

80

允许对 Internet 进行出站 HTTP 访问

0.0.0.0/0

TCP

443

允许对 Internet 进行出站 HTTPS 访问

创建 NATSG 安全组

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

  2. 在导航窗格中,选择 Security Groups,然后选择 Create Security Group

  3. 在“Create Security Group”对话框中,指定NATSG作为安全组的名称,并提供描述。从 VPC 列表中选择您的 VPC 的 ID,然后选择 Yes, Create

  4. 选择您刚刚创建的 NATSG 安全组。详细信息窗格内会显示此安全组的详细信息,以及可供您使用入站规则和出站规则的选项卡。

  5. 使用 Inbound Rules (入站规则) 选项卡添加入站流量规则,如下所示:

    1. 选择 Edit

    2. 选择 Add another rule,然后从 Type 列表中选择 HTTP。在 Source (源) 字段中,指定私有子网的 IP 地址范围。

    3. 选择 Add another rule,然后从 Type 列表中选择 HTTPS。在 Source (源) 字段中,指定私有子网的 IP 地址范围。

    4. 选择 Add another rule,然后从 Type 列表中选择 SSH。在 Source (源) 字段中,指定网络的公有 IP 地址范围。

    5. 选择 Save (保存)

  6. 使用 Outbound Rules (出站规则) 选项卡添加出站流量规则,如下所示:

    1. 选择 Edit

    2. 选择 Add another rule,然后从 Type 列表中选择 HTTP。在 Destination (目标) 字段中,指定 0.0.0.0/0

    3. 选择 Add another rule,然后从 Type 列表中选择 HTTPS。在 Destination (目标) 字段中,指定 0.0.0.0/0

    4. 选择 Save (保存)

有关更多信息,请参阅 您的 VPC 的安全组

禁用源/目标检查

每项 EC2 实例都会默认执行源/目标检查。这意味着实例必须为其发送或接收的数据流的源头或目标。但是,NAT 实例必须能够在源或目标并非其本身时发送和接收数据流。因此,您必须禁用 NAT 实例的源/目标检查。

您可以使用控制台或命令行,禁用正在运行或已停止运行的 NAT 实例 SrcDestCheck 属性。

使用控制台禁用源/目标检查

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

  2. 在导航窗格中,选择 Instances

  3. 选择 NAT 实例,然后依次选择 Actions (操作)Networking (联网)Change source/destination check (更改源/目标检查)

  4. 验证源/目标检查是否已停止。否则,请选择 Stop (停止)

  5. 选择 Save

  6. 如果 NAT 实例有辅助网络接口,请从 Networking (联网) 选项卡上的 Network interfaces (网络接口) 选择接口。选择接口 ID 以转至网络接口页面。选择 Actions (操作)Change source/dest. check (更改源/目标检查),取消选中 Enable (启用),然后选择 Save (保存)

使用命令行,禁用源/目标检查

您可以使用以下任一命令。有关更多信息,请参阅 访问 Amazon VPC

更新主路由表

您 VPC 中的私有子网未与自定义路由表关联,因此它使用主路由表。默认情况下,主路由表使您的 VPC 中的实例能够互相通信。您必须添加一条路由,将所有其他子网流量发送到 NAT 实例。

更新主路由表

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

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

  3. 为 VPC 选择主路由表 (Main 列显示 Yes)。详细信息窗格中会显示选项卡,以供您使用其路径、关联和路线传播。

  4. Routes 选项卡上选择 Edit,在 Destination 框中指定 0.0.0.0/0,从 Target 列表中选择 NAT 实例的实例 ID,然后选择 Save

  5. Subnet Associations (子网关联) 选项卡上,选择 Edit (编辑),然后选中私有子网的 Associate (关联) 复选框。选择 Save (保存)

有关更多信息,请参阅 您的 VPC 的路由表

测试您的 NAT 实例配置

启动 NAT 实例并完成以上配置步骤之后,您可以执行测试,以检查您的私有子网中的实例是否可以通过将 NAT 实例用作堡垒服务器来访问 Internet。为此,请更新您的 NAT 实例的安全组规则,以允许入站和出站 ICMP 流量以及出站 SSH 流量,将一个实例启动至您的私有子网中,配置 SSH 代理转发以访问您的私有子网中的实例,连接到您的实例,然后测试 Internet 连接。

更新您 NAT 实例的安全组

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

  2. 在导航窗格中,选择 Security Groups

  3. 选中与 NAT 实例关联的安全组的复选框。

  4. Inbound rules (入站规则) 选项卡上,选择 Edit inbound rules (编辑入站规则)

  5. 选择 Add rule。对于 Type (类型),选择 All ICMP - IPv4 (所有 ICMP – IPv4)。对于 Source (源),选择 Custom (自定义),输入您私有子网的 IP 地址范围(例如 10.0.1.0/24)。选择 Save rules (保存规则)

  6. Outbound rules (出站规则) 选项卡上,选择 Edit outbound rules (编辑出站规则)

  7. 选择 Add rule。对于 Type (类型),选择 SSH。对于 Destination (目标),选择 Custom (自定义),输入您私有子网的 IP 地址范围(例如 10.0.1.0/24)。

  8. 选择 Add rule。对于 Type (类型),选择 All ICMP - IPv4 (所有 ICMP – IPv4)。对于 Destination (目标),请选择 Custom (自定义) 并输入 0.0.0.0/0。选择 Save rules (保存规则)

在您的私有子网中启动实例

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

  2. 在导航窗格中,选择 Instances

  3. 在您的私有子网中启动实例。有关更多信息,请参阅 在您的子网中启动一个实例。确保您在启动向导中配置了以下选项,然后选择 Launch

    • Choose an Amazon Machine Image (AMI) (选择Amazon 系统映像(AMI)) 页面上,从 Quick Start (快速入门) 类别中选择 Amazon Linux AMI。

    • Configure Instance Details (配置实例详细信息) 页面上,从 Subnet (子网) 列表中选择您的私有子网,并且不向您的实例分配公有 IP 地址。

    • Configure Security Group 页上,确保您的安全组包括入站规则,该规则允许从您的 NAT 实例的私有 IP 地址进行 SSH 访问,或者从公有子网的 IP 地址范围进行 SSH 访问;并且确保您具有允许出站 ICMP 流量的出站规则。

    • Select an existing key pair or create a new key pair (选择现有密钥对或创建新密钥对) 对话框中,选择在启动 NAT 实例时所用的密钥对。

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

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

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

    ssh-add -c mykeypair.pem

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

    ssh-add -K mykeypair.pem
  2. 使用 -A 选项连接到您的 NAT 实例以启用 SSH 代理转发,例如:

    ssh -A ec2-user@54.0.0.123

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

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

  2. 将您的私有密钥转换为 .ppk 格式。有关更多信息,请参阅使用 PuTTYgen 转换您的私有密钥

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

  4. 启动 PuTTY 会话以连接到您的 NAT 实例。在 Auth (身份验证) 类别中,确保选择了 Allow agent forwarding (允许代理转发) 选项,将 Private key file for authentication (用于身份验证的私有密钥文件) 字段留空。

测试 Internet 连接

  1. 通过对启用了 ICMP 的网站运行 ping 命令来测试您的 NAT 实例是否可以与 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=48 time=74.9 ms 64 bytes from mail.ietf.org (4.31.198.44): icmp_seq=2 ttl=48 time=75.1 ms ...

    按键盘上的 Ctrl+C 以取消 ping 命令。

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

    ssh ec2-user@10.0.1.123
  3. 从您的私有实例,通过运行 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 命令失败,请检查以下信息:

    • 检查您 NAT 实例的安全组规则是否允许来自您私有子网的入站 ICMP 流量。如果不允许,则您的 NAT 实例无法从您的私有实例接收 ping 命令。

    • 检查您是否正确配置了路由表。有关更多信息,请参阅 更新主路由表

    • 确保您对 NAT 实例禁用了源/目标检查。有关更多信息,请参阅 禁用源/目标检查

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

  4. (可选)如果不再需要,请终止您的私有实例。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南 中的终止实例