我刚开始探索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
祝你好运!