namespaces da rede Linux - o ping falha em veth específico

1

Eu comecei a explorar os namespaces de rede. Eu tento implementar a seguinte configuração simples seguindo o artigo no link

   +--------+                      +-----------+                      +--------+
   |        |------+        +------+           |------+        +------|        |
   |nstest2 |veth-2++------++veth-b| Default   |veth-a++------++veth-1| nstest1|
   |        |------+        +------+ namespace |------+        +------|        |
   +--------+                      +-----------+                      +--------+

Eu executo os seguintes comandos:

#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

Quando faço ping nstest1 do namespace padrão ou vice-versa, todos os pings são bem-sucedidos. Quando tento pingar nstest2 do namespace padrão ou vice-versa, todos os pings falham. Não consigo entender por que isso acontece e como isso pode ser corrigido. Devo adicionar manualmente as rotas de / para namespace padrão para nstest2? Se sim porque eu não tenho que fazer isso para nstest1? Qualquer ajuda com a explicação será muito apreciada! Estou usando o Ubuntu 12.10.

EDITAR :
As tabelas de rotas são as seguintes para cada namespace:


Default namespace

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

EDIT 2
Acontece que 10.0.2.2 é atribuído a eth0, portanto, há uma colisão atribuindo a mesma sub-rede a veth-b e veth-2. Quando eu mudei para 10.0.3.1/24 e 10.0.3.2/24 ping funcionou para nstest1 e nstest2. Fazer um ifconfig -a é necessário antes de atribuir esses endereços.

    
por Vasilis 21.01.2014 / 19:27

1 resposta

2

Bem, em primeiro lugar, você tem duas redes Ethernet virtuais separadas "logicamente".

em veth-b use 10.0.2.1/24 e use 10.0.2.4/24 em veth-2

em veth-a use 10.0.1.1/24 e use 10.0.1.3/24 em veth-1

veth-b e veth-2 são uma rede diferente para veth-a e veth-1, então você deve dar-lhes sub-redes IP separadas.

Você ainda não conseguirá executar o ping de 10.0.1.3 a 10.0.2.4, a menos que você faça:

   $ 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

Boa sorte!

    
por 21.01.2014 / 19:40