WSL2 使用“localhost”访问 Windows 服务

Posted

技术标签:

【中文标题】WSL2 使用“localhost”访问 Windows 服务【英文标题】:WSL2 use "localhost" to access Windows service 【发布时间】:2021-04-13 23:16:34 【问题描述】:

我在 Windows 10 上使用 WSL2。

我的开发堆栈在主机操作系统上使用本地网络服务器(localwp 或 wamp)。 我使用 WSL2 作为主终端(SSH、Git、SASS、自动化工具……)。

我需要的是一种使用服务器名称而不是随机 IP 地址从 WSL2 系统连接到我的主机服务 (mysql) 的方法。

Windows 主机已经可以使用“localhost”连接到 WSL2 服务。有没有其他方法可以解决?

【问题讨论】:

【参考方案1】:

您应该使用hostname.local 从 WSL2 访问 Windows,因为这将使用正确的 IP。请注意,hostname 应替换为在 WSL2 中运行的hostname 命令的结果。 您可以通过在 WSL2 中运行 ping $(hostname).local 来检查 IP。

您还需要添加防火墙规则以允许从 WSL2 到 Windows 的流量。在提升的 PowerShell 提示符下运行:

New-NetFirewallRule -DisplayName "WSL" -Direction Inbound  -InterfaceAlias "vEthernet (WSL)"  -Action Allow

上面的命令应该允许您从 WSL 访问 Windows 公开的任何内容,无论是什么端口,但是请记住,您启动的任何应用程序都会在您首次启动它们时为它们创建一个自动规则,从而阻止来自公共网络(当您收到来自 Windows 防火墙的提示时,询问是否应允许该应用接受来自公共网络的连接)。

如果您没有明确允许,默认情况下它们将被阻止,这也会阻止来自 WSL 的连接。因此,您可能需要找到该入站规则,并将其从阻止更改为允许(或删除它)。

在此处查看信息:

https://github.com/microsoft/WSL/issues/4585#issuecomment-610061194

【讨论】:

【参考方案2】:

嗯,你的标题和你的问题主体似乎不太一致。

问题标题说“使用本地主机”,但在正文中你说“使用服务器名称”。

通过 WSL2 中的名称“localhost”访问 Windows 10 服务?让我们带着“不”去吧。我可以想出一种可能性来让它发挥作用,但它会很复杂。

但我认为第二个确实是您正在寻找的,所以我可以想到几个选项来通过 WSL2 中的主机名访问 Windows 主机服务:

首先,希望是最简单的,WSL2 支持 mDNS(WSL1 不支持),因此您应该能够以 hostname.local 访问 Windows 主机(其中 hostname 是 Windows 主机的名称(字面意思是 bash ,ping $(hostname).local,因为分配的 WSL2 主机名是主机 Windows 10 计算机的主机名)。这对我有用。虽然我不记得必须做任何特别的事情来启用它,this Super User answer 似乎表明你必须手动开启。

第二个选项是将您的 Windows 主机 IP 添加到 /etc/hosts。如果您的 Windows IP 是静态的,那么您可以手动将其添加到 /etc/hosts 并完成。如果它是动态的,那么您可能需要编写脚本。您可以通过以下方式从 WSL2 内部检索它:

powershell.exe "(Test-Connection -ComputerName (hostname) -Count 1).IPV4Address.IPAddressToString"(和其他方法)然后使用sed之类的东西来更改/etc/hosts

【讨论】:

【参考方案3】:

在~/.bashrc或~/.zshrc中加入如下代码,然后用winhost访问主机ip。

sed -i -e '/winhost/d' /etc/hosts

win_ip=$(cat /etc/resolv.conf | grep nameserver | awk ' print $2 ')

win_host="$win_ip winhost"

echo $win_host >> /etc/hosts

【讨论】:

以上是关于WSL2 使用“localhost”访问 Windows 服务的主要内容,如果未能解决你的问题,请参考以下文章

获取 err_connection_refused 从 Windows 访问在 wsl2 上运行的 django,但可以从 Windows 终端卷曲

Windows10安装WSL2和Ubuntu的过程

在Windows 10中启动WSL2 并安装Linux( Ubuntu 为例)并运行docker

如何访问 Docker 桌面使用的 wsl2?

如何从 Docker 容器内部访问在 WSL2 上运行的服务?

如何使用 127.0.0.1 从 Windows 主机访问在 WSL2 中运行的服务?