嘿,程序员/开发人员/网络人员/Devops/...
我对 mDNS
有疑问/DNS-SD
在 WSL2 的上下文中设置(Windows 10 2004 版本)
我在家里有一个非常简单的设置,有一个主服务器和一个 Raspberry Pi,我想激活 DNS 服务发现,从而让我有一种简单的方法来自动发现我的 Raspberry PI 上的服务器。
使用像 dnssd 这样的简单库,甚至自己广播正确的数据,我设法使它在不使用 WSL2 时轻松工作。
但是我需要让它在 WSL2 上工作,这就是事情变得复杂的地方。
由于 WSL2 在其自己的子网上运行,因此广播不再起作用。在子网上使用 mDNS 仅适用于该子网。
但是,Windows 已经重新路由主机和 WSL 之间的一些广播流量。
这很容易测试:做一个简单的Ping
从我的服务器到依赖于 mDNS 工作的 Pi 的 Avahi 地址。
在屏幕左侧,您可以看到 Wireshark 在主机网络接口(interface)上捕获的流量,在右侧,您可以看到 Wireshark 在 WSL 网络接口(interface)上捕获的流量。
前 3 行是一个简单的 ping:它是在 WSL 的上下文中执行的,但是这里出现的 IP 地址 - 172.28.192.1
- 不是 WSL 客户端的 IP 地址,而是 WSL 内部 DNS 服务器的 IP 地址。如右图所示,它在主机上完美地重新路由,Windows 主机的 IP 地址为:192.168.0.39
但是,由脚本执行的第二个查询具有 WSL 源 IP (172.28.204.42
),并且此查询不会在主机上重新路由。
我的网络知识非常有限,我不明白这是如何工作的,以及如何让 WSL 在主机上路由我自己的 mDNS 查询。一个疯狂的猜测是它与 iptables 有关,但就我而言。
如果有人知道它为什么在 DNS 服务器源地址上工作而不是当我自己执行它时,它会对我有很大帮助!
编辑 1:WSL 路由表
最佳答案
WSL2 Hyper-V 网络交换机不充当多播网桥。默认情况下,交换机会创建一个内部网络。多播数据包仅传送到连接到内部网络的系统,而不传送到内部网络之外的任何系统。有关 Hyper-V 网络类型的更多信息,请参见 this Nakivo blog post .
在您的第一种情况下,ping 触发了常规 DNS 查找,该查找转到解析器 - Windows 主机。然后,Windows 主机在其外部和内部网络上执行 mDNS 查找。您的数据包转储显示内部查找,但请注意没有任何响应。响应来自外部网络,而 ping 通过常规 DNS 获得响应。在第二种情况下,您只执行 mDNS 查找。该查找没有收到任何响应,因为它只进入内部网络。为了证明 mDNS 查找在内部网络上有效,请查找 Windows 主机的本地地址 (MACHINE.local)。它会起作用,因为 Windows 主机在内部网络上并且可以响应。
好消息是您可以更改 WSL 网络类型。
完成此操作后,重新启动 WSL:
> wsl --shutdown
> wsl -t <distribution-name>
> wsl --distribution <distribution-name>
重新启动后,您的客人的网络将中断。您需要使用
ip addr add
从外部网络添加 IP 地址和路由。和 ip route
或类似的东西。您的发行版几乎肯定会在每次启动时尝试为默认 WSL 交换机设置其网络,因此您可能需要设置配置以在将来添加此外部网络地址。例如,Ubuntu 20.04 总是在内部网络上添加一个动态地址,而不管交换机配置如何。出于同样的原因,对网络交换机类型进行更改可能会破坏 WSL2 的其他用途(例如 Docker Desktop)。 Windows 每次重新启动时都会重新创建 Hyper-V 网络交换机,因此您的更改只会在您的系统保持正常运行时持续。
关于routes - 将 mDNS 查询从 WSL 子网重新路由到 Windows 主机子网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62108116/