我在我的Windows机器上运行一个本地的AEM服务器。服务器正在localhost:4502上运行。我正在使用WSL 2中运行的Ubuntu分发版进行开发。我想在我的WSL 2 Ubuntu中访问运行在Windows机器上的localhost:4502。
有没有办法做到这一点,或者是不可能的?
我在我的Windows机器上运行一个本地的AEM服务器。服务器正在localhost:4502上运行。我正在使用WSL 2中运行的Ubuntu分发版进行开发。我想在我的WSL 2 Ubuntu中访问运行在Windows机器上的localhost:4502。
有没有办法做到这一点,或者是不可能的?
mDNS已经成为WSL2的一个功能一段时间了。将你的WSL2 hostname
(或者在你的编程/语言环境中等效的命令/函数)与".local"
连接起来,即可获取访问权限。
例如,在Bash中尝试:
ping "$(hostname).local"
例如,如果您的hostname
是"MyComputer",那么mDNS应该是MyComputer.local
。nc -zv "$(hostname).local" <portnumber>
WSL2使用由Windows虚拟机平台(Hyper-V的子集)创建的虚拟网络(vNIC)运行。在WSL2中,localhost
是vNIC的地址。
WSL2还在Windows主机上设置了一个虚拟路由器,以允许与外部世界和Windows主机进行连接。您可以通过以下方式查看此功能:
ip route
这是您需要在Windows主机上使用的地址。
当然,您可以从路由(或者如早期答案中所述,从/etc/resolv.conf
)解析它,但WSL设置了一个方便的mDNS(.local
域),使用Windows的“计算机名称”,也用作WSL实例的主机名。因此,将 $(hostname)
(或其在编程/语言环境中的等效物)与“.local”
连接起来,就可以访问它。
mDNS依赖于Windows主机来解析名称。如果您在WSL下更改了/etc/resolv.conf
,则可能无法工作。
记得打开任何必要的防火墙端口。WSL2被认为是与Windows主机不同的分离网络。 Windows将认为来自WSL2的网络连接来自外部源。(感谢@RamilGilfanov发表评论指出这一点)
第一次从WSL2到特定端口进行连接时,Windows Defender(如果它是您的防火墙)通常会显示一个对话框,询问是否要授权访问。 但是,根据我的经验,由于鼠标单击,键盘等的时间关系,这个对话框经常被主窗口遮挡,因此很容易被忽略。
记得让您的Windows服务接受来自远程主机的连接。
许多服务器默认配置为绑定到localhost
/127.0.0.1
。由于WSL2对Windows来说看起来像远程网络,因此通常需要更新配置以绑定到0.0.0.0
或特定地址。请注意,由于WSL2的地址在每次重新启动后都会更改,因此每次更新配置可能会很困难。如果可能,请使用0.0.0.0
,除非存在安全问题。由于WSL是设计用于开发而不是生产,因此这不应该是问题。
127.0.0.0/8
范围内的其他地址,该怎么办? - leoexport 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
获取IP地址。打开cmd.exe并输入ipconfig /all
。记下IP地址172.22.16.1。
以管理员身份打开记事本,菜单文件→打开,浏览到C:\Windows\System32\drivers\etc\hosts
,添加一行172.22.16.1 localhost
,保存并关闭。
最后一个选项是允许防火墙规则接受公共连接。为此,打开控制面板*→系统和安全→Windows Defender防火墙→高级设置→入站规则→新建规则
规则类型:选择端口,然后点击下一步
协议和端口:输入特定本地端口:4502,然后点击下一步
操作:允许连接,然后点击下一步
配置文件:勾选公用,然后点击下一步
名称:输入AEM服务器,然后点击完成
关闭其他窗口,然后再次打开cmd。输入wsl --shutdown
以关闭Ubuntu子系统。
再次打开Ubuntu。
测试连接:在命令提示符中输入curl localhost:4502
。如果返回结果,则表示一切正常。
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找到了解决方案。
简单的方法:
在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
172.23.97.122
现在您可以使用Windows浏览器访问它。ip route
命令获取IP地址的方法。应该避免重复回答,所以在编写新答案之前请确保阅读现有答案。另外请注意,每次重新启动WSL(或计算机)时,IP地址都会更改,所以这并不是“简单的方法”。正如我在答案中提到的那样,最好使用mDNS名称,因为只要启用了mDNS,它就始终可以解析到正确的地址。 - NotTheDr01ds[wsl2]
localhostForwarding=true
localhostForwarding
在 WSL2 上应该已经默认为 true
,但有时似乎会出现问题,我还没有能够确定原因。通常只需执行 wsl --shutdown
并重新启动会话即可恢复大多数人的功能。 - NotTheDr01dslocalhostForwarding
意味着“在 WSL 2 VM 中绑定到 localhost 的端口应该可以从主机连接”,但不是“在主机中绑定到 localhost 的端口应该可以从 WSL 2 VM 连接”,因此这个答案行不通。 - ayanamist