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

NAT 实例

通过使用您 VPC 中公有子网内的网络地址转换 (NAT) 实例,可让私有子网中的实例发起到 Internet 或其他 AWS 服务的出站 IPv4 流量,但阻止这些实例接收由 Internet 上的用户发起的入站流量。

有关公有子网和私有子网的更多信息,请参阅子网路由。有关 NAT 的更多信息,请参阅NAT

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

注意

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

NAT 实例基本信息

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

NAT 实例设置

Amazon 提供 Amazon Linux AMI,并会将其配置作为 NAT 实例运行。这些 AMI 的名称包含字符串 amzn-ami-vpc-nat,因此可在 Amazon EC2 控制台中搜索它们。当您从 NAT AMI 启动某个实例时,将对该实例进行以下配置:

  • /etc/sysctl.d/10-nat-settings.conf 中启用 IPv4 转发并禁用 ICMP 重定向

  • 位于 /usr/sbin/configure-pat.sh 的脚本在启动时运行,并配置 iptables IP 伪装

您的 NAT 实例限制取决所在区域的实例类型限制。有关更多信息,请参阅 EC2 常见问题。有关可用 NAT AMI 的列表,请参阅 Amazon Linux AMI 矩阵

设置 NAT 实例

您可以使用 VPC 向导以设置有 NAT 实例的 VPC;有关更多信息,请参见场景 2:带有公有子网和私有子网 (NAT) 的 VPC。向导可为您执行许多配置步骤,包括启动 NAT 实例和设置路由。不过,如果您愿意,您可以使用以下步骤手动创建和配置 VPC 和 NAT 实例。

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

    注意

    以下步骤用于手动创建和配置 VPC;而不是使用 VPC 向导创建 VPC。

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

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

    3. 将 Internet 网关附加到 VPC (请参阅连接 Internet 网关)

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

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

  3. 将实例从已经配置为作为 NAT 实例运行的 AMI 推送到您的公有子网。Amazon 提供 Amazon Linux AMI,并会将其配置作为 NAT 实例运行。这些 AMI 的名称包含字符串 amzn-ami-vpc-nat,因此可在 Amazon EC2 控制台中搜索它们。

    1. 打开 Amazon EC2 控制台。

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

      1. Choose an Amazon Machine Image (AMI) (选择一个Amazon 系统映像 (AMI)) 页上,选择 Community AMIs (社区 AMI) 类别,然后搜索 amzn-ami-vpc-nat。在结果列表中,每个 AMI 的名称都包含版本,您可以选择最新 AMI,例如 2013.09。选择 Select

      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 实例,根据需要进行修改,然后创建您自己的 AMI 并将其配置为作为 NAT 实例运行。您可以在下次您需要启动 NAT 实例时使用此 AMI。有关创建您自己的 AMI 的详细信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的创建由 Amazon EBS 支持的 AMI

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

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

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

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

    3. 选择 Allocate

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

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

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

使用命令行启动 NAT 实例

要在子网中启用 NAT 实例,请使用以下命令之一。有关这些命令行界面的更多信息,请参阅 访问 Amazon VPC

要获取配置为 NAT 实例运行的 AMI 的 ID,请使用命令描述映像,并使用筛选条件仅返回 Amazon 拥有以及名称包含 amzn-ami-vpc-nat 字符串的 AMI。以下示例使用 AWS CLI:

Copy
aws ec2 describe-images --filter Name="owner-alias",Values="amazon" --filter Name="name",Values="amzn-ami-vpc-nat*"

正在创建 NATSG 安全组

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

NATSG:推荐规则

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 访问 (通过 Internet 网关)

Outbound

Destination Protocol Port Range Comments

0.0.0.0/0

TCP

80

允许通过 IPv4 对 Internet 进行出站 HTTP 访问

0.0.0.0/0

TCP

443

允许对 Internet 的出站 HTTPS 访问

创建 NATSG 安全组

  1. 打开 Amazon VPC 控制台 https://console.amazonaws.cn/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.amazonaws.cn/ec2/

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

  3. 依次选择 NAT 实例、ActionsNetworkingChange Source/Dest. Check

  4. 对于 NAT 实例,请确认已禁用此属性。否则,请选择 Yes, Disable

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

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

更新主路由表

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

更新主路由表

  1. 打开 Amazon VPC 控制台 https://console.amazonaws.cn/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

有关路由表的更多信息,请参见路由表

测试您的 NAT 实例配置

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

更新您 NAT 实例的安全组

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

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

  3. 找到与您的 NAT 实例关联的安全组,然后在 Inbound 选项卡中选择 Edit

  4. 选择 Add Rule,从 Type 列表中选择 All ICMP,然后从 Source 列表中选择 Custom IP。输入您私有子网的 IP 地址范围,例如 10.0.1.0/24。选择 Save

  5. Outbound 选项卡中,选择 Edit

  6. 选择 Add Rule,从 Type 列表中选择 SSH,然后从 Source 列表中选择 Custom IP。输入您私有子网的 IP 地址范围,例如 10.0.1.0/24。选择 Save

  7. 选择 Add Rule,从 Type 列表中选择 All ICMP,然后从 Source 列表中选择 Custom IP。输入 0.0.0.0/0,然后选择 Save

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

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/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,请使用以下命令:

    Copy
    ssh-add -c mykeypair.pem

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

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

    Copy
    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 通信;例如:

    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=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 地址连接到您私有子网中的实例,例如:

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

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

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

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

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

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