Ping de/para KVM QEMU VM em execução em outro namespace de rede

Ping de/para KVM QEMU VM em execução em outro namespace de rede

Não consigo executar ping no namespace de rede padrão de uma VM KVM QEMU em execução em um namespace de rede separado.

Aqui está minha configuração:

ip netns add test-ns

# Creating veth
ip link add if-in-ns type veth peer name if-notin-ns
# Default namespace
ip link addr add 10.21.0.10/24 dev if-notin-ns
ip link set dev if-notin-ns up
# Test-ns namespace
ip link set dev if-in-ns netns test-ns
ip netns exec test-ns ip addr add 10.21.0.20/24 dev if-in-ns
ip netns exec test-ns ip link set dev if-in-ns up

# Creating a tap device in the namespace
ip netns exec test-ns ip tuntap add tap0 mode tap
ip netns exec test-ns ip addr add 10.0.2.2/24 dev tap0
ip netns exec test-ns ip link set dev tap0 up

# Create route to 10.0.2.0/24 if default namespace:
ip route add 10.0.2.0/24 dev if-notin-ns

# Run VM
ip netns exec test-ns qemu-system-x86_64 -drive file=img.qcow2,format=qcow2,media=disk -accel kvm -cpu host -m 2G -netdev tap,id=vm0,ifname=tap0,script=no,downscript=no -device virtio-net-pci,netdev=vm0,mac=52:54:77:6a:cc:02

E estes são os resultados:

# In default namespace:
ping 10.21.0.20 # Works
ping 10.0.2.2 # Works
ping 10.0.2.3 # Doesn't work

# In test-ns namespace:
ping 10.21.0.10 # Works
ping 10.0.2.3 # Works

# Inside the image:
ping 10.0.2.2 # Works
ping 10.21.0.20 # Works
ping 10.21.0.10 # Doesn't work

Assim, a VM pode executar ping no devse-em-nse desenvolvedorse-em-nspode executar ping em seu parse-não-ns. Achei que isso significa que a VM deveria ser capaz de executar ping no desenvolvedorse-não-nstambém, mas não pode. O que estou entendendo mal?

Editar: Comentário para a resposta de Salim Aljayousi:

O namespace test-ns já possui uma rota para alcançar o namespace padrão através do devse-em-ns:

ip netns exec test-ns ip route
10.0.2.0/24 dev tap0 proto kernel scope link src 10.0.2.2 
10.21.0.0/24 dev if-in-ns proto kernel scope link src 10.21.0.20

Se eu remover esse e adicionar o que você sugere:

ip netns exec ns ip route del 10.21.0.0/24 dev if-in-ns
ip netns exec ns ip route add 10.21.0.0/24 dev tap0

Então, dentro da VM, recebo:

ping 10.21.0.10
From 10.0.2.2 icmp_seq=1 Redirect Host(New nexthop: 10.21.0.10) ```

Responder1

você pode adicionar uma rota no namespace test-ns para alcançar o namespace padrão através da interface tap

ip netns exec test-ns ip route add 10.21.0.0/24 dev tap0

Isso deve permitir que a VM faça ping em dispositivos no namespace padrão.

Observe que você também pode precisar ativar o encaminhamento de IP no sistema host para permitir que os pacotes sejam encaminhados entre namespaces.

sysctl -w net.ipv4.ip_forward=1

informação relacionada