大家好,我是一名程序员/开发人员/网络工程师/DevOps。我在WSL2(Windows 10 2004版本)的环境下遇到了一个关于mDNS/DNS-SD设置的问题。
我在家里有一个非常简单的设置,一个主服务器和一个树莓派,我想激活DNS服务发现功能,以便在我的树莓派上以简单的方式自动发现我的服务器。
使用像dnssd这样的库,甚至自己广播正确的数据,当不使用WSL2时,我可以轻松地使其正常工作。然而,我有一个要求是让它在WSL2上运行,并且这就是事情变得复杂的地方。
由于WSL2正在运行其自己的子网中,广播不再起作用。在子网上使用mDNS只能在该子网上工作。但是 Windows 已经重新路由主机和 WSL 之间的广播流量。
这很容易测试:从我的服务器Ping到依赖于mDNS的Pi的Avahi地址上做一个简单的Ping
,它就会起作用。
在屏幕左侧,您可以看到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服务器源地址上工作,而当我自己执行时却不起作用,那将对我有很大帮助!