Назад | Перейти на главную страницу

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

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

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

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

Скажите, пожалуйста, если вам нужно больше логов (до и после того, как он заработает), я его тогда соберу.

Здесь та же проблема. Решение - очистить кеш маршрута 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
   ...

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

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

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

ip -6 route show

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

nmcli connection modify bridge0 ipv6.route-metric 128

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

это отчет об ошибке кажется связанным, хотя он очень старый, так что это может быть более новая ошибка, которую я вижу ...