WSL2 使 Ubuntu 中的所有 Windows 网络适配器可用/可见

Dmy*_*Huz 7 networking windows ubuntu wsl2

我有安装了 WSL2 的 Windows 10。在 WSL2 中,我有一个 Ubuntu。我需要使用物理 PC 中的不同适配器直接从 Ubuntu 工作,并可以从 Windows 访问它们。但在 WSL2 中我只有一个虚拟适配器。并且运行时看不到其他适配器ifconfig -a。有没有办法让 Ubuntu 中的所有 Windows 网络适配器可用/可见?

用例:我的电脑带有许多物理连接到不同设备的适配器。我需要向这些设备发送信号(请求)。

Not*_*1ds 8

正如您所看到的,WSL1 为您提供了 Windows 接口到“Linux 接口”的更好映射,但了解 WSL1 和 WSL2 在这方面的差异非常重要:

  • 在 WSL1 下,当 Linux 应用程序调用 Linux API 时,WSL1 负责尝试将其映射到 Windows API。因此,当ifconfig(或ip) 尝试调用getifaddrs来获取可用接口时,WSL1 会出现在Windows内核知道的列表中。

  • 另一方面,WSL2 在虚拟化环境(Hyper-V 的子集)中运行真正的 Linux 内核。这里getifaddrs列举了虚拟机向 Linux 内核提供的接口。

两者各有优点和缺点:

  • WSL1 中最大的问题是您可以使用这些接口执行的操作非常有限。Microsoft 的 Windows->Linux API 映射仅在涉及硬件时才如此深入。

    例如,即使是像打开或关闭界面这样非常基本的任务也行不通。例如sudo ip link set wifi0 down总会回来RTNETLINK answers: Operation not permitted。您不能将接口置于混杂模式、运行 WireShark 或类似的操作。

  • 当然,WSL2 的虚拟化意味着您在调用 Linux 命令时甚至看不到 Windows 界面。另一方面,您可以完全访问虚拟接口。

根据您的用例,您可能有一些 WSL2 可能性。您在评论中提到(希望迁移到问题本身),您安装了多个接口,每个接口都连接到不同的端点设备。

最简单的方案(如果适合您)就是为 Windows 中的每个接口分配不同的子网,并依靠 Windows 路由表根据设备的 IP 地址处理发往设备的数据包。WSL2 中的虚拟接口应该“正常工作”并将数据包发送到 Windows 主机以进行正确的路由。

如果这不起作用,请查看socat另一种选择。有一个可用的 Windows 版本(尽管我还没有尝试过),以及大多数发行版中都提供的标准 Linux 版本。我已经成功地在 WSL2 中创建了映射到其他端点的 TAP/TUN 设备,尽管我已经有一段时间没有这样做了,而且不太记得我脑子里的细节。理论上,您可以socat在 WSL2 上运行的包和 Windows 主机本身上运行的包之间进行调整,以适应更复杂的用例。

虽然它不是您的用例的一部分,但我会向可能阅读本文的其他人提及这一点,因为它与问题相关。如果出于某种原因需要在 WSL(1 或 2)内执行诸如启用或禁用 Windows 界面之类的操作,请考虑通过powershell.exe. 例如:

powershell.exe -c "Disable-NetAdapter  -name 'Wi-Fi'"
Run Code Online (Sandbox Code Playgroud)

请注意,这需要在 UAC 提升的终端中完成,因为 WSL 无法执行 Windows 用户无法执行的任何操作(即使是作为 root 执行)。另请注意,在 UAC 提升的会话中,您可能需要指定powershell.exe.

最后,我这么说只是因为我最近看到一些人对 WSL 的限制持批评态度,我不认为这些是 WSL 的限制。如果在 VMWare、VirtualBox 或任何其他虚拟化环境下运行,您会遇到与虚拟接口相同的问题。恕我直言,WSL 为我们提供了比其他虚拟化环境更多的选择,至少可以尝试处理这个问题。