V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cogear
V2EX  ›  Visual Studio Code

请教一下使用 VSCode 连接 WSL 开发,怎么将 WSL 中的端口号转发出来以在 win 下访问?

  •  1
     
  •   cogear · 2023-05-16 16:17:43 +08:00 · 3638 次点击
    这是一个创建于 373 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目在 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 没这个功能?

    第 1 条附言  ·  2023-05-16 17:13:49 +08:00

    此问题已解决

    解决过程

    首先,我想访问WSL中的web app,不需要端口转发

    根据WSL的官方文档,理应无需配置即可使用localhost直接访问WSL中的web app。

    我无法通过localhost访问,应该是公司电脑被group policy统一配置的防火墙策略限制了。

    即使无法通过localhost访问,根据文档的提示,我可以通过WSL的ip来访问。 https://learn.microsoft.com/zh-cn/windows/wsl/networking

    25 条回复    2023-08-14 08:27:27 +08:00
    lower
        1
    lower  
       2023-05-16 16:21:00 +08:00
    你这应该是把 win 的端口转发到 wsl 里吧?
    cogear
        2
    cogear  
    OP
       2023-05-16 16:23:29 +08:00
    @lower 好像这么说也没问题。我的项目在 WSL 中启动运行的, 总之就是 docker -p xxx:3000 那样,让我在 win 中可以访问 wsl 的 3000 端口
    xtreme1
        3
    xtreme1  
       2023-05-16 16:24:12 +08:00   ❤️ 1
    wanglz111
        4
    wanglz111  
       2023-05-16 16:27:30 +08:00
    1. win 中关闭防火墙
    2. win 防火墙中设置针对 wsl 子系统的端口放行
    sbabybird
        5
    sbabybird  
       2023-05-16 16:27:47 +08:00
    https://github.com/CzBiX/WSLHostPatcher 试一下这个补丁,运行后可以将 wsl 里面的端口都暴露给外部宿主机。访问 localhost 即可。
    lower
        6
    lower  
       2023-05-16 16:27:48 +08:00
    @cogear 我之前搜到过的一种方式是 win 下用 netsh 命令可以搞,不知道是不是符合你说的场景
    cogear
        7
    cogear  
    OP
       2023-05-16 16:31:45 +08:00
    #3 @xtreme1 感谢,这个链接很有用,里面最开头的内容提示我使用虚拟机的 ip 而不是物理机的 ip 。我在 wsl 使用 ifconfig 获得 ip 172.20.194.176 之后, 使用 172.20.194.176:3000 可以访问了。
    mmdsun
        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 可能会变化,需要设置固定
    cogear
        9
    cogear  
    OP
       2023-05-16 16:41:25 +08:00
    @mmdsun 我原以为需要端口转发,
    在看了 3 楼发的官方文档后,尝试了一下,直接访问 WSL 的 ip+port 就可以访问,不需要端口转发。

    仍然感谢介绍 netsh 的使用。
    zed1018
        11
    zed1018  
       2023-05-16 16:45:45 +08:00
    正常在 wsl2 里面监听 0.0.0.0 在外面用 localhost 就能访问到
    zed1018
        12
    zed1018  
       2023-05-16 16:46:09 +08:00   ❤️ 1
    cogear
        13
    cogear  
    OP
       2023-05-16 16:46:38 +08:00
    #10 @NX2023 确实,我的 win11 也没法直接通过 localhost 访问 WSL 网络应用,需要使用 WSL 的 ip 访问。会面临 ip 地址变化的情况。
    hahastudio
        14
    hahastudio  
       2023-05-16 16:48:54 +08:00   ❤️ 1
    zed1018
        15
    zed1018  
       2023-05-16 16:49:16 +08:00
    如果访问不了,应该是其他故障,这个功能正常来讲就是自动能达到这个效果的。btw ,仅限 localhost ,不能给其他计算机通过 win ip 访问

    chronos
        16
    chronos  
       2023-05-16 17:07:04 +08:00
    正常来说使用 localhost 就可以直接访问,如果出现问题就只能使用 ip 访问了。我的做法是在 wsl 里面写一个 systemd 的 service 在开机时使用脚本添加一个固定的局域网 IP ,并且调用 powershell 给 windows 这边的 WSL 网卡也添加一个同网段的固定 IP ,这样就可以直接通过这个固定 IP 访问到 WSL 了。
    cogear
        17
    cogear  
    OP
       2023-05-16 17:07:54 +08:00
    #15 @zed1018 对,根据官方文档,应该是无需设置就可以通过 localhost 访问 WSL 中的 web app 。我去 stackoverflow 看了看,应该是我的防火墙策略被限制了,是被公司通过 group policy 统一配置禁止了。
    https://superuser.com/questions/1714002/wsl2-connect-to-host-without-disabling-the-windows-firewall
    pota
        18
    pota  
       2023-05-16 17:17:44 +08:00
    咦,还真没注意到。我的是自动可以访问的 localhost ip 127 都能,
    ivslyyy
        19
    ivslyyy  
       2023-05-17 01:39:45 +08:00
    会弹提示啊。启动后会弹提示和链接,点就能用。
    yuyanglive
        20
    yuyanglive  
       2023-05-17 08:39:19 +08:00
    试试把端口号调大,我这偶尔会莫名其妙连不上,端口号调大(大于 10000 )就可以,可能是端口号冲突了,没深究。
    xmsz
        21
    xmsz  
       300 天前
    我记录一下刚刚的情况

    我 wsl2 开了第一个服务,宿主 localhost 访问不了,但是通过 netsh interface portproxy(connectaddress=172.17.187.118),宿主可以访问了,但是手机(局域网其他设备)访问不了

    我 wsl2 又开了一个服务,这个时候宿主 localhost 可以访问,但是其他手机还是不行



    然后各种调试,还是不行

    最后居然可以了... 我已经蒙圈了,完全不记得是什么影响的

    可能的操作
    - 防火墙,设置通过应用?开了 hy, 还要其他啥的
    - 防火墙,关闭了开放
    xmsz
        22
    xmsz  
       300 天前
    @xmsz 然后我发现 localhost 能不能访问 主要是因为端口是否被占用?
    cogear
        23
    cogear  
    OP
       300 天前
    @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 应该是做转发开启了局域网访问。
    xmsz
        24
    xmsz  
       284 天前
    我还发现一个很蛋疼的情况 有点端口可以直接通 有点不行 比如 3000 因为这个宿主默认占有了...
    cogear
        25
    cogear  
    OP
       283 天前
    @xmsz #24 是的,被宿主占用的端口无法直连
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2619 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 15:19 · PVG 23:19 · LAX 08:19 · JFK 11:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.