Как сделать так, чтобы гостевая система libvirt/KVM видела весь многоадресный трафик IPv4/UDP?

Как сделать так, чтобы гостевая система libvirt/KVM видела весь многоадресный трафик IPv4/UDP?

У меня возникла проблема с тем, что многоадресный трафик IPv4/UDP не полностью виден из гостевой системы KVM.

У гостя есть выделенная сетевая карта, которая подключена с помощью MacVTap. И хостовая ОС, и ОС в гостевой ОС — Ubuntu 18.04. Это сетевая конфигурация виртуальной машины:

 <interface type='direct' trustGuestRxFilters='yes'>
   <mac address='XX:XX:XX:XX:XX:XX'/>
   <source dev='enp1s0f1' mode='passthrough'/>
   <model type='virtio'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
 </interface>

(Обратите внимание, что я скрыл реальный MAC-адрес.)

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

Это команда, которая генерирует проблемный многоадресный трафик UDP:

raspivid -ae 40,0xff -a 1036 -t 0 -w 1280 -h 720 -ih -fps 30 -mm spot \
  -o udp://239.255.0.1:5000

Это создает постоянный видеопоток примерно 400 КБ/с. Я намеренно использую многоадресную передачу, чтобы несколько хостов в сети могли воспроизводить или записывать поток (без необходимости отправки нескольких потоков исходным компьютером, подключенным через WiFi). Хост в гостевой системе KVM должен анализировать поток и записывать его всякий раз, когда в видео есть движение.

Вот в чем проблема:Все хосты, которые естьнапрямуюподключенный к сети (= не гостевой KVM) может получать трафик UDP, даже сам хост KVM. Однако гостевой KVM не может — он видит только очень мало пакетов:

sudo timeout 20 tcpdump -i ens3 host 239.255.0.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
20:53:10.361355 IP vogelhaus.internal.example.com.48146 > 239.255.0.1.5000: UDP, length 4096
#
# omitted 5 lines
#
20:53:12.081881 IP vogelhaus.internal.example.com.48146 > 239.255.0.1.5000: UDP, length 4096

7 packets captured
16 packets received by filter
9 packets dropped by kernel

Это определенно недостаточно пакетов для видеопотока 400 КБ/с, работающего в течение 20 секунд. Когда я делаю то же самое на другом хосте, который подключен напрямую, я получаю ожидаемые результаты:

sudo timeout 20 tcpdump -i enp1s0f0 host 239.255.0.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp1s0f0, link-type EN10MB (Ethernet), capture size 262144 bytes
20:54:41.264709 IP vogelhaus.internal.example.com > 239.255.0.1: udp
#
# ... many, many more! ...
#
20:55:00.912257 IP vogelhaus.internal.example.com > 239.255.0.1: udp
20:55:00.912446 IP vogelhaus.internal.example.com.48146 > 239.255.0.1.5000: UDP, bad length 4096 > 1472

7205 packets captured
7231 packets received by filter
26 packets dropped by kernel

Операционная система на хосте KVM — Ubuntu 18.04. Версия QEMU:

QEMU emulator version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.21)

Есть идеи, что мешает гостю KVM видеть весь трафик?

решение1

Может быть ответ rnxrxмогли бы помочь?

ip link set dev macvtap*n* allmulticast on

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