Назад | Перейти на главную страницу

Сетевые пространства имен Linux - ping не работает на определенном veth

Я только начал изучать сетевые пространства имен. Я пытаюсь реализовать следующую простую настройку, следуя статье в http://www.opencloudblog.com/?p=42

   +--------+                      +-----------+                      +--------+
   |        |------+        +------+           |------+        +------|        |
   |nstest2 |veth-2++------++veth-b| Default   |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

Когда я пингую nstest1 из пространства имен по умолчанию или наоборот, все эхо-запросы проходят успешно. Когда я пытаюсь выполнить ping nstest2 из пространства имен по умолчанию или наоборот, все ping терпят неудачу. Я не могу понять, почему это происходит и как это можно исправить. Должен ли я вручную добавлять маршруты из / в пространство имен по умолчанию в nstest2? Если да, то почему мне не нужно делать это для nstest1? Любая помощь с объяснением будет принята с благодарностью! Я использую Ubuntu 12.10.

РЕДАКТИРОВАТЬ:
Таблицы маршрутов для каждого пространства имен следующие:


Пространство имен по умолчанию

Kernel IP routing table
Destination     Gateway         Genmask         Flags 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

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.1.0        0.0.0.0         255.255.255.0   U     0      0        0 veth-1



nstest2

Kernel IP routing table
Destination     Gateway         Genmask         Flags 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 необходимо перед назначением этих адресов.

Во-первых, у вас есть две «логически» отдельные виртуальные сети Ethernet.

на veth-b используйте 10.0.2.1/24 и используйте 10.0.2.4/24 на veth-2

на veth-a используйте 10.0.1.1/24 и используйте 10.0.1.3/24 на veth-1

veth-b и veth-2 - это сеть, отличная от veth-a и veth-1, поэтому вам следует предоставить им отдельные IP-подсети.

Вы по-прежнему не сможете пинговать с 10.0.1.3 на 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

Удачи!