routes - 将 mDNS 查询从 WSL 子网重新路由到 Windows 主机子网

标签 routes windows-subsystem-for-linux subnet mdns dns-sd

嘿,程序员/开发人员/网络人员/Devops/...

我对 mDNS 有疑问/DNS-SD在 WSL2 的上下文中设置(Windows 10 2004 版本)

我在家里有一个非常简单的设置,有一个主服务器和一个 Raspberry Pi,我想激活 DNS 服务发现,从而让我有一种简单的方法来自动发现我的 Raspberry PI 上的服务器。

使用像 dnssd 这样的简单库,甚至自己广播正确的数据,我设法使它在不使用 WSL2 时轻松工作。
但是我需要让它在 WSL2 上工作,这就是事情变得复杂的地方。

由于 WSL2 在其自己的子网上运行,因此广播不再起作用。在子网上使用 mDNS 仅适用于该子网。
但是,Windows 已经重新路由主机和 WSL 之间的一些广播流量。

这很容易测试:做一个简单的Ping从我的服务器到依赖于 mDNS 工作的 Pi 的 Avahi 地址。

enter image description here

在屏幕左侧,您可以看到 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 路由表
enter image description here

最佳答案

WSL2 Hyper-V 网络交换机不充当多播网桥。默认情况下,交换机会创建一个内部网络。多播数据包仅传送到连接到内部网络的系统,而不传送到内部网络之外的任何系统。有关 Hyper-V 网络类型的更多信息,请参见 this Nakivo blog post .

在您的第一种情况下,ping 触发了常规 DNS 查找,该查找转到解析器 - Windows 主机。然后,Windows 主机在其外部和内部网络上执行 mDNS 查找。您的数据包转储显示内部查找,但请注意没有任何响应。响应来自外部网络,而 ping 通过常规 DNS 获得响应。在第二种情况下,您只执行 mDNS 查找。该查找没有收到任何响应,因为它只进入内部网络。为了证明 mDNS 查找在内部网络上有效,请查找 Windows 主机的本地地址 (MACHINE.local)。它会起作用,因为 Windows 主机在内部网络上并且可以响应。

好消息是您可以更改 WSL 网络类型。

  • 点击您的 Windows 键并输入“Hyper-V 管理器”
  • 右键单击应用程序并选择“以管理员身份运行”
  • 在管理器中,在“Hyper-V 管理器”下找到您的机器并单击它
  • 在“操作”区域中,单击“虚拟交换机管理器...”
  • 找到 WSL 开关并单击它
  • 将连接类型更改为“外部网络”
  • 点击确定

  • Hyper-V Manager Screenshot

    完成此操作后,重新启动 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/

    相关文章:

    ubuntu - 使用 Ubuntu : error while loading shared libraries: libgmp. so.3 在 wsl 上配置安装 GHC 版本 7.6.3 时出错:

    amazon-web-services - 为什么 AWS RDS 子网组需要多个可用区?

    php - 如何获取子网中的每个IP地址?

    javascript - React router 3 无法渲染

    javascript - 单击按钮导航至路线

    x11 - 通过 WSL2 运行 Linux GUI 应用程序

    java - SubnetUtils isInRange 方法返回 True - 误报问题

    javascript - 在 $state.go 上禁用转换

    node.js - 快速路由 - 未经授权的错误处理程序挂起错误路由

    ubuntu - InfluxDB:无法识别的服务