Eu tenho um servidor externo na Hetzner com Debian 7 e estou tentando configurar o KVM com roteamento IPv6 (a mesma configuração funciona para IPv4 sem problemas).
Eu tenho uma VM do Ubuntu Server com duas interfaces que estão em duas sub-redes diferentes. A primeira interface está conectada ao host através de uma ponte:
Host-eth0 <-- external bridge --> vnet0-VM-vnet1 <-- internal bridge
Configurei a ponte para adicionar uma rota estática à segunda sub-rede por meio da primeira interface da VM:
ip -6 route add 2a01:4f8:X:Y:2::/80 via 2a01:4f8:X:Y:1::3 dev virbr_external
Isso adiciona a entrada da rota ANTES da VM ser iniciada. Quando uso o ping6 do host para a interface vnet1 (2::2), recebo esta mensagem de erro:
ping: sendmsg: Network is down
Quando não adiciono a rota na configuração das interfaces e chamo-a manualmente APÓS a VM ser iniciada, tudo funciona.
Então, minha pergunta é por que a adição de rotas para endereços IPv6 só funciona depois que a VM é iniciada?
Detalhes de configuração adicionais:
Interfaces de host
auto lo
iface lo inet6 loopback
auto eth0
iface eth0 inet6 static
address 2a01:4f8:X:Y:0::2
netmask 128
gateway fe80::1
# Bridge between Host and VM
auto virbr_external
iface virbr_external inet6 static
bridge_ports none
bridge_stp off
bridge_fd 0
address 2a01:4f8:X:Y:1::2
netmask 80
up ip -6 route add 2a01:4f8:X:Y:2::/80 via 2a01:4f8:X:Y:1::3 dev virbr_external
# Bridge between VM and other VMs
auto virbr_internal
iface virbr_internal inet6 manual
bridge_ports none
bridge_stp off
bridge_fd 0
Interfaces de VM
auto lo
iface lo inet6 loopback
auto eth0
iface eth0 inet6 static
address 2a01:4f8:X:Y:1::3
netmask 80
gateway 2a01:4f8:X:Y:1::2
auto eth1
iface eth1 inet6 static
address 2a01:4f8:X:Y:2::2
netmask 80
Por favor, diga-me se precisar de mais logs (antes e depois de funcionar), então irei reuni-los.
Responder1
Estou tendo o mesmo problema aqui. A solução é liberar o cache da rota IPV6 após definir a rota:
ip -6 route flush cache
Alterando sua seção de interfaces para:
...
auto virbr_external
iface virbr_external inet6 static
bridge_ports none
bridge_stp off
bridge_fd 0
address 2a01:4f8:X:Y:1::2
netmask 80
up ip -6 route add 2a01:4f8:X:Y:2::/80 via 2a01:4f8:X:Y:1::3 dev virbr_external
up ip -6 route flush cache # Flush cache after setting route
...
corrige o problema na inicialização.
Responder2
Não tenho certeza se isso tem a ver com a ordem em que as VMs são iniciadas/rotas são adicionadas, a menos que haja alguma lógica para definir a métrica mais baixa do que outras rotas... Múltiplas interfaces podem querer rotear seu tráfego IPv6 e o kernel escolherá a rota com a métrica mais baixa.
No meu sistema, a métrica padrão para minha ponte era 425, portanto, quando uma VM é iniciada e configura uma rota padrão com a métrica 256, ela tem precedência sobre a rota bridge0 padrão e faz com que o tráfego seja enviado para minha VM por padrão. A rota pode ser impressa com:
ip -6 route show
O Libvirt provavelmente nem deveria permitir que essa interface tenha um endereço IPv6 e rotas, pois faz parte da ponte, mas faz isso, então minha solução alternativa é simplesmente definir a rota padrão da ponte para um valor inferior ao da interface vmnet. Usando o gerenciador de rede:
nmcli connection modify bridge0 ipv6.route-metric 128
Agora, embora a libvirt crie uma rota na interface vnet0, ela não está sendo usada porque a ponte tem precedência.
Esserelatório de erroparece estar relacionado, embora seja muito antigo, então pode ser um bug mais recente que estou vendo...