我尝试过以下方法:
https://www.youtube.com/watch?v=yCK3easuYm4
https://medium.com/codemonday/access-wsl-localhost-from-lan-for-mobile-testing-8635697f008
https://superuser.com/questions/1679757/how-to-access-windows-localhost-from-wsl2
https://superuser.com/questions/1131874/how-to-access-localhost-of-linux-subsystem-from-windows
https://superuser.com/questions/1732399/cannot-communicate-with-windows-localhost-from-wsl2
https://superuser.com/questions/1594420/cant-access-127-0-0-180-outside-of-wsl2-ubuntu-20-04
https://www.reddit.com/r/vscode/comments/11bp9oo/how_do_i_access_live_server_from_phone_i_tried/
它们都有一个共同的程序:
netsh interface portproxy add v4tov4 listenport=3001 listenaddress=0.0.0.0 connectport=3001 connectaddress=(wsl hostname -I)
ipconfig
<windows_IPv4_address>:3001
server.listen(PORT, '0.0.0.0', ()=> {
console.log(`⚡️ listening on ${PORT}`);
})
发生了什么:
<windows_IPv4_address>:3001
、localhost:3001
、0.0.0.0:3001
和 127.0.0.1
超时localhost
设置为 0.0.0.0
的参数,但只能在本地计算机上查看为
127.0.0.1
,而不是
'0.0.0.0'
或
server.listen
所以这些说明不起作用。我想知道这些建议是否已经过时,我不确定我错过了什么。我希望从 LAN 访问 wsl2 localhost 以在移动设备上进行测试。谢谢
如果
localhost
工作(从电脑本身)并且 127.0.0.1
和主机自己的 IP 地址(例如 192.168.1.110
)不工作 - 那么基本是错误的,应该首先排除故障。这是一个简单的 python http.server 运行并监听 wsl 中的 0.0.0.0
的屏幕截图:
0.0.0.0
是一个占位符,基本上表示“服务器拥有的任何 IP 地址”。如前所述,WSL 本质上是计算机内部的一个容器,这也意味着主机可能有一个对您隐藏的 IP,这是它与容器通信的 IP。在 WSl 容器内设置 0.0.0.0
并不意味着主机 PC 拥有的任何 IP 地址都会将流量转发到 WSL 您需要在配置中添加一些内容,以便主机将其外部 IP 上的流量转发到 WSL 容器。
举个例子,这里是相同窗口的屏幕截图,但在主机上运行完全相同的命令:
请注意,这次外部 IP
192.168.1.110
的响应与 localhost
和 127.0.0.1
相同。
阅读https://jwstanly.com/blog/article/Port+Forwarding+WSL+2+to+Your+LAN/你必须做一些端口转发。
在 WSL2 中执行
ip addr
并复制它(不适用于 lo
)。就我而言,它是172.20.204.41
。
在您的主机上打开管理powershell窗口并执行
netsh interface portproxy add v4tov4 listenport=3001 listenaddress=0.0.0.0 connectport=3001 connectaddress=172.20.204.41
netsh interface portproxy show v4tov4
来验证您的更改。
如果不起作用,您必须在防火墙中打开该端口。
在主机上的PS窗口中执行
New-NetFirewallRule -DisplayName "WSL2 Port Bridge" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 3001
这将打开 Windows Defender 防火墙中的端口:
注意我所有的屏幕截图都使用端口 8000,因为我不想在这方面花费太多时间 - 但所有命令都使用您问题中的端口(3001)。