Networking
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 嗎?如果是,為什麼我不必為 nstest1 做這件事?任何解釋幫助將不勝感激!我正在使用 ubuntu 12.10。
編輯:
每個命名空間的路由表如下:
預設命名空間
核心IP路由表 目標網關 Genmask 標誌 Metric Ref Use 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 標誌 Metric Ref Use Iface 10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 veth-1
nstest2
核心IP路由表 目標網關 Genmask 標誌 Metric Ref Use 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
這些地址之前,必須進行操作。
嗯,首先,你有兩個“邏輯上”獨立的虛擬乙太網網路。
在 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
祝你好運!