WSL2 使用 "localhost" 访问 Windows 服务

14

我正在使用Windows 10上的WSL2。

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

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

对于Windows主机来说,已经可以使用“localhost”连接到WSL2服务。是否有解决方案来实现反过来的连接呢?

4个回答

16

在WSL2中访问Windows时应使用hostname.local,这将使用正确的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


4

嗯,你的标题和问题描述好像不太一致。

问题标题说“使用localhost”,但是在正文中你说“使用服务器名称”。

从WSL2通过名称“localhost”访问Windows 10服务? 咳,这个估计行不通。 我想到了一个可能性,但它会很复杂。

但我认为你真正想要的是第二个,所以我可以考虑几种在WSL2中通过主机名访问Windows主机服务的选项:

  • 首先,并且希望是最简单的,WSL2支持mDNS(WSL1不支持),因此您应该能够将Windows主机作为{hostname}.local访问(其中{hostname}是Windows主机的名称(字面上,在bash中,ping $(hostname).local,因为已分配的WSL2主机名是主机Windows 10计算机的名称)。对我而言,这很有效。虽然我不记得需要进行任何特殊设置,但这个超级用户答案似乎表明您必须手动启用它。

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

    powershell.exe“(Test-Connection -ComputerName (hostname) -Count 1).IPV4Address.IPAddressToString”(和其他方法),然后使用类似于sed的工具更改/etc/hosts


0
将以下代码添加到~/.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

0

上次我遇到这个问题时,我降级到了WSL1,然后所有的连接都开始完美地工作了。

你可以使用:

wsl --set-version Ubuntu 1

这是解决WSL2中所有连接相关问题最简单的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接