¿Por qué no funciona una ruta IPv6 agregada antes de iniciar la máquina virtual?

¿Por qué no funciona una ruta IPv6 agregada antes de iniciar la máquina virtual?

Tengo un servidor externo en Hetzner con Debian 7 e intento configurar KVM con enrutamiento IPv6 (la misma configuración funciona para IPv4 sin problemas).

Tengo una máquina virtual de servidor Ubuntu con dos interfaces que se encuentran en dos subredes diferentes. La primera interfaz está conectada al host a través de un puente:

Host-eth0 <-- external bridge --> vnet0-VM-vnet1 <-- internal bridge

Configuré el puente para agregar una ruta estática a la segunda subred a través de la primera interfaz VM:

ip -6 route add 2a01:4f8:X:Y:2::/80 via 2a01:4f8:X:Y:1::3 dev virbr_external

Esto agrega la entrada de ruta ANTES de que se inicie la VM. Cuando uso ping6 desde el host a la interfaz vnet1 (2::2), aparece este mensaje de error:

ping: sendmsg: Network is down

Cuando no agrego la ruta en la configuración de las interfaces y la llamo manualmente DESPUÉS de que se inicia la VM, todo funciona.

Entonces mi pregunta es ¿por qué la adición de ruta para direcciones IPv6 solo funciona después de que se inicia la máquina virtual?

Detalles de configuración adicionales:

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 máquina virtual

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

Dígame si necesita más registros (antes y después de que funcione), los reuniré entonces.

Respuesta1

Teniendo el mismo problema aquí. La solución es vaciar el caché de ruta IPV6 después de configurar la ruta:

ip -6 route flush cache

Cambiando su sección de interfaces a:

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

soluciona el problema en el arranque.

Respuesta2

No estoy seguro de que tenga que ver con el orden en el que se inician las VM/se agregan las rutas, a menos que haya alguna lógica para establecer la métrica más baja que otras rutas... Es posible que varias interfaces quieran enrutar su tráfico ipv6 y el kernel elegirá la ruta con la métrica más baja.

En mi sistema, la métrica predeterminada para mi puente era 425, por lo que cuando una VM se inicia y configura una ruta predeterminada con la métrica 256, tiene prioridad sobre la ruta predeterminada bridge0 y hace que el tráfico se envíe a mi VM de forma predeterminada. La ruta se puede imprimir con:

ip -6 route show

Probablemente Libvirt ni siquiera debería permitir que esa interfaz tenga una dirección y rutas ipv6, ya que es parte del puente, pero las tiene, por lo que mi solución es simplemente establecer la ruta predeterminada del puente en un valor inferior al de la interfaz vmnet. Usando el administrador de red:

nmcli connection modify bridge0 ipv6.route-metric 128

Ahora, aunque libvirt crea una ruta en la interfaz vnet0, no se utiliza porque el puente tiene prioridad.

Esteinforme de errorParece estar relacionado, aunque es muy antiguo, por lo que puede ser un error más nuevo que estoy viendo...

información relacionada