我安装了带有 wsl2(ubuntu) 的 Windows 11。
我已经在我的 Windows localhost 上设置了一个 gdb 侦听器服务器,并希望从 wsl2 访问它。但似乎我的 Windows 机器和 wsl vm 使用不同的网络适配器。
>ipconfig
Windows IP Configuration
Ethernet adapter vEthernet (Default Switch):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::1114:bb:d0ad:93f8%18
IPv4 Address. . . . . . . . . . . : 172.29.192.1
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Default Gateway . . . . . . . . . :
Ethernet adapter vEthernet (WSL):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::897:849a:5fed:1c6e%52
IPv4 Address. . . . . . . . . . . : 172.21.128.1
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Default Gateway . . . . . . . . . :
我的服务器正在监听 8888 端口,并且可以在 Windows 上访问,但不能在 ubuntu 上访问。
我已经从 windows 防火墙和 ubuntu 防火墙打开了 8888 端口
解决办法是什么?
localhost
不起作用,因为 WSL2 使用由 Windows 虚拟机平台(Hyper-V 的子集)创建的虚拟网络 (vNIC) 运行。在 WSL2 中,localhost
是 vNIC 的地址。WSL2 确实在 Windows 主机上设置了一个虚拟路由器,以允许连接到外部世界以及 Windows 主机。您可以通过以下方式查看:
“默认通过”地址是用于 Windows 主机的地址。
您可以从上面或从 解析它
/etc/resolv.conf
,但 WSL 还使用 Windows“计算机名”设置了一个方便的 mDNS,即.local
域,它也用作hostname
WSL 实例的。$(hostname)
通过与连接来访问它.local
。尝试:
或者,如果 ICMP 被阻止(在新的 Windows 11 安装上似乎如此),请使用 netcat。它在 WSL Ubuntu 安装中默认可用,但可能需要安装在其他发行版中,如 openSUSE:
参考: 从 WSL2 内部访问在 Windows 中运行的 localhost?
“本地主机”总是指系统本身。当您运行主机操作系统和虚拟化操作系统时,您正在运行 2 个系统,这两个系统都将自己称为“localhost”。所以你永远不能访问另一个系统的“localhost”,你需要使用它的外部 IP。
在您的情况下,如果您想从 Ubuntu 系统访问在您的主机 Windows 上运行并侦听端口 8888 的服务,您必须访问
172.29.192.1:8888
. 只有实际提供服务的系统必须侦听端口并允许通过该端口的新传入连接。因为 Ubuntu 是一个单独的系统,所以除非您安装侦听该端口的服务,否则您不会有任何东西侦听端口 8888。
进一步详细说明@harrymc 和@NotTheDr01ds 的答案:
"$(hostname).local"
通常,您可以使用主机名从 wsl2 命令行联系 Windows 服务。如果此类连接似乎被阻止,您可以尝试以下操作:检查 Windows 防火墙是否阻止流量。一项简单的检查是将其关闭几秒钟并重复测试。如果可行,请添加适当的防火墙规则。
问题
nslookup "$(hostname).local"
。这会给你一堆IP。默认情况下,将使用第一个,但这可能不是有效的。也试试其他的。如果你找到一个可行的,你可以为你自己的系统定制一个简短的脚本,它总是会返回正确的 IP。