NAT 实例
NAT AMI 基于 Amazon Linux 的最新版本(2018.03)建立,该版本于 2020 年 12 月 31 日终止了标准支持。有关更多信息,请参阅以下博客文章:Amazon Linux AMI 生命周期终止
如果您使用现有的 NAT AMI,Amazon建议您迁移到 NAT 网关。NAT 网关可提供更高的可用性、更高的带宽,并且所需的管理工作更少。如果 NAT 实例更适合您的使用案例,您可以创建自己的 NAT AMI。有关更多信息,请参阅比较 NAT 网关和 NAT 实例。
您可以创建自己的提供网络地址转换的 AMI,并使用 AMI 将 EC2 实例作为 NAT 实例启动。通过在公有子网内启用 NAT 实例,可让私有子网中的实例发起到 Internet 或其他Amazon服务的出站 IPv4 流量,但阻止这些实例接收由 Internet 上的用户发起的入站流量。
您的 NAT 实例配额取决于您在该区域的实例配额。有关更多信息,请参阅《适用于 Linux 实例的 Amazon EC2 用户指南》中的 Amazon EC2 服务配额。
NAT 实例基础知识
下图展示了 NAT 实例的基本信息。主路由表与私有子网关联,并将来自私有子网中实例的流量发送到公有子网中的 NAT 实例。然后,NAT 实例再将流量发送到 VPC 的互联网网关。流量由 NAT 实例的弹性 IP 地址产生。NAT 实例为响应指定了一个较高的端口号;响应返回后,NAT 实例会根据响应的端口号将其发送给私有子网中的相应实例。
来自私有子网中实例的互联网流量将路由到 NAT 实例,然后由该实例与互联网通信。因此,NAT 实例必须能够访问互联网。它必须位于公有子网(路由表中包含通往互联网网关的路由的子网)中,并且必须具有公有 IP 地址或弹性 IP 地址。

设置 NAT 实例
按照以下步骤可设置 VPC 和 NAT 实例。
要求
在开始之前,请创建一个 AMI,并将其配置为在实例上运行 NAT。配置 NAT 的具体命令取决于您使用的操作系统。例如,对于 Amazon Linux 2,请使用以下命令:
sudo sysctl -w net.ipv4.ip_forward=1 sudo /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo yum install iptables-services sudo service iptables save
设置 NAT 实例
-
创建带有两个子网的 VPC。
-
创建 VPC(请参阅创建 VPC)。
-
创建两个子网(请参阅创建子网)。
-
将互联网网关附加到 VPC(请参阅创建并连接到互联网网关)。
-
创建一个用于将流向 VPC 外的流量发送到互联网网关的自定义路由表,然后将该路由表与一个子网关联,使其成为公有子网(请参阅创建自定义路由表)。
-
-
创建 NATSG 安全组 (参见创建 NATSG 安全组)。您应在启动 NAT 实例时指定此安全组。
-
将实例从已经配置为作为 NAT 实例运行的 AMI 推送到您的公有子网。
-
打开 Amazon EC2 控制台。
-
在控制面板上,选择 Launch Instance 按钮,然后按如下所示完成向导:
-
在选择 Amazon Machine Image (AMI) 页面上,将筛选条件设置为我拥有的,然后选择您的 AMI。
-
在 Choose an Instance Type 页上,选择要启动的实例类型,然后选择 Next: Configure Instance Details。
-
在 Configure Instance Details (配置实例详细信息) 页上,从 Network (网络) 列表中选择您创建的 VPC,然后从 Subnet (子网) 列表中选择您的公有子网。
-
(可选) 选中 Public IP (公有 IP) 复选框以要求您的 NAT 实例接收公有 IP 地址。如果决定现在不分配公有 IP 地址,则可分配弹性 IP 地址,并在启动您的实例后向其分配该地址。选择 Next: Add Storage。
可决定向您的实例添加存储,并可在下一页上添加标签。完成时选择 Next: Configure Security Group。
-
在 Configure Security Group (配置安全组) 页上,选择 Select an existing security group (选择一个现有的安全组) 选项,然后选择您创建的 NATSG 安全组。选择 Review and Launch。
-
检视您已经选择的设置。执行所需的任何更改,然后选择 Launch 以选择一个密钥对并启动您的实例。
-
-
-
禁用 NAT 实例的
SrcDestCheck
属性 (参见禁用源/目标检查) -
如果没有在启动期间向您的 NAT 实例分配公有 IP 地址(第 3 步),则需要将弹性 IP 地址与该实例关联。
通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/
。 在导航窗格中,选择 Elastic IPs,然后选择 Allocate new address。
-
选择 Allocate。
-
从列表中选择弹性 IP 地址,然后选择 Actions、Associate address。
选择网络接口资源,然后选择 NAT 实例的网络接口。从 Private IP 列表中选择要与弹性 IP 地址关联的地址,然后选择 Associate。
-
更新主路由表以将流量发送至 NAT 实例。有关更多信息,请参阅 更新主路由表。
使用命令行启动 NAT 实例
要在子网中启用 NAT 实例,请使用以下命令之一。有关更多信息,请参阅 使用 Amazon VPC。您可以使用配置作为 NAT 实例运行的 AMI 的 AMI ID。有关如何在 Amazon Linux 2 上创建 AMI 的信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的创建 由 Amazon EBS 支持的 AMI。
run-instances (Amazon CLI)
New-EC2Instance(Amazon Tools for Windows PowerShell)
创建 NATSG 安全组
根据下表的描述定义 NATSG 安全组,以允许您的 NAT 实例从私有子网实例接收 Internet 绑定流量以及来自您的网络的 SSH 流量。NAT 实例也可以向 Internet 发送流量,即允许私有子网中的实例获取软件更新。
以下是推荐规则。
入站 | |||
---|---|---|---|
源 | 协议 | 端口范围 | 注释 |
私有子网 CIDR |
TCP | 80 | Allow inbound HTTP traffic from servers in the private subnet |
私有子网 CIDR |
TCP | 443 | Allow inbound HTTPS traffic from servers in the private subnet |
您的网络的公有 IP 地址范围。 |
TCP | 22 | Allow inbound SSH access to the NAT instance from your network (over the internet gateway) |
出站 | |||
目的地 | 协议 | 端口范围 | 注释 |
0.0.0.0/0 | TCP | 80 | Allow outbound HTTP access to the internet |
0.0.0.0/0 | TCP | 443 | Allow outbound HTTPS access to the internet |
创建 NATSG 安全组
-
通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/
。 -
在导航窗格中,选择 Security Groups,然后选择 Create Security Group。
-
在“Create Security Group”对话框中,指定
NATSG
作为安全组的名称,并提供描述。从 VPC 列表中选择您的 VPC 的 ID,然后选择 Yes, Create。 -
选择您刚刚创建的 NATSG 安全组。详细信息窗格内会显示此安全组的详细信息,以及可供您使用入站规则和出站规则的选项卡。
-
使用 Inbound Rules (入站规则) 选项卡添加入站流量规则,如下所示:
-
选择 Edit。
-
选择 Add another rule,然后从 Type 列表中选择 HTTP。在 Source (源) 字段中,指定私有子网的 IP 地址范围。
-
选择 Add another rule,然后从 Type 列表中选择 HTTPS。在 Source (源) 字段中,指定私有子网的 IP 地址范围。
-
选择 Add another rule,然后从 Type 列表中选择 SSH。在 Source (源) 字段中,指定网络的公有 IP 地址范围。
-
选择 Save。
-
-
使用 Outbound Rules (出站规则) 选项卡添加出站流量规则,如下所示:
-
选择 Edit。
-
选择 Add another rule,然后从 Type 列表中选择 HTTP。在 Destination (目标) 字段中,指定
0.0.0.0/0
-
选择 Add another rule,然后从 Type 列表中选择 HTTPS。在 Destination (目标) 字段中,指定
0.0.0.0/0
-
选择 Save。
-
有关更多信息,请参阅 使用安全组控制到资源的流量。
禁用源/目标检查
每项 EC2 实例都会默认执行源/目标检查。这意味着实例必须为其发送或接收的数据流的源头或目标。但是,NAT 实例必须能够在源或目标并非其本身时发送和接收数据流。因此,您必须禁用 NAT 实例的源/目标检查。
您可以使用控制台或命令行,禁用正在运行或已停止运行的 NAT 实例 SrcDestCheck
属性。
使用控制台禁用源/目标检查
-
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 -
在导航窗格中,选择实例。
-
依次选择 NAT 实例、操作、联网和更改源/目标检查。
-
验证源/目标检查是否已停止。否则,请选择停止。
-
选择 Save。
-
如果 NAT 实例有辅助网络接口,请从联网选项卡上的网络接口选择接口。选择接口 ID 以转至网络接口页面。选择操作、更改源/目标检查,清除启用,然后选择保存。
使用命令行,禁用源/目标检查
您可以使用以下任一命令。有关更多信息,请参阅 使用 Amazon VPC。
modify-instance-attribute (Amazon CLI)
Edit-EC2InstanceAttribute (Amazon Tools for Windows PowerShell)
更新主路由表
您 VPC 中的私有子网未与自定义路由表关联,因此它使用主路由表。默认情况下,主路由表使您的 VPC 中的实例能够互相通信。您必须添加一条路由,将所有其他子网流量发送到 NAT 实例。
更新主路由表
-
通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/
。 -
在导航窗格中,选择 Route Tables。
-
为 VPC 选择主路由表 (Main (主要) 列显示 Yes (是))。详细信息窗格中会显示选项卡,以供您使用其路径、关联和路线传播。
-
在 Routes (路由) 选项卡中,执行以下操作:
选择 Edit routes (编辑路由) 选项卡,然后选择 Add route (添加路由)。
为 Destination (目的地) 指定
0.0.0.0/0
,并为 Target (目标) 指定 NAT 实例的实例 ID。选择 Save changes(保存更改)。
-
在 Subnet associations (子网关联) 选项卡上,选择 Edit subnet associations (编辑子网关联)。选中私有子网的复选框,然后选择 Save associations (保存关联)。
有关更多信息,请参阅配置路由表。
测试您的 NAT 实例配置
启动 NAT 实例并完成以上配置步骤之后,您可以执行测试,以检查您的私有子网中的实例是否可以通过将 NAT 实例用作堡垒服务器来访问 Internet。为此,请更新 NATSG 安全组规则,以允许入站和出站 ICMP 流量以及出站 SSH 流量,将一个实例启动至您的私有子网中,配置 SSH 代理转发以访问您的私有子网中的实例,连接到您的实例,然后测试 Internet 连接。
更新您 NAT 实例的安全组
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 在导航窗格中,选择 Security Groups (安全组)。
选中与 NAT 实例关联的 NATSG 安全组的复选框。
在入站规则选项卡上,选择编辑入站规则。
选择 Add rule。对于类型,选择所有 ICMP - IPv4。对于源,选择自定义,输入您私有子网的 IP 地址范围(例如
10.0.1.0/24
)。选择 Save rules (保存规则)。-
在出站规则选项卡上,选择编辑出站规则。
-
选择 Add rule。对于类型,选择 SSH。对于目标,选择自定义,输入您私有子网的 IP 地址范围(例如
10.0.1.0/24
)。 -
选择 Add rule。对于类型,选择所有 ICMP - IPv4。为 Destination (目的地) 选择 Anywhere - IPv4 (任何位置 – IPv4)。选择 Save rules (保存规则)。
在您的私有子网中启动实例
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 在导航窗格中,选择实例。
在您的私有子网中启动实例。确保您在启动向导中配置了以下选项,然后选择 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 代理转发
在您的本地计算机上,将私有秘钥添加到身份验证代理。
对于 Linux,请使用以下命令:
ssh-add -c
mykeypair
.pem对于 OS X,请使用以下命令:
ssh-add -K
mykeypair
.pem使用
-A
选项连接到您的 NAT 实例以启用 SSH 代理转发,例如:ssh -A ec2-user@
54.0.0.123
针对 Windows (PuTTY) 配置 SSH 代理转发
如果尚未安装 Pageant,请从 PuTTY 下载页面
下载并安装 Pageant。 -
将您的私有密钥转换为 .ppk 格式。有关更多信息,请参阅使用 PuTTYgen 转换您的私有密钥。
-
启动 Pageant,右键单击任务栏上的 Pageant 图标 (可能已隐藏),并选择 Add Key。选择您创建的 .ppk 文件,输入密码 (如果需要),然后选择 Open。
-
启动 PuTTY 会话以连接到您的 NAT 实例。在 Auth (身份验证) 类别中,确保选择了 Allow agent forwarding (允许代理转发) 选项,将 Private key file for authentication (用于身份验证的私有密钥文件) 字段留空。
测试 Internet 连接
通过对启用了 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
命令。从您的 NAT 实例,使用私有 IP 地址连接到您私有子网中的实例,例如:
ssh ec2-user@
10.0.1.123
从您的私有实例,通过运行
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
命令失败,请检查以下信息:(可选)如果不再需要,请终止您的私有实例。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南 中的终止实例。