Networking

Linux 網路命名空間 - 在特定 veth 上 ping 失敗

  • June 20, 2015

我剛剛開始探索網路命名空間。我嘗試按照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

祝你好運!

引用自:https://serverfault.com/questions/568839