![如果没有 NAT 规则,则无法从网络命名空间 Ping 到另一个 EC2 实例](https://linux22.com/image/791815/%E5%A6%82%E6%9E%9C%E6%B2%A1%E6%9C%89%20NAT%20%E8%A7%84%E5%88%99%EF%BC%8C%E5%88%99%E6%97%A0%E6%B3%95%E4%BB%8E%E7%BD%91%E7%BB%9C%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%20Ping%20%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%20EC2%20%E5%AE%9E%E4%BE%8B.png)
我有以下设置。
我已经设置了两个 EC2 实例。我在两台机器上都添加了安全组规则以允许 ICMP 流量,并且两台机器都可以互相 ping 通。
在一台机器上,我创建了两个网络命名空间blue
和red
。在这台机器上,我还使用名为的桥接接口设置了一个虚拟交换机v-net-0
,并将命名空间连接到它。我分别将192.168.15.2
和分配192.168.15.3
给蓝色和红色命名空间。
我已将192.168.15.5
其分配给v-net-0
,因此我可以从第一个实例 ping 到命名空间。然后我发出了ping 192.168.15.2
和ping 192.168.15.3
来 ping 蓝色和红色命名空间。它运行成功。
现在我需要从我的蓝色命名空间 ping 第二个实例。因此,我使用命令在蓝色命名空间中添加了一个路由表条目。ip netns exec blue ip route add 172.31.80.0/20 via 192.168.15.5
此外,我在第一台机器上启用了 IP 转发,并使用命令添加了 NAT 规则iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE
。
然后我发布了ip netns exec blue ping 172.31.94.241
。因此,正如预期的那样,一切都成功了。
因此,根据我的理解,我们需要第一台机器中的 NAT 规则来向第二台机器指示流量来自第一台机器的 IP 地址。如果我错了,请纠正我。
我的问题是,我可以从蓝色命名空间 ping 第二台机器,而无需添加 NAT 规则。我的想法是,如果我们在第二台机器中添加一个路由条目,目的地为192.168.15.0/24
,蓝色命名空间可能能够在没有 NAT 的情况下 ping 第二台机器。我试过了,但没有成功。
或者这个任务需要 NAT 吗?
感谢任何澄清和解决方案!!!
答案1
我相信您的所有分析都是正确的,我怀疑问题出在细节上。如果您的命名空间有ip route add 172.31.80.0/20 via 192.168.15.5
,您的第二个 EC2 实例也有ip route add 192.168.15.0/24 via 172.31.X.Y
(添加第一个 EC2 实例的 IP 地址),并且第一个实例上启用了 IP 转发,那么您应该一切就绪了。
由于您提到设置规则以允许实例相互 ping ,我怀疑防火墙阻止了您的 ping ,要么是因为您不允许子网192.168.15.0/24
,要么是因为 EC2 架构实际上由于某种原因不允许该链接上的其他子网。
为了进行调试,我建议tcpdump icmp
在 2 个实例上运行,以查看 ping 请求的进展情况,以及是否生成了任何回复。您也可以做同样的事情,但将第二个实例的 ping 发送到第一个实例上的命名空间,以查看请求是否到达第一个实例。祝你好运!