我遇到了 IPv4/UDP 多播流量在 KVM 客户机中无法完全可见的问题。
客户机具有使用 MacVTap 连接的专用 NIC。主机操作系统和客户机中的操作系统均为 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 地址。)
自从我启用后trustGuestRxFilters
,mDNS 工作正常。但是,仍有一些多播流量我看不到。
这是生成有问题的 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 KB/s 的恒定视频流。我特意在这里使用多播,这样网络上的多个主机就可以播放或录制视频流(无需通过 WiFi 连接的源计算机发送多个视频流)。KVM 客户机中的主机应该分析视频流,并在视频出现移动时进行录制。
问题如下:所有主机直接地连接到网络(= 非 KVM 客户端)的客户端可以接收 UDP 流量,甚至 KVM 主机本身也可以。但是,KVM 客户端无法接收 UDP 流量,因为它只能看到很少的软件包:
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
对于运行 20 秒的 400 KB/s 视频流来说,这些数据包绝对不够。当我在直接连接的另一台主机上执行相同操作时,我确实得到了预期的结果:
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