从WSL 2内部访问在Windows中运行的本地主机[关闭]

9ceoxa92  于 2023-08-07  发布在  Windows
关注(0)|答案(7)|浏览(218)

**已关闭。**此问题不符合Stack Overflow guidelines。它目前不接受回答。

这个问题似乎与a specific programming problem, a software algorithm, or software tools primarily used by programmers无关。如果您认为该问题与another Stack Exchange site上的主题相符,您可以发表评论,说明在何处可以回答该问题。
去年关闭。
社区去年审查了是否重新开放这个问题,并将其关闭:
原始关闭原因未解决
Improve this question
我在 *Windows机器 * 上运行本地AEM服务器。服务器运行在localhost:4502上。我正在使用运行在WSL 2中的Ubuntu发行版进行开发。我想在WSL 2 Ubuntu中访问Windows机器上运行的 localhost:4502
有没有办法做到这一点,或者是不可能的?

cdmah0mi

cdmah0mi1#

最新Windows版本的简短答案

mDNS作为WSL 2的一个特性已经有一段时间了。将WSL 2 hostname(或您的编程/语言环境中的等效命令/函数)与".local"连接起来应该可以访问。
例如,在Bash中,请尝试:

ping "$(hostname).local"

字符串
例如,如果您的hostname是“我的电脑”,那么mDNS应该是MyComputer.local
如果ICMP被阻止(就像在新的Windows 11安装上一样),或者如果你想测试到实际端口的连接,那么就使用netcat。默认情况下,它在WSL Ubuntu安装中可用,但可能需要在其他发行版(如openSUSE)中安装:

nc -zv "$(hostname).local" <portnumber>

为什么本地主机不起作用

WSL 2与由Windows虚拟机平台(Hyper-V的子集)创建的虚拟网络(vNIC)一起运行。* 在 * WSL 2中,localhost是虚拟网卡的地址。

你需要什么

WSL 2还在Windows主机上设置了一个虚拟路由器,以允许连接到外部世界和Windows主机。您可以通过以下方式查看:

ip route


这是您需要用于Windows主机的地址。
当然,您可以从路由中解析它(或者,如前面的答案所示,从/etc/resolv.conf中解析),但是WSL使用Windows“计算机名”(也用作WSL示例的主机名)建立了一个方便的mDNS(.local域)。
因此,将$(hostname)(或者在您的编程/语言环境中等效的)与".local"连接应该可以访问。

其他注意事项:

  • mDNS依赖于Windows主机来解析名称。如果您已经在WSL下更改了/etc/resolv.conf,则此操作可能不起作用。
  • 请记住打开所有必要的防火墙端口。WSL 2被视为与Windows主机网络 * 独立得网络. Windows会将WSL 2的网络联机视为来自外部来源。* (感谢@RamilGilfanov指出这一点的评论)*

第一次从WSL 2连接到特定端口时,Windows Defender(如果该端口是防火墙)通常会显示一个对话框,询问您是否要授予访问权限。然而,根据我的经验,这个对话框经常被隐藏在主窗口下,因为鼠标点击、键盘等的时间安排,所以很容易错过。

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

默认情况下,许多服务器都配置为绑定到localhost/127.0.0.1。由于WSL 2对Windows来说是一个 * 远程 * 网络,因此通常需要更新配置以绑定到0.0.0.0或特定地址。
请注意,由于WSL 2的地址在每次重新引导后都会更改,因此每次都很难更新配置。如果可能,请使用0.0.0.0,除非存在安全问题。由于WSL是为 * 开发 * 而不是 * 生产 * 设计的,因此这不应该是一个问题。

kqlmhetl

kqlmhetl2#

我也在寻找一些解决方案来做到这一点,但目前,没有这样的选择可用。看看这个GitHub问题:
https://github.com/microsoft/WSL/issues/4619

一个解决方案可以是:

如果你有Windows(主机)的IP,那么它就可以完成这项工作,但唯一的问题是IP每次都会改变。但是,WSL 2将您的Windows(主机)IP存储在/etc/resolv.conf文件中。因此,我们可以修改etc/hosts,将winhost动态Map到IP。
~/.bashrc文件的末尾添加以下行。这将在 Boot WSL时grep IP并修改etc/hosts

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

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

$ source ~/.bashrc


现在您可以在WSL 2(客户端)中使用winhost而不是localhost来访问运行Windows(主机)的服务器。在您的情况下,它将是winhost:4502,但这将适用于任何其他用例,以及访问在Windows上运行的Postgres/MySQL服务器等。

**注意:**始终记住在Windows上配置防火墙以允许这些端口,以便WSL 2可以访问,否则您的连接可能会被防火墙阻止。

tjrkku2a

tjrkku2a3#

这很简单;你只需要做两件事在hosts file中将IP地址设置为 * localhost,并允许Windows Firewall允许传入连接。
以下是分步说明:
1.获取IP地址。打开cmd.exe并键入ipconfig /all。记下IP地址172.22.16.1
x1c 0d1x的数据
1.以管理员身份打开Notepad,菜单 Fileopen,浏览到C:\Windows\System32\drivers\etc\hosts,添加172.22.16.1 localhost行,保存并关闭。
1.最后一个选项是允许防火墙规则接受公共连接。为此,打开“控制面板”
“系统和安全”“Windows Defender防火墙”“高级设置”“入站规则”“新建规则”
1.规则类型:选择【端口】,点击【下一步】
1.协议和端口:输入 * 本机具体端口:*4502,点击下一步
1.操作:允许连接并单击下一步
1.配置文件:勾选 * 公共 * 并单击下一步
1.名称:键入 *AEM服务器 * 并单击完成
1.关闭其他窗口,然后再次打开cmd。键入wsl --shutdown关闭Ubuntu子系统。
1.再次打开Ubuntu。
1.测试连接:在命令提示符中键入curl localhost:4502。如果它返回了一些东西,这意味着你可以继续了。

jgwigjjp

jgwigjjp4#

您需要在hosts file中添加IPv6规则。
喜欢的:

127.0.0.1 example.com
::1 example.com localhost

字符串
我遇到了一个类似的问题,并在页面 WSL 2 Linux host cannot be accessed by a custom domain name or 127.0.0.1 #5728 找到了解决方案。

f2uvfpb9

f2uvfpb95#

简单的方法:
在Ubuntu命令行中,键入:

ip route

字符串
输出量:

default via 172.23.96.1 dev eth0
172.23.96.0/20 dev eth0 proto kernel scope link src 172.23.97.122


在应用程序中,将主机配置为:第一个月
现在您可以使用Windows浏览器访问它。

o75abkj4

o75abkj46#

Windows 10将localhost视为::1 Ubuntu将localhost视为127.0.0.1
所以解决方法是创建一个Map
在C:\Users .wslconfig中创建一个名为.wslconfig的文件<your_username>
添加以下内容。

[wsl2]
localhostForwarding=true

字符串
PS:我不知道它是否搞砸了其他事情,但它帮助我运行了升级到wsl2后坏掉的django服务器

cwxwcias

cwxwcias7#

我怀疑你能做到。
1.步骤1.在您的实际IP地址(或所有地址)上运行AEM服务器,而不是仅绑定到localhost。
1.步骤2.您的Ubuntu WSL客户端示例不会与主机共享localhost,但它会共享您的机器实际拥有的本地IP地址(例如:10.0.0.2)。只需让您的客户端连接到该IP地址而不是localhost。
1.我对AEM一无所知,但是如果你要将它暴露在一个更大的网络中,你可能需要保护它。阻止上游防火墙上的端口4502,或使用Windows防火墙规则仅允许来自您自己的IP地址的端口4502上的传入。这似乎是可能的。

相关问题