允许私有资源在 VPC 外部进行通信
本节旨在介绍如何创建并使用 NAT 实例,让私有子网中的资源能够在虚拟私有云之外进行通信。
1. 为 NAT 实例创建 VPC
使用以下过程创建具有公有和私有子网的 VPC。
创建 VPC
-
通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/
。 -
选择创建 VPC。
-
对于 Resources to create(要创建的资源),选择 VPC and more(VPC 等)。
-
对于 Name tag auto-generation(名称标签自动生成),为 VPC 输入名称。
-
若要配置子网,请执行以下操作:
-
对于 Number of Availability Zones(可用区域数量),根据您的需求选择 1 或 2。
-
对于 Number of public subnets(公有子网数量),确保每个可用区有一个公有子网。
-
对于 Number of private subnets(私有子网数量),确保每个可用区有一个私有子网。
-
-
选择创建 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 访问 |
创建安全组
-
通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/
。 -
在导航窗格中,选择 Security Groups(安全组)。
-
选择Create security group(创建安全组)。
-
输入安全组的名称和描述。
-
对于 VPC,选择用于 NAT 实例的 VPC 的 ID。
-
在入站规则下添加入站流量规则,如下所示:
-
选择 添加规则。在类型中选择 HTTP,并在源中输入私有子网的 IP 地址范围。
-
选择 添加规则。在类型中选择 HTTPS,并在源中输入私有子网的 IP 地址范围。
-
选择 添加规则。在类型中选择 SSH,并在源中输入网络的 IP 地址范围。
-
-
在出站规则下添加出站流量规则,如下所示:
-
选择 添加规则。在类型中选择 HTTP,并在目的地中输入 0.0.0.0/0。
-
选择 添加规则。在类型中选择 HTTPS,并在目的地中输入 0.0.0.0/0。
-
-
选择创建安全组。
有关更多信息,请参阅 安全组。
3. 创建 NAT AMI
NAT AMI 被配置为在 EC2 实例上运行 NAT。您必须先创建 NAT AMI,然后使用您的 NAT AMI 启动 NAT 实例。
如果您计划为 NAT AMI 使用 Amazon Linux 以外的操作系统,请参阅该操作系统的文档了解如何配置 NAT。请务必保存这些设置,以便其在实例重启后依然保持不变。
为 Amazon Linux 创建 NAT AMI
-
启动运行 AL2023 或 Amazon Linux 2 的 EC2 实例。请务必指定为 NAT 实例创建的安全组。
-
连接到实例并在实例上运行以下命令以启用 iptables。
sudo yum install iptables-services -y sudo systemctl enable iptables sudo systemctl start iptables
-
在实例上执行以下操作以启用 IP 转发,使其在重启后仍然存在:
使用文本编辑器(例如 nano 或 vim)创建以下配置文件:
/etc/sysctl.d/custom-ip-forwarding.conf
。-
将以下行添加到配置文件。
net.ipv4.ip_forward=1
保存配置文件,退出文本编辑器。
-
运行以下命令以应用配置文件。
sudo sysctl -p /etc/sysctl.d/custom-ip-forwarding.conf
-
在实例上运行以下命令,并记下主网络接口的名称。您在下一步中需要此信息。
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
-
在实例上运行以下命令以配置 NAT。如果主网络接口不是
eth0
,请将eth0
替换为您在上一步中记下的主网络接口。sudo /sbin/iptables -t nat -A POSTROUTING -o
eth0
-j MASQUERADE sudo /sbin/iptables -F FORWARD sudo service iptables save -
然后,从 EC2 实例创建 NAT AMI。有关更多信息,请参阅《Amazon EC2 用户指南》中的从实例创建 Linux AMI。
4. 启动 NAT 实例
按照以下步骤使用您创建的 VPC、安全组和 NAT AMI 启动 NAT 实例。
启动 NAT 实例
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 -
在控制面板上,选择启动实例。
-
对于名称,输入您的 NAT 实例名称。
-
对于应用程序和操作系统映像,选择您的 NAT AMI(选择浏览更多 AMI、我的 AMI)。
-
对于实例类型,选择选择一个实例类型,以提供 NAT 实例所需的计算、内存和存储资源。
-
(可选)对于密钥对,选择一个现有密钥对或选择创建新密钥对。
-
对于 Network settings(网络设置),执行以下操作:
-
选择编辑。
-
对于 VPC,选择已创建的 VPC。
-
对于子网,选择您创建的公有子网。
-
对于 Auto-assign public IP(自动分配公有 IP),选择 Enable(启用)。或者在启动 NAT 实例后,分配一个弹性 IP 地址并将其分配给 NAT 实例。
-
对于防火墙,选择选择现有安全组,然后选择您创建的安全组。
-
-
选择启动实例。选择实例 ID 以打开实例详细信息页面。等待实例状态变为正在运行,并等待状态检查成功。
-
禁用 NAT 实例的源/目的地检查(参阅 5. 禁用源/目标检查)。
-
更新路由表以将流量发送至 NAT 实例(参阅 6. 更新路由表)。
5. 禁用源/目标检查
每项 EC2 实例都会默认执行源/目标检查。这意味着实例必须为其发送或接收的数据流的源头或目标。但是,NAT 实例必须能够在源或目标并非其本身时发送和接收数据流。因此,您必须禁用 NAT 实例的源/目标检查。
禁用源/目的地检查
-
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 -
在导航窗格中,选择实例。
-
选择 NAT 实例。
-
依次选择操作、联网、更改源/目的地检查。
-
对于源/目的地检查,请选择停止。
-
选择保存。
-
如果 NAT 实例有辅助网络接口,请从联网选项卡上的网络接口选择接口。选择接口 ID 以转至网络接口页面。选择操作、更改源/目标检查,清除启用,然后选择保存。
6. 更新路由表
私有子网的路由表必须有一个将互联网流量发送到 NAT 实例的路由。
更新路由表
-
通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/
。 -
在导航窗格中,选择 Route tables(路由表)。
-
选择私有子网的路由表。
-
在路由选项卡中选择编辑路由,然后选择添加路由。
-
在目的地中输入 0.0.0.0/0,并在目标中输入 NAT 实例的实例 ID。
-
选择 Save changes(保存更改)。
有关更多信息,请参阅 配置路由表。
7. 测试您的 NAT 实例
启动 NAT 实例并完成以上配置步骤之后,您可以测试私有子网中的实例是否可以通过将 NAT 实例用作堡垒机服务器来访问互联网。
步骤 1:更新 NAT 实例安全组
如需允许私有子网中的实例向 NAT 实例发送 ping 流量,请添加一个规则来允许入站和出站 ICMP 流量。要允许 NAT 实例用作堡垒机服务器,请添加一个规则以允许出站 SSH 流量流向私有子网。
更新 NAT 实例安全组
通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/
。 在导航窗格中,选择 Security Groups(安全组)。
选择与 NAT 实例关联的安全组的复选框。
在 Inbound Rules (入站规则) 选项卡上,选择 Edit inbound rules (编辑入站规则)。
选择 Add rule。对于类型,选择所有 ICMP - IPv4。对于源,选择自定义,输入您的私有子网的 IP 地址范围。选择保存规则。
-
在出站规则选项卡上,选择编辑出站规则。
-
选择 Add rule。对于类型,选择 SSH。对于目的地,选择自定义,并输入您的私有子网的 IP 地址范围。
-
选择 Add rule。对于类型,选择所有 ICMP - IPv4。为 Destination (目的地) 选择 Anywhere - IPv4 (任何位置 – IPv4)。选择保存规则。
步骤 2:在私有子网中启动测试实例
在您的私有子网中启动实例。您必须允许从 NAT 实例进行 SSH 访问,并且必须使用用于 NAT 实例的相同密钥对。
在私有子网中启动测试实例
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 -
在控制面板上,选择启动实例。
-
选择您的私有子网。
-
请勿向此实例分配公有 IP 地址。
-
确保此实例的安全组允许来自您的 NAT 实例或公有子网的 IP 地址范围的入站 SSH 访问以及出站 ICMP 流量。
-
选择用于 NAT 实例的相同密钥对。
步骤 3:Ping 启用了 ICMP 的网站
要验证私有子网中的测试实例是否可以使用 NAT 实例与互联网通信,请运行 ping 命令。
从您的私有实例测试互联网连接
-
在本地计算机上,配置 SSH 代理转发,以便您可以将 NAT 实例用作堡垒机服务器。
-
从本地计算机连接到您的 NAT 实例。
-
在 NAT 实例中,运行 ping 命令,指定启用 ICMP 的网站。
[ec2-user@ip-10-0-4-184]$
pingietf.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 ...
-
从您的 NAT 实例,使用私有 IP 地址连接到您私有子网中的实例。
[ec2-user@ip-10-0-4-184]$
ssh ec2-user@private-server-private-ip-address
-
从您的私有实例,通过运行 ping 命令来测试您是否可以连接到互联网:
[ec2-user@ip-10-0-135-25]$
pingietf.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 实例。