我已经研究 WSL-2 一段时间了,但并不完全了解主机和 WSL-2 区域之间的流量是如何路由的。
在某些来源中,WSL-2 使用的所有端口似乎都会自动可供主机使用。比如在微软的这个教程 https://learn.microsoft.com/en-us/windows/python/web-frameworks#hello-world-tutorial-for-flask。
同样,我设法托管一个 Jupyter 实例,该实例可以通过以下方式直接在我的主机上使用localhost:8888
.
但是,当尝试其他服务时,例如 ssh(也在非标准端口上尝试过),该端口不会自动通过 localhost 变得可用,并且我必须使用分配给我的 WSL 发行版的 IP 地址(来自wsl hostname -I
)
为了通过本地主机提供服务,我发现这个端口转发脚本 https://github.com/microsoft/WSL/issues/4150#issuecomment-504209723,这有效。但我想了解为什么需要它。
为什么某些服务需要端口转发,而不是全部服务?
当您运行 WSL-2 时,就像虚拟机一样的机器在您的 Windows 设备上运行。 Windows 将创建一个与您的 LAN 相同的本地网络,并将 WLS-2 连接到该网络。
- 在 WSL2 上,您可以运行ip 一个 | grep eth0,结果如下:
5: eth0: mtu 1500 qdisc mq 状态 UP 组默认 qlen 1000
inet 172.27.5.124/20 brd 172.27.15.255 范围全局 eth0
- 在 Windows 的终端(或 PowerShell)上运行ipconfig,在结果中查找,如下所示:
Ethernet adapter vEthernet (WSL):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::1532:a8ea:6b34:8df2%73
IPv4 Address. . . . . . . . . . . : 172.27.0.1
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Default Gateway . . . . . . . . . :
WSL-2 和 Windows 设备位于同一网络中,并且 WSL-2 未连接到您的 LAN。
我的解决方案(在 Windows 上使用端口转发)
在 Windows 上使用 Admin 打开终端,然后运行脚本:
netsh interface portproxy set v4tov4 listenport=8888 listenaddress=0.0.0.0 connectport=8888 connectaddress=$(wsl hostname -I)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)