允许私有资源在 VPC 外部进行通信 - Amazon Virtual Private Cloud

允许私有资源在 VPC 外部进行通信

本节旨在介绍如何创建并使用 NAT 实例,让私有子网中的资源能够在虚拟私有云之外进行通信。

1. 为 NAT 实例创建 VPC

使用以下过程创建具有公有和私有子网的 VPC。

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

  2. 选择创建 VPC

  3. 对于 Resources to create(要创建的资源),选择 VPC and more(VPC 等)。

  4. 对于 Name tag auto-generation(名称标签自动生成),为 VPC 输入名称。

  5. 若要配置子网,请执行以下操作:

    1. 对于 Number of Availability Zones(可用区域数量),根据您的需求选择 12

    2. 对于 Number of public subnets(公有子网数量),确保每个可用区有一个公有子网。

    3. 对于 Number of private subnets(私有子网数量),确保每个可用区有一个私有子网。

  6. 选择创建 VPC

2. 为 NAT 实例创建安全组

使用下表中描述的规则创建安全组。这些规则允许您的 NAT 实例从私有子网中的实例接收互联网范围流量以及来自您的网络的 SSH 流量。NAT 实例也可以向 Internet 发送流量,即允许私有子网中的实例获取软件更新。

以下是推荐的入站规则。

来源 协议 端口范围 注释
私有子网 CIDR TCP 80 允许来自私有子网服务器的入站 HTTP 数据流
私有子网 CIDR TCP 443 允许来自私有子网服务器的入站 HTTPS 数据流
您的网络的公有 IP 地址范围 TCP 22 允许从您的网络到 NAT 实例的入站 SSH 访问(通过互联网网关)

以下是推荐的出站规则。

目标位置 协议 端口范围 注释
0.0.0.0/0 TCP 80 允许对 Internet 进行出站 HTTP 访问
0.0.0.0/0 TCP 443 允许对 Internet 进行出站 HTTPS 访问
创建安全组
  1. 通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/

  2. 在导航窗格中,选择 Security Groups(安全组)。

  3. 选择Create security group(创建安全组)。

  4. 输入安全组的名称和描述。

  5. 对于 VPC,选择用于 NAT 实例的 VPC 的 ID。

  6. 入站规则下添加入站流量规则,如下所示:

    1. 选择 添加规则。在类型中选择 HTTP,并在中输入私有子网的 IP 地址范围。

    2. 选择 添加规则。在类型中选择 HTTPS,并在中输入私有子网的 IP 地址范围。

    3. 选择 添加规则。在类型中选择 SSH,并在中输入网络的 IP 地址范围。

  7. 出站规则下添加出站流量规则,如下所示:

    1. 选择 添加规则。在类型中选择 HTTP,并在目的地中输入 0.0.0.0/0。

    2. 选择 添加规则。在类型中选择 HTTPS,并在目的地中输入 0.0.0.0/0。

  8. 选择创建安全组

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

3. 创建 NAT AMI

NAT AMI 被配置为在 EC2 实例上运行 NAT。您必须先创建 NAT AMI,然后使用您的 NAT AMI 启动 NAT 实例。

如果您计划为 NAT AMI 使用 Amazon Linux 以外的操作系统,请参阅该操作系统的文档了解如何配置 NAT。请务必保存这些设置,以便其在实例重启后依然保持不变。

为 Amazon Linux 创建 NAT AMI
  1. 启动运行 AL2023 或 Amazon Linux 2 的 EC2 实例。请务必指定为 NAT 实例创建的安全组。

  2. 连接到实例并在实例上运行以下命令以启用 iptables。

    sudo yum install iptables-services -y sudo systemctl enable iptables sudo systemctl start iptables
  3. 在实例上执行以下操作以启用 IP 转发,使其在重启后仍然存在:

    1. 使用文本编辑器(例如 nanovim)创建以下配置文件:/etc/sysctl.d/custom-ip-forwarding.conf

    2. 将以下行添加到配置文件。

      net.ipv4.ip_forward=1
    3. 保存配置文件,退出文本编辑器。

    4. 运行以下命令以应用配置文件。

      sudo sysctl -p /etc/sysctl.d/custom-ip-forwarding.conf
  4. 在实例上运行以下命令,并记下主网络接口的名称。您在下一步中需要此信息。

    netstat -i

    在以下示例输出中,docker0 是 docker 创建的网络接口,eth0 是主网络接口,lo 是环回接口。

    Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg docker0 1500 0 0 0 0 0 0 0 0 BMU eth0 9001 7276052 0 0 0 5364991 0 0 0 BMRU lo 65536 538857 0 0 0 538857 0 0 0 LRU

    在以下示例输出中,主网络接口为 enX0

    Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg enX0 9001 1076 0 0 0 1247 0 0 0 BMRU lo 65536 24 0 0 0 24 0 0 0 LRU

    在以下示例输出中,主网络接口为 ens5

    Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg ens5 9001 14036 0 0 0 2116 0 0 0 BMRU lo 65536 12 0 0 0 12 0 0 0 LRU
  5. 在实例上运行以下命令以配置 NAT。如果主网络接口不是 eth0,请将 eth0 替换为您在上一步中记下的主网络接口。

    sudo /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo /sbin/iptables -F FORWARD sudo service iptables save
  6. 然后,从 EC2 实例创建 NAT AMI。有关更多信息,请参阅《Amazon EC2 用户指南》中的从实例创建 Linux AMI

4. 启动 NAT 实例

按照以下步骤使用您创建的 VPC、安全组和 NAT AMI 启动 NAT 实例。

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

  2. 在控制面板上,选择启动实例

  3. 对于名称,输入您的 NAT 实例名称。

  4. 对于应用程序和操作系统映像,选择您的 NAT AMI(选择浏览更多 AMI我的 AMI)。

  5. 对于实例类型,选择选择一个实例类型,以提供 NAT 实例所需的计算、内存和存储资源。

  6. (可选)对于密钥对,选择一个现有密钥对或选择创建新密钥对

  7. 对于 Network settings(网络设置),执行以下操作:

    1. 选择编辑

    2. 对于 VPC,选择已创建的 VPC。

    3. 对于子网,选择您创建的公有子网。

    4. 对于 Auto-assign public IP(自动分配公有 IP),选择 Enable(启用)。或者在启动 NAT 实例后,分配一个弹性 IP 地址并将其分配给 NAT 实例。

    5. 对于防火墙,选择选择现有安全组,然后选择您创建的安全组。

  8. 选择启动实例。选择实例 ID 以打开实例详细信息页面。等待实例状态变为正在运行,并等待状态检查成功。

  9. 禁用 NAT 实例的源/目的地检查(参阅 5. 禁用源/目标检查)。

  10. 更新路由表以将流量发送至 NAT 实例(参阅 6. 更新路由表)。

5. 禁用源/目标检查

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

禁用源/目的地检查
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择实例

  3. 选择 NAT 实例。

  4. 依次选择操作联网更改源/目的地检查

  5. 对于源/目的地检查,请选择停止

  6. 选择保存

  7. 如果 NAT 实例有辅助网络接口,请从联网选项卡上的网络接口选择接口。选择接口 ID 以转至网络接口页面。选择操作更改源/目标检查,清除启用,然后选择保存

6. 更新路由表

私有子网的路由表必须有一个将互联网流量发送到 NAT 实例的路由。

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

  2. 在导航窗格中,选择 Route tables(路由表)。

  3. 选择私有子网的路由表。

  4. 路由选项卡中选择编辑路由,然后选择添加路由

  5. 目的地中输入 0.0.0.0/0,并在目标中输入 NAT 实例的实例 ID。

  6. 选择 Save changes(保存更改)

有关更多信息,请参阅 配置路由表

7. 测试您的 NAT 实例

启动 NAT 实例并完成以上配置步骤之后,您可以测试私有子网中的实例是否可以通过将 NAT 实例用作堡垒机服务器来访问互联网。

步骤 1:更新 NAT 实例安全组

如需允许私有子网中的实例向 NAT 实例发送 ping 流量,请添加一个规则来允许入站和出站 ICMP 流量。要允许 NAT 实例用作堡垒机服务器,请添加一个规则以允许出站 SSH 流量流向私有子网。

更新 NAT 实例安全组
  1. 通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/

  2. 在导航窗格中,选择 Security Groups(安全组)。

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

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

  5. 选择 Add rule。对于类型,选择所有 ICMP - IPv4。对于,选择自定义,输入您的私有子网的 IP 地址范围。选择保存规则

  6. 出站规则选项卡上,选择编辑出站规则

  7. 选择 Add rule。对于类型,选择 SSH。对于目的地,选择自定义,并输入您的私有子网的 IP 地址范围。

  8. 选择 Add rule。对于类型,选择所有 ICMP - IPv4。为 Destination (目的地) 选择 Anywhere - IPv4 (任何位置 – IPv4)。选择保存规则

步骤 2:在私有子网中启动测试实例

在您的私有子网中启动实例。您必须允许从 NAT 实例进行 SSH 访问,并且必须使用用于 NAT 实例的相同密钥对。

在私有子网中启动测试实例
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在控制面板上,选择启动实例

  3. 选择您的私有子网。

  4. 请勿向此实例分配公有 IP 地址。

  5. 确保此实例的安全组允许来自您的 NAT 实例或公有子网的 IP 地址范围的入站 SSH 访问以及出站 ICMP 流量。

  6. 选择用于 NAT 实例的相同密钥对。

步骤 3:Ping 启用了 ICMP 的网站

要验证私有子网中的测试实例是否可以使用 NAT 实例与互联网通信,请运行 ping 命令。

从您的私有实例测试互联网连接
  1. 在本地计算机上,配置 SSH 代理转发,以便您可以将 NAT 实例用作堡垒机服务器。

    Linux and macOS
    ssh-add key.pem
    Windows

    下载并安装 Pageant(如果尚未安装)。

    使用 PuTTYgen 将您的私有密钥转换为 .ppk 格式

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

  2. 从本地计算机连接到您的 NAT 实例。

    Linux and macOS
    ssh -A ec2-user@nat-instance-public-ip-address
    Windows

    使用 PuTTY 连接到您的 NAT 实例。对于身份验证,您必须选择允许代理转发,然后将用于身份验证的私有密钥文件留空。

  3. 在 NAT 实例中,运行 ping 命令,指定启用 ICMP 的网站。

    [ec2-user@ip-10-0-4-184]$ ping ietf.org

    要确认您的 NAT 实例可以访问互联网,请验证您是否收到了如下输出,然后按 Ctrl+C 取消 ping 命令。否则,验证 NAT 实例是否在公有子网中(其路由表有通往互联网网关的路由)。

    PING ietf.org (104.16.45.99) 56(84) bytes of data. 64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=1 ttl=33 time=7.88 ms 64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=2 ttl=33 time=8.09 ms 64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=3 ttl=33 time=7.97 ms ...
  4. 从您的 NAT 实例,使用私有 IP 地址连接到您私有子网中的实例。

    [ec2-user@ip-10-0-4-184]$ ssh ec2-user@private-server-private-ip-address
  5. 从您的私有实例,通过运行 ping 命令来测试您是否可以连接到互联网:

    [ec2-user@ip-10-0-135-25]$ ping ietf.org

    要确认您的私有实例可以通过 NAT 实例访问互联网,请验证您是否收到了如下输出,然后按 Ctrl+C 取消 ping 命令。

    PING ietf.org (104.16.45.99) 56(84) bytes of data. 64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=1 ttl=33 time=8.76 ms 64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=2 ttl=33 time=8.26 ms 64 bytes from 104.16.45.99 (104.16.45.99): icmp_seq=3 ttl=33 time=8.27 ms ...
故障排除

如果从私有子网中的服务器发出的 ping 命令失败,请使用以下步骤来进行问题排查:

  • 验证您对启用了 ICMP 的网站执行了 Ping 操作。如果未执行,您的服务器将无法接收应答数据包。要对此进行测试,请从您自己计算机上的命令行终端运行相同的 ping 命令。

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

  • 验证您对 NAT 实例禁用了源/目的地检查。有关更多信息,请参阅 5. 禁用源/目标检查

  • 验证您正确配置了路由表。有关更多信息,请参阅 6. 更新路由表

步骤 4:清除

如果您不再需要私有子网中的测试服务器,请终止该实例,这样您就不再为此付费。有关更多信息,请参阅《Amazon EC2 用户指南》中的 终止实例

如果您不再需要 NAT 实例,则可以停止或终止它,这样您就不再为此付费。如果您创建了一个 NAT AMI,则可以在需要时创建新的 NAT 实例。