项目在 WSL 启动之后,监听 3000 端口,在宿主 win 中没法直接访问。
started server on 0.0.0.0:3000, url: http://localhost:3000
网上给出的解决方案是 Remote Explorer 中可以编辑端口映射,但是我并没有找到,
Control Shift + P 搜索 Port 或者 Forward 关键字也没搜索到相关的。
我记得之前连接到 docker container 中会有 port forward 的,是因为直接连 wsl 没这个功能?
此问题已解决
首先,我想访问WSL中的web app,不需要端口转发。
根据WSL的官方文档,理应无需配置即可使用localhost直接访问WSL中的web app。
我无法通过localhost访问,应该是公司电脑被group policy统一配置的防火墙策略限制了。
即使无法通过localhost访问,根据文档的提示,我可以通过WSL的ip来访问。 https://learn.microsoft.com/zh-cn/windows/wsl/networking
1
lower 2023-05-16 16:21:00 +08:00
你这应该是把 win 的端口转发到 wsl 里吧?
|
2
cogear OP @lower 好像这么说也没问题。我的项目在 WSL 中启动运行的, 总之就是 docker -p xxx:3000 那样,让我在 win 中可以访问 wsl 的 3000 端口
|
3
xtreme1 2023-05-16 16:24:12 +08:00 1
|
4
wanglz111 2023-05-16 16:27:30 +08:00
1. win 中关闭防火墙
2. win 防火墙中设置针对 wsl 子系统的端口放行 |
5
sbabybird 2023-05-16 16:27:47 +08:00
https://github.com/CzBiX/WSLHostPatcher 试一下这个补丁,运行后可以将 wsl 里面的端口都暴露给外部宿主机。访问 localhost 即可。
|
7
cogear OP #3 @xtreme1 感谢,这个链接很有用,里面最开头的内容提示我使用虚拟机的 ip 而不是物理机的 ip 。我在 wsl 使用 ifconfig 获得 ip 172.20.194.176 之后, 使用 172.20.194.176:3000 可以访问了。
|
8
mmdsun 2023-05-16 16:34:24 +08:00 1
看下 WSL ip 是多少,用 netsh interface portproxy 命令。
1 、本机把 8080 端口的流量转发到 172.20.73.44 的 3000 端口 netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=3000connectaddress=172.20.73.44 2 、查看规则:netsh interface portproxy show all 3 、删除某个规则:netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=88 不过可能有个问题是 WSL 中的 ip 可能会变化,需要设置固定 |
9
cogear OP |
10
NX2023 2023-05-16 16:41:58 +08:00 1
|
11
zed1018 2023-05-16 16:45:45 +08:00
正常在 wsl2 里面监听 0.0.0.0 在外面用 localhost 就能访问到
|
12
zed1018 2023-05-16 16:46:09 +08:00 1
|
13
cogear OP #10 @NX2023 确实,我的 win11 也没法直接通过 localhost 访问 WSL 网络应用,需要使用 WSL 的 ip 访问。会面临 ip 地址变化的情况。
|
14
hahastudio 2023-05-16 16:48:54 +08:00 1
|
15
zed1018 2023-05-16 16:49:16 +08:00
|
16
chronos 2023-05-16 17:07:04 +08:00
正常来说使用 localhost 就可以直接访问,如果出现问题就只能使用 ip 访问了。我的做法是在 wsl 里面写一个 systemd 的 service 在开机时使用脚本添加一个固定的局域网 IP ,并且调用 powershell 给 windows 这边的 WSL 网卡也添加一个同网段的固定 IP ,这样就可以直接通过这个固定 IP 访问到 WSL 了。
|
17
cogear OP #15 @zed1018 对,根据官方文档,应该是无需设置就可以通过 localhost 访问 WSL 中的 web app 。我去 stackoverflow 看了看,应该是我的防火墙策略被限制了,是被公司通过 group policy 统一配置禁止了。
https://superuser.com/questions/1714002/wsl2-connect-to-host-without-disabling-the-windows-firewall |
18
pota 2023-05-16 17:17:44 +08:00
咦,还真没注意到。我的是自动可以访问的 localhost ip 127 都能,
|
19
ivslyyy 2023-05-17 01:39:45 +08:00
会弹提示啊。启动后会弹提示和链接,点就能用。
|
20
yuyanglive 2023-05-17 08:39:19 +08:00
试试把端口号调大,我这偶尔会莫名其妙连不上,端口号调大(大于 10000 )就可以,可能是端口号冲突了,没深究。
|
21
xmsz 2023-07-28 10:44:30 +08:00
我记录一下刚刚的情况
我 wsl2 开了第一个服务,宿主 localhost 访问不了,但是通过 netsh interface portproxy(connectaddress=172.17.187.118),宿主可以访问了,但是手机(局域网其他设备)访问不了 我 wsl2 又开了一个服务,这个时候宿主 localhost 可以访问,但是其他手机还是不行 然后各种调试,还是不行 最后居然可以了... 我已经蒙圈了,完全不记得是什么影响的 可能的操作 - 防火墙,设置通过应用?开了 hy, 还要其他啥的 - 防火墙,关闭了开放 |
23
cogear OP @xmsz #21
你说的应该是两个问题,即本机访问 wsl2 的服务和局域网访问 wsl2 的服务。 1. 对于本机访问, 你的问题是端口号被占用,我不是。 我首先确认在端口号无使用的情况下, 当 wsl2 内有进程开启网络服务/监听某个端口时,我自己的电脑,会看到 windows 中也自动开启了一个叫做 wslhost.exe 的进程,监听了同样的端口,于是我可以在 windows 中直接通过 localhost 访问 wsl2 中的服务了。 但是公司的电脑不行。因为它就没有 wslhost.exe 的进程。 上面这个问题我不确定公司的电脑有做了什么限制。 2. 对于局域网访问 我注意到,wslhost.exe 默认监听的是 loopback 地址,所以,只能在本机访问,局域网内的其他设备无法访问。 文档也提到了 LAN 局域网访问的情况: https://learn.microsoft.com/zh-cn/windows/wsl/networking wsl2 默认是无法通过局域网访问的,你使用 netsh interface portproxy 应该是做转发开启了局域网访问。 |
24
xmsz 2023-08-13 13:28:51 +08:00
我还发现一个很蛋疼的情况 有点端口可以直接通 有点不行 比如 3000 因为这个宿主默认占有了...
|