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