Wie kann ich dafür sorgen, dass mein Libvirt/KVM-Gast den gesamten IPv4/UDP-Multicast-Verkehr sieht?

Wie kann ich dafür sorgen, dass mein Libvirt/KVM-Gast den gesamten IPv4/UDP-Multicast-Verkehr sieht?

Ich habe ein Problem mit IPv4/UDP-Multicast-Verkehr, der innerhalb eines KVM-Gasts nicht vollständig sichtbar ist.

Der Gast verfügt über eine dedizierte Netzwerkkarte, die über MacVTap angeschlossen ist. Sowohl das Host-Betriebssystem als auch das Betriebssystem des Gasts sind Ubuntu 18.04. Dies ist die Netzwerkkonfiguration der VM:

 <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>

(Beachten Sie, dass ich die tatsächliche MAC-Adresse verschleiert habe.)

Seit ich aktiviert habe trustGuestRxFilters, funktioniert mDNS einwandfrei. Es gibt jedoch immer noch bestimmten Multicast-Verkehr, den ich nicht sehen kann.

Dies ist der Befehl, der den problematischen UDP-Multicast-Verkehr generiert:

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

Dadurch entsteht ein konstanter Videostream von ca. 400 KB/s. Ich verwende hier bewusst Multicast, damit mehrere Hosts im Netzwerk den Stream abspielen oder aufnehmen können (ohne dass der per WLAN verbundene Quellrechner mehrere Streams senden muss). Der Host im KVM-Gast soll den Stream analysieren und aufzeichnen, wenn es Bewegungen im Video gibt.

Hier ist das Problem:Alle Hosts, diedirektmit dem Netzwerk verbunden (= kein KVM-Gast) kann den UDP-Verkehr empfangen, sogar der KVM-Host selbst. Der KVM-Gast kann dies jedoch nicht – er sieht nur sehr wenige Pakete:

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

Das sind definitiv nicht genug Pakete für einen 20 Sekunden langen Videostream mit 400 KB/s. Wenn ich dasselbe auf einem anderen Host mache, der direkt verbunden ist, erhalte ich die erwarteten Ergebnisse:

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

Das Betriebssystem auf dem KVM-Host ist Ubuntu 18.04. QEMU-Version:

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

Irgendeine Idee, was den KVM-Gast daran hindert, den gesamten Datenverkehr zu sehen?

Antwort1

Vielleicht rnxrx' Antwortkönnte helfen?

ip link set dev macvtap*n* allmulticast on

verwandte Informationen