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