如何配置 macvtap 让它正确传递多播数据包?

Giv*_*n92 5 linux linux-kvm libvirt centos-7

我正在尝试创建可以看到彼此和主机的虚拟机。它们由 qemu/kvm 托管并通过 libvirt 进行管理。VM 的网络适配器使用 macvtap(VEPA 模式)创建以提高性能。

启用hairpinover switch后,无论是在VM之间还是在VM与Host之间,单播流都可以。

但是,当谈到多播时,我遇到了问题。我发现主机无法 ping6 每个虚拟机。使用 tcpdump,我观察到ff02::1:ff00:212从主机发送到多播地址的 Neighbor Solicitation 数据包没有被我的 VM 收到,其 ipv6 地址是2001:da8:a0:600::212/64. 显然,这个多播数据包应该已经通过 macvtap 传递给 VM。

由于组播问题,所有 ipv6 数据包丢失,邻居发现无法正常工作。

我确定交换机没有任何问题,因为当我通过物理网络适配器运行 tcpdump 时,我可以每秒看到两次 Neighbor Solicitation,一次出,一次进。

在我将主机上的 macvtap 接口设置为混杂模式后,VM 获得 Neighbor Solicitation 数据包以及其他一些应由 macvtap 过滤的多播数据包,但没有到其他 VM 的单播数据包,即使我 ping6 其他 VM 上的同时主持。

所以我认为在所有 macvtap 接口上启用混杂模式是一种可以接受的解决方法,但并不优雅。

我所有的主机和 VM 都是 CentOS 7.0。我已经尝试在我的主机上从 elrepo 安装 kernel-ml(linux 4.1.3) 但它没有区别。

所以:

  1. 每次由 libvirt 启动时,如何将所有 macvtap 接口设置为混杂模式?
  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

sou*_*edi 8

libvirt 的 macvlan 已获得对多播的支持。不幸的是它被默认设置禁用trustGuestRxFilters="no",并且文档没有明确说明这会破坏多播。正如您所观察到的,破坏多播也会破坏 IPv6。

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

您可以通过手动设置来解决此问题trustGuestRxFilters="yes"。有一个限制:“支持取决于访客网络设备模型,以及主机上的连接类型”。“目前仅支持virtio设备模型和macvtap主机上的连接”。

https://libvirt.org/formatdomain.html#elementsNICS

IMO 的自然模型是默认允许多播。在您认为直接连接的网络上阻止多播接收是一个令人不快的意外。特别是因为macvtap似乎仍然允许发送多播数据包(以及欺骗性 MAC 源地址!)。


小智 5

sourcejedi 的答案包含解决方案,但可能不够明确。使用“virsh edit”,trustGuestRxFilters在网络设备上设置属性:

<interface type='direct' trustGuestRxFilters='yes'>
Run Code Online (Sandbox Code Playgroud)

请参阅libvirt 文档对 libvirt 网络上的所有接口也可以这样做。