shixudong@163.com
在《WSL2和VPN》一文后话中,简单提了一下WSL2(mirrored)在支持multicast方面的不足,当时并没有开展进一步的深入研究。近日在github上看到多篇issues(10735、12344)在讨论WSL2的组播问题,特别是WSL2(mirrored)和Windows主机之间无法进行组播通信,遂静下心来做了一番功课,得以形成此文。
一、WSL2的组播支持
WSL2新增mirrored模式,号称支持multicast,但无论是mirrored、bridged还是nat,三者其实都使用同一个Linux内核,对多播的支持在内核层面是无差别的。只是由于网络层面的不同,导致了三种模式对多播的支持程度有所差异而已。
在外部设备看来,nat模式下,组播包无法被转发出去,可认为WSL2(nat)不支持multicast;Mirrored和Bridged模式对多播的支持程度基本上是一样的,只是WSL2一直想要废弃bridged模式,所以才有mirrored模式号称支持多播一说。
由于WSL2官方内核CONFIG_IP_MULTICAST is not set,导致WSL2无法发送组播加入信息。虽然WSL2仍可以发送组播数据包,但是当网络上有IGMP查询器,并且switch/bridge启用了IGMP snooping后,因为没有收到WSL2的组播加入信息,switch/bridge压根不会将WSL2希望接收的组播包发送到Windows主机,导致WSL2无法接收外部设备发来的组播包。
对于这一情形,有两种解决方法可以让WSL2能够正常接收外部设备发来的组播包。
1、由Windows主机代为发送WSL2需要的组播加入信息。
2、使用CONFIG_IP_MULTICAST=y重新编译WSL2内核,支持WSL2发送组播加入信息。
二、WSL2(bridged)的组播优势和不足
WSL2(bridged)使用与主机不同的IP和MAC,WSL2和Windows主机之间的组播通信,与WSL2和外部设备之间的组播通信没有区别。而且由于WSL2和Windows主机之间的组播通信无需经过外部switch/bridge,故WSL2(bridged)无需使用CONFIG_IP_MULTICAST=y重新编译也能接收Windows主机发来的组播包。
对于WSL2(bridged),即使外部switch/bridge没有启用IGMP snooping功能,依然有两种例外情形会导致WSL2无法接收外部设备发来的组播包:
1、WSL2桥接到Windows主机的无线网卡,在WSL2内核CONFIG_IP_MULTICAST=y时,WSL2能够发送组播加入信息,有些无线AP识别到该组播加入信息后,能自动启用multicast_to_unicast功能,发往Windows主机的组播包被转换为以主机无线网卡MAC为目标的单播包,由于Windows网桥驱动功能太烂,不能依据三层组播IP对multicast_to_unicast进行逆转换,将单播目标MAC恢复成组播目标MAC,导致WSL2(bridged)反而无法接收组播包(Vmware桥接主机无线网卡时也有同样的问题,VirtualBox桥接可根据三层组播IP对multicast_to_unicast进行逆转换,不存在类似缺陷)。
2、如WSL2桥接的主机无线网卡固件具有multicast filter特性,由于WSL2无法向主机无线网卡添加多址过滤条件,主机无线网卡也会主动拦截外部发给WSL2的组播包。
针对例外情形1,首选办法就是使用CONFIG_IP_MULTICAST is not set的官方内核,不让WSL2发出组播加入信息,也不要让Windows主机代为发送WSL2需要的组播加入信息;或者通过防火墙拦截Windows主机或WSL2发出的组播加入信息。此时无线AP不会启用multicast_to_unicast功能,外部设备发来的组播包能顺利被WSL2接收。
针对例外情形2,理论上的解决思路是让Windows主机也加入到WSL2接收组播包所需要的同一个组播组,此时将由Windows主机向自身无线网卡添加多址过滤条件,放行WSL2需要的组播包。该思路看起来很美妙,然而却和例外情形1相冲突,因为只要Windows主机加入到同一个组播组,必然会发送组播加入信息,触发无线AP自动启用multicast_to_unicast功能,导致WSL2无法接收组播包。因此还需要同时通过防火墙拦截Windows主机或WSL2发出的组播加入信息,方能保证WSL2顺利接收外部设备发来的组播包。
当网络上switch启用了IGMP snooping,针对WSL2桥接到主机无线网卡的情形,如无线AP能自动启用multicast_to_unicast功能,WSL2(bridged)接收外部设备组播包的问题目前无解,但可以采用WSL2(mirrored)解决。
三、WSL2(mirrored)的组播优势和不足
对于WSL2(mirrored)来说,在和主机无线网卡配合使用时,由于使用了和主机无线网卡相同的MAC,依然可以顺利接收外部设备通过无线AP发来的multicast_to_unicast组播包,不存在类似WSL2(bridged)的瑕疵。
在不考虑WSL2和Windows主机之间相互组播通信时,显然WSL2(mirrored)对组播的支持更胜