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

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

我使用的是 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.

我在网上搜索,发现了这一悬而未决的问题.那么有没有其他可行的解决方案呢?

答案1

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

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

简而言之,这意味着要访问 Linux 本地主机,您只需访问 Windows 本地主机,它们是相同的。localhost:4567或者127.0.0.1:4567将执行您想要的操作。

顺便说一句,我一直在 WSL 上使用 rails,它似乎运行完美,只是 swing 和 listen gems 播放得不太好,我不得不禁用它们。

答案2

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

我需要设置portproxy,我发现使用connectaddress=localhostconnectaddress=127.0.0.1不是适合我(WSL2,Windows 10 20H2)。

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

  1. 启动 WSL
  2. wsl hostname -I
    
    输出如下:172.10.200.10

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

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

从网络访问 WSL

OP 询问如何“从 Windows”访问 WSL。如果您还想“从您的私有网络”访问它,您还需要一次制定允许特定端口(或端口范围)的防火墙规则。

⚠️警告:不要打开Windows防火墙“离开”. 制定规则仅打开您需要的特定端口。

(以管理员身份运行 powershell)

New-NetFireWallRule -Profile Private -DisplayName 'MyRule ports for LAN development' `
    -Direction Inbound -LocalPort 19000-19006 -Action Allow -Protocol TCP

笔记:

  • -LocalPort 19000-1900619000-19006←用您需要的端口替换。
  • -Profile Private这样端口就只对你标记为“私有”的网络开放
  • -Direction Inbound仅表示入站(入口)
  • -DisplayName 'MyRuleName blah blah...'是适合您的、人性化的名称。但请选择您能记住的名称,因为您可以在将来使用此名称查找规则、查看其状态或删除它。例如Get-NetFirewallRule | Where-Object {$_.DisplayName -Match "MyRuleName.*"}

答案3

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

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

另一方面,WSL2 以虚拟化方式运行,因此网络接口是一个具有不同的地址比 Windows 主机的地址要大。该网络实际上是在 Windows 主机后面进行 NAT 的。这也是为什么你可以使用 Windows IP 地址从其他网络上的机器,但 WSL2 却不行。

但 WSL2 确实有一个称为“localhost 转发”的功能,这使得它像 WSL1 一样工作localhost127.0.0.1此功能默认启用,但可以禁用(尽管老实说,我不知道这样做的理由)。

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

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

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

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

解决方案是:

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

参考评论这个答案已确认问题及解决方案。

答案4

工作正常一段时间后,我在安装 Docker(新 WSL 版本)后在 Win10 19042 上使用 WSL2 遇到了这个问题,不得不重新启动计算机才能使 localhost 再次工作。

相关内容