У меня есть внешний сервер в 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, он не используется, потому что мост имеет приоритет.
это отчет об ошибке кажется связанным, хотя он очень старый, так что это может быть более новая ошибка, которую я вижу ...