我刚刚开始探索网络命名空间。我尝试按照以下文章实现以下简单设置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
祝你好运!