linux 是否会丢弃不在同一子网中的多播数据包?

Will linux discard multicast packets that are not in the same subnet?

想通过VXLAN组播搭建overlay网络,实现虚拟机之间的通信,但是发现组播包只能在同一个子网上传输。为了让不在同一子网的主机上的虚拟机可以通信,我在想“捕获并转发数据包”是否可行。即在network1上的hostA上抓取一个目的地址为239.1.1.1、端口为4789的UDP包,发给network2上的hostB,让hostB发送组播包。然后发现network2上的主机都可以用wireshark抓到这个包,但是没有主机对应。我想知道Linux是否有一种机制可以丢弃伪造的多播数据包?如果是这种情况,应该如何防止这种机制?

未处理,多播本质上是广播。对于 IPv4 多播,可以使用 IGMP 减轻广播效应。在具有 semi-intelligent 交换机的交换网络上,可能会有 IGMP 侦听功能来进一步帮助实现这一点。如果存在,end-device 必须通过为给定组发送 IGMP 加入来订阅多播组,以“取消过滤”流向自身的流量。子网之间的路由多播可以使用 PIM 或 DVRMP 实现,甚至是静态多播路由守护进程来完成。

此过滤的唯一例外是 224.0.0.x 范围,它保留用于 link-local 通信,通常是 IETF 协议。绝不能以任何方式过滤流向这些组的流量。

因此,为了防止过滤,终端设备要么加入组(推荐!),要么将流量发送到保留范围内的组,例如在 224.0.0.1 all-hosts 组。 (这很丑陋,您可能会在 LAN 中的设备上触发丑陋的错误,但它确实有效。)