3

Я пытаюсь создать виртуальные машины, которые могут видеть друг друга и хост. Они размещаются в qemu/kvm и управляются через libvirt. Сетевой адаптер виртуальных машин создается с помощью macvtap(режим VEPA) для повышения производительности.

После включения функции « hairpin через коммутатор» с потоком одноадресной рассылки все в порядке, независимо от того, находятся ли они между виртуальными машинами или между виртуальной машиной и хостом.

Однако, когда дело доходит до многоадресной рассылки, я сталкиваюсь с проблемой. Я считаю, что хост не может ping6 каждой виртуальной машины. С tcpdump я наблюдаю, что пакет запроса соседей на адрес многоадресной рассылки ff02::1:ff00:212 от хоста не получен моей виртуальной машиной , чей адрес ipv6 - 2001:da8:a0:600::212/64 . Очевидно, этот многоадресный пакет должен был быть передан в виртуальную машину macvtap.

В результате проблемы многоадресной рассылки все пакеты ipv6 теряются, так как Neighbor Discovery не может работать должным образом.

Я уверен, что с коммутатором ничего не происходит, потому что когда я запускаю tcpdump через физический сетевой адаптер, я могу видеть запрос соседей два раза в секунду, один выход, один вход.

После того, как я установил интерфейс macvtap на хосте в случайный режим, виртуальная машина получает пакет запроса соседей вместе с некоторым другим многоадресным пакетом, который должен быть отфильтрован по macvtap, но не одноадресным пакетом для другой виртуальной машины, даже когда я отправляю ping6 другим виртуальным машинам на хозяин одновременно.

Так что я думаю, что включение беспорядочного режима на всех интерфейсах Macvtap - приемлемый обходной путь, но не изящный.

Весь мой хост и виртуальная машина - CentOS 7.0. Я пытался установить kernel-ml(linux 4.1.3) от elrepo на моем хосте, но это не имеет значения.

Так:

  1. Как я могу установить все интерфейсы Macvtap в случайный режим каждый раз, когда он запускается libvirt?
  2. Я не знаком с сетевым драйвером. Но, согласно http://www.makelinux.net/ldd3/chp-17-sect-14, я подозреваю, что в драйвере macvlan есть некоторые ошибки, из-за которых ядро не может правильно настроить список многоадресной рассылки интерфейса , Однако в linux/driver/net/{macvlan.c, macvtap.c} нет set_multicast_list. Где найти правильное место для поиска помощи?

Смотрите также: https://bugzilla.redhat.com/show_bug.cgi?id=1035253

5 ответов5

2

Macvlan в libvirt получил поддержку многоадресной рассылки. К сожалению, по умолчанию это отключено, с помощью trustGuestRxFilters=no , и в документации не указано, что это нарушает многоадресную передачу и, следовательно, IPv6.

https://bugzilla.redhat.com/show_bug.cgi?id=1035253#c15

IMO естественная модель - разрешить многоадресную передачу по умолчанию. macvlan позволяет в любом случае подделывать MAC-адреса, а также отправлять их по адресам многоадресной рассылки. Блокировка многоадресного приема (но не передачи) в сети, к которой, как вы думаете, вы напрямую подключены, является неприятным сюрпризом.

1

Ответ Sourcejedi содержит решение, но, возможно, не достаточно явно. Используя "virsh edit", установите атрибут trustGuestRxFilters на сетевом устройстве:

<interface type='direct' trustGuestRxFilters='yes'>

Смотрите документацию libvirt. То же самое можно сделать для всех интерфейсов в сети libvirt.

0

Я нашел решение, хотя я не совсем уверен, является ли оно полностью правильным.

Настройте ловушку libvirt, в которой вы включаете ALLMULTI после запуска домена qemu.

/ И т.д. / Libvirt / крюк / QEMU

#!/bin/bash

if [ "$2" == "started" ]; then
 timestamp=$(date +"%Y-%m-%d %H:%M:%S")
 exists=$(ifconfig | grep macvtap0 | wc -l)

 if [ "$exists" -gt "0" ]; then
   ifconfig macvtap0 allmulti
   echo "$timestamp ALLMULTI set on macvtap0" >> /var/log/libvirt_hook_qemu.log
 fi
fi

У меня работает скрипт на Ubuntu 14.04.3 + KVM/libvirt.

0

столкнулся с той же проблемой с Macvtap. Я нашел способ исправить это, но я не знаю, как автоматизировать это в virsh. sudo ip link set dev macvtap0 allmulticast on

0

Это действительно зло, но если вы не хотите включать многоадресную рассылку, похоже, это работает на хосте:

bridge fdb add 33:33:ff:<lower 24 bits of v6 address> dev <macvtap if>

(разрешает прием только группы многоадресной рассылки запрашиваемого узла для определенного адреса v6)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .