Linuxnetworking命名空间 – ping在特定veth失败

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

    + -------- + + ----------- + + -------- +
    |  | ------ + + ------ + | ------ + + ------ |  |
    | nstest2 | veth-2 ++ ------ ++ veth-b | 默认| veth-a ++ ------ ++ veth-1 |  nstest1 |
    |  | ------ + + ------ + namespace | ------ + + ------ |  |
    + -------- + + ----------- + + -------- + 

我执行以下命令:

#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? 如果是的话,为什么我不必为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时,ping对nstest1和nstest2都起作用。 在分配这些地址之前,需要执行ifconfig -a

那么首先,你有两个“逻辑上”独立的虚拟以太网networking。

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

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

veth-b和veth-2与veth-a和veth-1是不同的networking,所以你应该给他们单独的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 

祝你好运!