Почему маршрут IPv6, добавленный до запуска виртуальной машины, не работает?

Почему маршрут IPv6, добавленный до запуска виртуальной машины, не работает?

У меня есть внешний сервер в Hetzner с Debian 7, и я пытаюсь настроить KVM с маршрутизацией IPv6 (та же настройка работает для IPv4 без проблем).

У меня есть одна Ubuntu Server VM с двумя интерфейсами, которые находятся в двух разных подсетях. Первый интерфейс подключен к хосту через мост:

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

Я настроил мост для добавления статического маршрута ко второй подсети через первый интерфейс виртуальной машины:

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

Это добавляет запись маршрута ДО запуска виртуальной машины. Когда я использую ping6 с хоста на интерфейс vnet1 (2::2), я получаю это сообщение об ошибке:

ping: sendmsg: Network is down

Когда я не добавляю маршрут в конфигурацию интерфейсов и вызываю его вручную ПОСЛЕ запуска виртуальной машины, все работает.

Итак, мой вопрос: почему добавление маршрута для адресов IPv6 работает только после запуска виртуальной машины?

Дополнительные сведения о конфигурации:

Интерфейсы хоста

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

Интерфейсы ВМ

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

Пожалуйста, сообщите мне, если вам нужны дополнительные логи (до и после того, как это заработает), я их соберу.

решение1

У меня та же проблема. Решение — очистить кэш маршрута IPV6 после настройки маршрута:

ip -6 route flush cache

Измените раздел интерфейсов на:

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

устраняет проблему при загрузке.

решение2

Я не уверен, что это связано с порядком запуска виртуальных машин/добавления маршрутов, если только нет какой-то логики, позволяющей установить метрику ниже, чем у других маршрутов... Несколько интерфейсов могут захотеть направить ваш трафик IPv6, и ядро ​​выберет маршрут с самой низкой метрикой.

В моей системе метрика по умолчанию для моего моста была 425, поэтому, когда запускается VM и настраивается маршрут по умолчанию с метрикой 256, он имеет приоритет над маршрутом по умолчанию bridge0 и заставляет трафик отправляться на мою VM по умолчанию. Маршрут можно распечатать с помощью:

ip -6 route show

Libvirt, вероятно, даже не должен позволять этому интерфейсу иметь адрес ipv6 и маршруты, поскольку он является частью моста, но он это делает, поэтому мой обходной путь — просто установить маршрут моста по умолчанию на более низкое значение, чем интерфейс vmnet. Используя network-manager:

nmcli connection modify bridge0 ipv6.route-metric 128

Теперь, хотя libvirt и создает маршрут на интерфейсе vnet0, он не используется, поскольку мост имеет приоритет.

Этототчет об ошибкепохоже, что-то связано, хотя проблема очень старая, так что, возможно, я наблюдаю более новую ошибку...

Связанный контент