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

Vas*_*lis 3 networking ping namespaces ubuntu-12.10 network-namespace

我刚刚开始探索网络命名空间。我尝试按照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
Run Code Online (Sandbox Code Playgroud)

当我从默认命名空间 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


测试1

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



测试2

内核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在分配这些地址之前必须执行此操作。

eth*_*ish 5

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

在 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
Run Code Online (Sandbox Code Playgroud)

祝你好运!