我正在尝试创建可以看到彼此和主机的虚拟机。它们由 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) 但它没有区别。
所以: