Linux 网络命名空间 - 特定 veth 上的 ping 失败

Linux 网络命名空间 - 特定 veth 上的 ping 失败

我刚刚开始探索网络命名空间。我尝试按照以下文章实现以下简单设置http://www.opencloudblog.com/?p=42

   +--------+ +-----------+ +--------+
   | |------+ +------+ |------+ +------| |
   |nstest2 |veth-2++------++veth-b|默认 |veth-a++------++veth-1| nstest1|
   | |------+ +------+ 命名空间 |------+ +------| |
   +--------+ +-----------+ +--------+

我执行以下命令:

#setup namespace nstest1
sudo ip netns add nstest1
sudo ip netns exec nstest1 ip link set dev lo up
sudo ip link add veth-a type veth peer name veth-1
sudo ip link set veth-1 netns nstest1
sudo ip netns exec nstest1 ip addr add 10.0.1.1/24 dev veth-1
sudo ip netns exec nstest1 ip link set dev veth-1 up

# setup namespace nstest2
sudo ip netns add nstest2
sudo ip netns exec nstest2 ip link set dev lo up
sudo ip link add veth-b type veth peer name veth-2
sudo ip link set veth-2 netns nstest2
sudo ip netns exec nstest2 ip addr add 10.0.2.1/24 dev veth-2
sudo ip netns exec nstest2 ip link set dev veth-2 up

# setup default namespace
sudo ip addr add 10.0.1.2/24 dev veth-a
sudo ip link set dev veth-a up
sudo ip addr add 10.0.2.2/24 dev veth-b
sudo ip link set dev veth-b up

当我从默认命名空间 ping nstest1 或反之时,所有 ping 均成功。当我尝试从默认命名空间 ping nstest2 或反之时,所有 ping 均失败。我不明白为什么会发生这种情况以及如何修复它。我是否应该手动将从默认命名空间到 nstest2 的路由添加到/添加到 nstest2?如果是,为什么我不必对 nstest1 执行此操作?任何解释帮助都将不胜感激!我正在使用 ubuntu 12.10。

编辑
每个命名空间的路由表如下:


默认命名空间

内核 IP 路由表
目标网关 Genmask 标志 指标参考使用 Iface
0.0.0.0 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 veth-a
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 veth-b
192.168.56.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1


nstest1

内核 IP 路由表
目标网关 Genmask 标志 指标参考使用 Iface
10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 veth-1



nstest2

内核 IP 路由表
目标网关 Genmask 标志 指标参考使用 Iface
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 veth-2

编辑2
事实证明,10.0.2.2 已分配给 eth0,因此将同一子网分配给 veth-b 和 veth-2 会导致冲突。当我将其更改为 10.0.3.1/24 和 10.0.3.2/24 时,nstest1 和 nstest2 均能 ping 通。ifconfig -a在分配这些地址之前,必须执行此操作。

答案1

嗯,首先,您有两个“逻辑上”独立的虚拟以太网网络。

在 veth-b 上使用 10.0.2.1/24,在 veth-2 上使用 10.0.2.4/24

在 veth-a 上使用 10.0.1.1/24,在 veth-1 上使用 10.0.1.3/24

veth-b 和 veth-2 与 veth-a 和 veth-1 是不同的网络,因此您应该为它们提供单独的 IP 子网。

除非您执行以下操作,否则您仍然无法从 10.0.1.3 ping 到 10.0.2.4:

   $ echo 1 > /proc/sys/net/ipv4/ip_forward
   $ sudo ip netns exec nstest2 ip route add default via 10.0.2.1
   $ sudo ip netns exec nstest1 ip route add default via 10.0.1.1

祝你好运!

相关内容