我正在尝试为多个 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 的默认路由提供更低(更优先)的度量。