在 Windows 和 WSL 应用程序之间共享网络

Woo*_*man 4 windows ubuntu networking windows-subsystem-for-linux

我在 WSL 之上使用 Windows 10 和 Ubuntu。Eclipse 和 Code 等工具作为传统 Windows 应用程序运行。我开发的服务器在 WSL 上运行;他们推出 Tomcat 和 NodeJS 服务器。问题是 Windows 看不到 Ubuntu 端口,并且 WSL 看不到 Windows 服务。

我相信 WSL 启动时就好像它是一台单独的机器一样,因此端口不同。是否可以让它共享主机网络?理想情况下,如果我在 Window 控制台中运行 netstat,我会看到 Tomcat 和 Node 服务器在 WSL 下启动,反之亦然。如果没记错的话,如果我使用 VirtualBox 将 Ubuntu 作为虚拟机运行,这是可能的。

我对 Docker 有类似的问题,但在这种情况下,我对非 Docker 相关服务特别感兴趣。

跟进:根据以下问题,我有 WSL 2:

wsl -l -v 名称状态版本 * Ubuntu-20.04 正在运行 2 openSUSE-Leap-15-1 已停止 2 docker-desktop-data 正在运行 2 fedoraremix 已停止 2 docker-desktop 正在运行 2

Not*_*1ds 7

听起来您正在运行 WSL2,因为正如 Woodsman 在评论中提到的,在 WSL1 下运行的网络服务似乎在 Windows 主机网络本身上运行。

在 WSL2 中,实例在 Hyper-V VM 中运行,该 VM 具有在 Windows 主机后面进行 NAT 的虚拟 NIC。但是,Windows 主机本身应该可以通过 直接访问实例中运行的服务localhost。WSL 似乎会执行一些自动端口转发,但仅限于从本地 Windows 主机到 WSL 实例。

换句话说,本地网络上的其他计算机将看不到 WSL 网络服务,除非您按照有关该主题的 Github 线程中的评论进行一些端口转发(和防火墙规则) 。同样,只有当您尝试从网络上的其他位置(例如您的手机)访问 WSL 网络应用程序时,才需要执行此操作。但是,遵循这些步骤也会产生解决下一个问题的副作用。

这个问题是,localhostWSL 下的自动转发似乎在(至少)几种情况下会崩溃。如果是这种情况,并且您无法通过 访问您的节点或 Tomcat 服务器localhost:port,请参阅此答案以获取建议。很可能很快wsl --shutdown就会解决(即使您已经重新启动)。如果问题再次出现,可能是由于休眠或在启用快速启动功能的情况下关闭/重新启动 Windows(这也会导致“部分”休眠)造成的。

您还提到您无法从 WSL 看到 Windows 网络服务,尽管您给出的示例是 VSCode 和 Eclipse,这对我来说有点不协调,因为它们是编辑器而不是网络应用程序/服务。

但是,例如,假设您在 Windows 上运行 Maria DB,并且您希望从 WSL2 内部访问它。 localhost在这种情况下将不起作用,因为localhost它是 WSL 子系统的虚拟 NIC。为此,请参阅此答案- 简短的总结是尝试 mDNS(mywindowscomputername.local将第一部分替换为您的计算机名称)或通过命令获取 Windows 的主机 IP。当我写下这个答案时我没有意识到这一点(我应该回去编辑它),但windowscomputername.mshome.net据报道也可以工作。