两个网络命名空间之间的 Linux ping

两个网络命名空间之间的 Linux ping

对 Linux 网络很陌生,在类似问题中找不到答案

尝试创建 2 个命名空间并在它们之间进行 ping

ip netns add red;
ip netns add blue;

ip link add dev v-red type veth peer name v-blue;
ip link set dev v-red netns red;
ip link set dev v-blue netns blue;

ip netns exec red ip addr add 192.168.15.1 dev v-red;
ip netns exec blue ip addr add 192.168.15.2 dev v-blue;

ip netns exec red ip link set dev v-red up;
ip netns exec blue ip link set dev v-blue up;

ip netns exec red ping 192.168.15.2;
-> ping: connect: Network is unreachable

调试时我寻找的是什么

ip netns exec blue ifconfig
v-blue: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.15.2  netmask 255.255.255.255  broadcast 0.0.0.0

ip netns exec red ifconfig
v-red: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.15.1  netmask 255.255.255.255  broadcast 0.0.0.0

答案1

这两个设备位于两个不同的逻辑 /32 网络中,并且没有路由或路由表提示联系每个主机的方式。

如果你执行,# ip netns exec red ip route get 192.168.15.2它会回答RTNETLINK answers: Network is unreachable。因为路由表没有关于如何将数据包发送到 192.168.15.2/32 网络的答案。

但是,如果你在两个方向上添加路由,这应该暗示这两个主机是邻居(从技术上讲更像是直接连接的对等体),并且应该发送数据包。

ip netns exec red ip route add 192.168.15.2/32 dev v-red
ip netns exec blue ip route add 192.168.15.1/32 dev v-blue

然后,您可以打印一个路由表,看看现在如何指示路由。

ip netns exec blue ip route list
192.168.15.1 dev v-blue scope link

请注意,在这里实际使用默认路由是完全有效的(ip netns exec red ip route add default dev v-red),因为它涵盖所有主机,而不仅仅是您知道存在于另一端的主机,但为了理解这里的问题,我添加了您想要与之通信的特定主机。

此时,(防火墙允许) ping 应该可以按预期工作。

答案2

上面的答案解释了一切。我试图通过勾勒出您的设置来进一步解释。您在每个命名空间中都缺少路由,只需记住命名空间是 TCP/IP 路由堆栈(ARP、接口、路由、防火墙规则等)的完整实例。

您的设置

希望这可以帮助。

答案3

如果您的目的是让红色和蓝色命名空间位于同一个网络中,您可能需要使用以下命令,以消除路由器。

ip netns exec red ip route add 192.168.15.2/24 dev v-red

ip netns exec blue ip route add 192.168.15.1/24 dev v-blue

相关内容