将来自WSL子网的mDNS查询重新路由到Windows主机子网

7

大家好,我是一名程序员/开发人员/网络工程师/DevOps。我在WSL2(Windows 10 2004版本)的环境下遇到了一个关于mDNS/DNS-SD设置的问题。

我在家里有一个非常简单的设置,一个主服务器和一个树莓派,我想激活DNS服务发现功能,以便在我的树莓派上以简单的方式自动发现我的服务器。

使用像dnssd这样的库,甚至自己广播正确的数据,当不使用WSL2时,我可以轻松地使其正常工作。然而,我有一个要求是让它在WSL2上运行,并且这就是事情变得复杂的地方。

由于WSL2正在运行其自己的子网中,广播不再起作用。在子网上使用mDNS只能在该子网上工作。但是 Windows 已经重新路由主机和 WSL 之间的广播流量。

这很容易测试:从我的服务器Ping到依赖于mDNS的Pi的Avahi地址上做一个简单的Ping,它就会起作用。

enter image description here

在屏幕左侧,您可以看到Wireshark在主机网络接口上捕获的流量,在右侧,您可以看到Wireshark在WSL网络接口上捕获的流量。前3行是一个简单的ping:它在WSL上执行,但是这里出现的IP地址(172.28.192.1)不是WSL客户端的IP地址,而是WSL的内部DNS服务器的IP地址。正如您在右侧看到的那样,它被完全重新路由到主机上的IP地址:192.168.0.39

然而,第二个查询是由脚本执行的,具有WSL源IP地址(172.28.204.42),但这个IP地址并没有被重新路由到主机上。

我对网络知识知之甚少,不理解它是如何工作的,以及我如何使WSL在主机上路由我的mDNS查询。一个猜测是它与iptables有关,但我就只能想到这里了。

如果有人知道为什么它在DNS服务器源地址上工作,而当我自己执行时却不起作用,那将对我有很大帮助!

编辑1:WSL路由表 enter image description here


WSL的mDNS服务器是否与WSL主机在同一子网中?如果不同,我想查看WSL路由表。 - Rafael
mDNS服务器位于与WSL(172.x.x.x)相同的子网中,但不在Windows(192.168.x.x)所在的子网中。 - Sisyphe
您已经提供了那个信息,请再次阅读我的问题。 - Rafael
我想我刚刚回答了这个问题 :) 你所说的WSL Host是什么?如果你指的是Windows,那么子网不同。如果你指的是WSL实例,那么它与WSL运行的相同。mDNS服务器是我的自己的代码,并直接在运行于WSL中的Ubuntu发行版中运行。 - Sisyphe
我添加了WSL路由表,如果有帮助的话。 - Sisyphe
1个回答

4
WSL2 Hyper-V网络交换机不作为组播桥。默认情况下,交换机创建一个内部网络。组播数据包仅传递到连接到内部网络的系统,而不传递到其他任何地方。有关Hyper-V网络类型的更多信息,请参见this Nakivo blog post
在第一种情况中,ping触发常规DNS查找,该查找转到解析器——Windows主机。然后,Windows主机在其外部和内部网络上执行mDNS查找。您的数据包转储显示内部查找,但请注意,没有任何响应它。响应通过外部网络发送,并且ping通过常规DNS获得其响应。在第二种情况下,您只执行了mDNS查找。该查找未收到响应,因为它仅适用于内部网络。为了证明mDNS查找在内部网络上起作用,请查找Windows主机的本地地址(MACHINE.local)。它将起作用,因为Windows主机位于内部网络上并且可以响应。
好消息是您可以更改WSL网络类型。
  1. 按下Windows键,输入“Hyper-V Manager”
  2. 右键单击应用程序,并选择“以管理员身份运行”
  3. 在管理器中,在“Hyper-V Manager”下找到您的计算机并单击它
  4. 在操作区域,单击“虚拟交换机管理器…”
  5. 找到WSL开关并单击它
  6. 将连接类型更改为“外部网络”
  7. 点击确定

Hyper-V Manager Screenshot

完成后,请重新启动WSL:

> wsl --shutdown
> wsl -t <distribution-name>
> wsl --distribution <distribution-name>

一旦重新启动,您的虚拟机网络将会中断。您需要使用 ip addr addip route 或类似的方法从外部网络添加 IP 地址和路由。每次启动时,您的发行版几乎肯定会尝试为默认的 WSL 开关设置其网络,因此您可能需要设置配置以在未来添加这个外部网络地址。例如,Ubuntu 20.04 总是在内部网络上添加一个动态地址,无论开关配置如何。

更改网络开关类型很可能会破坏 WSL2 的其他用途(例如 Docker Desktop),原因是 Windows 每次重新启动都会重新创建 Hyper-V 网络开关,因此您的更改只会持续到系统保持运行的时间为止。


我按照您的步骤操作了,但是我的 Hyper-V Switch Manager 中没有现有的虚拟交换机。 - Zciurus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接