首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从WSL2内部访问运行在Windows中的本地主机?

从WSL2内部访问运行在Windows中的本地主机?
EN

Stack Overflow用户
提问于 2020-11-10 05:01:06
回答 6查看 61.6K关注 0票数 40

我正在我的机器上运行一个本地的AEM服务器。服务器运行在localhost:4502.上我正在使用运行在WSL2中的Ubuntu发行版进行我的开发。我想访问本地主机:在我的WSL2 Ubuntu中运行在Windows机器中的4502。

有没有办法这样做,还是不可能?

EN

回答 6

Stack Overflow用户

发布于 2021-10-01 13:53:28

对大多数最新Windows版本的简短回答

mDNS已经成为WSL2的一个特性已有一段时间了。将您的WSL2 hostname (或编程/语言环境中的等效命令/函数)与".local"进行连接应该可以让您访问。

例如,在Bash中,尝试:

代码语言:javascript
运行
复制
ping "$(hostname).local"

例如,如果您的hostname是"MyComputer",那么mDNS应该是MyComputer.local

如果ICMP被阻塞(在新的Windows 11安装上似乎是这样),或者如果您想测试到实际端口的连接,那么使用netcat。它在WSL安装中默认可用,但可能需要安装在其他发行版中,如openSUSE:

代码语言:javascript
运行
复制
nc -zv "$(hostname).local" <portnumber>

为什么本地主机不能工作?

WSL2正在运行一个由(Hyper的子集)创建的虚拟网络(vNIC)。在WSL2内部,localhost是vNIC的地址。

你所需要的

WSL2还在Windows主机上设置一个虚拟路由器,以允许连接到外部世界和Windows主机。你可以通过以下途径看到这一点:

代码语言:javascript
运行
复制
ip route

这是您需要用于Windows主机的地址。

当然,您可以从路由(或者像前面的答案一样,从/etc/resolv.conf)解析它,但是WSL使用mDNS "computer name“来设置一个方便的mDNS( .local域),它也用作WSL实例的主机名。

因此,将$(hostname) (或者在您的编程/语言环境中是等效的)与".local"连接在一起应该可以让您访问。

其他考虑因素:

  • mDNS依赖于Windows主机来解析名称。如果您在WSL下更改了/etc/resolv.conf,那么这很可能不起作用。

  • 记得打开任何必要的防火墙端口。WSL2被认为是一个独立于Windows主机的网络。Windows将考虑来自WSL2的网络连接来自外部源。(请归功于的评论指出这一点)

当第一次从WSL2连接到特定端口时,Windows (如果是防火墙)通常会显示一个对话框,询问您是否要授予访问权限。然而,在我的经验中,由于鼠标点击、键盘等时间的原因,这个对话框常常被隐藏在主窗口下面,因此很容易被忽略。。

  • 记住让您的
  • 服务接受来自远程主机的连接。

默认情况下,许多服务器被配置为绑定到localhost/127.0.0.1。因为WSL2在Windows看来是远程网络,所以通常需要更新配置以绑定到0.0.0.0或特定地址。

注意,由于每次重新启动后WSL2的地址都会发生变化,所以每次更新配置都会很困难。如果有可能,请使用0.0.0.0,除非存在安全问题。由于WSL是为开发而不是为生产而设计的,这不应该是一个问题。

票数 75
EN

Stack Overflow用户

发布于 2021-06-23 21:00:22

我也在寻找一些解决方案来做到这一点,但目前,没有这样的选项可用。请查看这个GitHub问题:

https://github.com/microsoft/WSL/issues/4619

一种解决方案可以是:

如果您有windows(主机)的IP,那么它将完成工作,但唯一的问题是每次都会更改IP。但是,WSL2将您的windows(主机) IP存储在/etc/resolv.conf文件中。因此,我们可以修改我们的etc/hosts来动态地将winhost映射到IP。

~/.bashrc文件的末尾添加以下行。这将在启动WSL时对IP和etc/hosts进行修改。

代码语言:javascript
运行
复制
export winhost=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')
if [ ! -n "$(grep -P "[[:space:]]winhost" /etc/hosts)" ]; then
        printf "%s\t%s\n" "$winhost" "winhost" | sudo tee -a "/etc/hosts"
fi

然后运行以下命令重新加载更改。

代码语言:javascript
运行
复制
$ source ~/.bashrc

现在,您可以使用winhost而不是localhost在WSL2(客户端)访问运行windows(主机)的服务器。在您的示例中,它将是winhost:4502,但它将适用于任何其他用例,比如访问运行在windows上的Postgres/MySQL服务器等。

注意:总是记住在windows上配置防火墙以允许那些端口,这样WSL2就可以访问,否则您的连接可能会被防火墙阻塞。

票数 9
EN

Stack Overflow用户

发布于 2021-12-13 19:49:01

您需要在主机文件中添加ipv6规则。

比如:

代码语言:javascript
运行
复制
127.0.0.1 example.com
::1 example.com localhost

我也遇到了类似的问题,并在这个链接上找到了解决方案:https://github.com/microsoft/WSL/issues/5728

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64763147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档