通过 NAT 网关为 EC2 实例提供传出互联网访问 + 将传入访问保留在单独的公共 IP 上

通过 NAT 网关为 EC2 实例提供传出互联网访问 + 将传入访问保留在单独的公共 IP 上

我正在尝试为多个 EC2 实例通过“NAT 网关”配置传出互联网访问,以便 fecurl ifconfig.co为所有实例返回相同的 IP,并且它们连接的外部统计服务器显示相同的 IP。

同时,这些实例必须仍然可以通过它们的公共 IP 访问(每个 ec2 实例都有自己的公共 IP),可以通过 ssh 访问,提供 Web 内容,并且可以通过它们的私有 IP 相互访问。

实例只有 eth0 接口,其上有 10.0.1.0/24 子网地址 (www1)。我无法使用 ifconfig 查看公共 IP 的接口,但我猜这是 ec2 实例的预期行为。它们都在 Elastic Load Balancer 后面。

我创建了第二个子网 www2,其 CIDR 块 = 10.0.3.0/24。

我创建了一个 NAT 网关并为其分配了一个弹性 IP,并选择了子网 www2。NAT 网关的私有 IP 正确显示为 10.0.3.132。

我已经在 EC2->网络接口中为其中一个实例创建了网络接口,其中选择了子网 10.0.3.0 + 私有 IP 自动分配 + 安全组与其他实例相同,其入站规则为 SSH TCP 22 0.0.0.0/0,出站规则为所有流量 0-65535 0.0.0.0/0。

实例确实获得了第二个 eth1 接口,并自动为其分配了正确的 ip=10.0.3.31。以下是该实例的 ip 路由显示:

ip route show
default via 10.0.1.1 dev eth0
default via 10.0.3.1 dev eth1  metric 10001
10.0.1.0/24 dev eth0  proto kernel  scope link  src 10.0.1.69
10.0.3.0/24 dev eth1  proto kernel  scope link  src 10.0.3.31
169.254.169.254 dev eth0

这是 ifconfig:

ifconfig
eth0      Link encap:Ethernet  HWaddr 0A:65:1C:28:80:7E
          inet addr:10.0.1.69  Bcast:10.0.1.255  Mask:255.255.255.0
          inet6 addr: fe80::865:1cff:fe28:807e/64 Scope:Link
          inet6 addr: 2600:1f18:4328:e200:4f10:db4d:6a56:d900/64 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1
          RX packets:10978429 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8536463 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:26095196998 (24.3 GiB)  TX bytes:2202490320 (2.0 GiB)

eth1      Link encap:Ethernet  HWaddr 0A:9D:28:92:38:0E
          inet addr:10.0.3.31  Bcast:10.0.3.255  Mask:255.255.255.0
          inet6 addr: fe80::89d:28ff:fe92:380e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1
          RX packets:262217 errors:0 dropped:0 overruns:0 frame:0
          TX packets:197708 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:237017161 (226.0 MiB)  TX bytes:50706247 (48.3 MiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:420172 errors:0 dropped:0 overruns:0 frame:0
          TX packets:420172 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:1399654528 (1.3 GiB)  TX bytes:1399654528 (1.3 GiB)

之后,如果我转到 VPC 仪表板->路由表->编辑所有实例的相应路由表的路由,并将目标中的 0.0.0.0/0 设置为“nat-06931899c65346b40”而不是 igw-fd92cc9a,我将断开与 ssh 会话的连接,并且实例上托管的网站将不可用。我想这是意料之中的,因为它现在位于 NAT 后面。

顺便说一句,EC2->网络接口中 NAT 网关的安全组为空,这对我来说看起来不太好,但是当我尝试使用“更改安全组”将其设置为与其他实例(或任何其他实例)相同时,我收到“您无权访问指定的资源。”

因此我希望我的实例可以通过 http 和 ssh 上的公共 IP 访问,但报告相同的 IP curl ifconfig.co

我们的目标是不要手动编辑每个实例上的路由表,因为我们准备自动扩展并使用 aws web 控制台提供的选项。

但即使我手动完成,我究竟如何编辑路线以实现我的目标?

添加 NAT 网关之前的一般网络方案是:VPC 互联网网关 <-> ELB <-> ec2 实例(具有可访问的公共 IP)。实例中的 Web 内容通过 ELB 提供,但实例本身可通过其公共 IP 直接用于 ssh。

提前致谢!

答案1

我不明白在不改变路由表的情况下如何做到这一点。

您需要两个路由表(RT1 和 RT2):

与 10.0.1.0/24 子网关联的 RT1: Destination: 0.0.0.0/0, Target igw-fd92cc9a
与 10.0.3.0/24 子网关联的 RT2: Destination: 0.0.0.0/0, Target nat-06931899c65346b4

更改实例的路由表,为通过 10.0.3.1 的默认路由提供更低(更优先)的度量。

相关内容