
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