Por que uma rota IPv6 adicionada antes do início da máquina virtual não funciona?

Por que uma rota IPv6 adicionada antes do início da máquina virtual não funciona?

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...

informação relacionada