我使用的是 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=localhost
或connectaddress=127.0.0.1
不是适合我(WSL2,Windows 10 20H2)。
所以我仍然需要 OP 问题的答案,事实证明它出奇的简单:
- 启动 WSL
-
输出如下: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-19006
19000-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 一样工作localhost
。127.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 再次工作。