如何从windows访问linux子系统的localhost

pee*_*srj 45 networking windows-subsystem-for-linux

我正在使用 Windows 10,并且将 ubuntu 16.04 安装为 linux 子系统。我在端口 4567 上运行 Rails 应用程序,我想从 Windows 访问它。

我知道一种使用 ip 地址的方法,但ifconfig没有用。(我试过跑步/sbin/ifconfig)。这将输出警告为, Warning: cannot open /proc/net/dev (No such file or directory). Limited output.

我在互联网上搜索,遇到了这个悬而未决的问题。那么有没有其他可行的解决方案呢?

Owe*_*ain 55

这个问题的答案出奇的简单,这就是为什么搜索没有给你正确的结果。

WSL 所做的只是在 Linux 应用程序和 Windows 内核之间提供一个转换层,非常类似于 Wine 在 Linux 上的工作方式。因此,Ubuntu 系统的一些核心部分并不存在,网络就是其中之一。WSL 将 Linux 系统调用转换为 Windows 系统调用,因此 Ubuntu 网络数据流经与 Windows 数据完全相同的 TCP/IP 堆栈。

简而言之,这意味着访问 Linux localhost 您只需访问 windows 本地主机,它们是相同的。localhost:4567或者127.0.0.1:4567会做你想做的。

顺便说一句,我一直在 WSL 上使用导轨,它似乎工作得很好,除了摇摆和聆听宝石不能很好地发挥作用,我不得不禁用它们。

  • 它确实有效:) 在其上安装了 Ubuntu、Nginx,启动了 Nginx,现在我可以在 Windows 上打开 http://localhost/ :) 谢谢 (4认同)

Dar*_*ryn 15

我需要从 LAN 中的另一台设备访问我的 WSL 托管端口
(例如用于移动开发),我发现 @Owen Tourlamain 的回答对此没有帮助。

我需要设置portproxy,而且我发现,使用connectaddress=localhostconnectaddress=127.0.0.1不是为我工作(WSL2时,Windows 10 20H2)。

所以我仍然需要 OP 的问题的答案,事实证明它非常简单:

  1. 启动 WSL
  2. wsl hostname -I
    
    Run Code Online (Sandbox Code Playgroud) 输出如: 172.10.200.10

注意:
如果您在 powershell 命令中使用内联空格,则必须修剪空格,例如:

netsh interface portproxy add v4tov4 listenport=19000 listenaddress=0.0.0.0 `
    connectport=19000 connectaddress=$($(wsl hostname -I).Trim());
Run Code Online (Sandbox Code Playgroud)

  • netsh interface portproxy 删除 v4tov4 Listenport=19000 ListenAddress=0.0.0.0 供有需要的人使用 (3认同)

Not*_*1ds 9

今天通过另一个答案提出了一个老问题,所以我插话一下。这个问题最初是针对 WSL1 提出的。虽然 WSL2 的“答案”相同,但仍存在一些需要解决的细微差异。

首先,在 WSL1 上,正如 2016 年最初接受的答案提到的那样,网络实际上是在 Windows 主机接口上运行的。这就是localhost/ 127.0.0.1(或 Windows NIC 的地址)在那里工作的原因。

另一方面,WSL2 运行虚拟化,因此网络接口是一个 vNIC,其地址与 Windows 主机的地址不同。该网络实际上是在 Windows 主机后面进行 NAT 的。这也是为什么您可以使用网络上另一台计算机的 Windows IP 地址访问 WSL1 实例,但使用 WSL2 则不行。

但 WSL2 确实有一个称为“本地主机转发”的功能,这使得它像 WSL1 for localhost/一样工作127.0.0.1。此功能默认打开,但可以禁用(尽管老实说,我不知道这样做的任何原因)。

此功能允许您访问服务(例如本问题中的 Rails 应用程序)。如果 Windows NIC 上未使用该端口,则 WSL2 会将 localhost 请求自动转发到 WSL2 vNIC 上的同一端口。

那么一切都很好,您可以通过 访问 WSL1 和 WSL2 服务localhost,对吧?

不幸的是,没那么快。有时,正如其他两个答案所提到的,localhostForwarding“中断”。我们已经确定了两个非常常见(且相关)的用例,其中会发生这种情况:

  • 当主机 Windows 休眠时。
  • 当主机 Windows 开机时,使用 Windows“快速启动”功能,该功能默认启用。此功能使用一种休眠形式。

解决办法是:

  • 尽可能不要冬眠
  • 关闭快速启动。您可以在控制面板中找到它。导航到硬件和声音->电源选项->更改电源按钮的功能
  • 如果您确实发现自己处于该功能无法正常工作的情况,正如 @AhmetK 的回答所提到的,您通常可以通过以下方式恢复本地主机转发:
    • 退出所有正在运行的 WSL 实例
    • 发出wsl --shutdown(从 PowerShell、CMD,甚至开始菜单)。虽然完全重新启动 Windows 会产生相同的效果,但速度wsl --shutdown要快得多。
    • 重新启动您的 WSL 实例并运行服务/应用程序。

参考这个 SO 答案的评论,这些评论已经确认了问题和解决方案。