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

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

  •  1
     
  •   cogear · 318 天前 · 3365 次点击
    这是一个创建于 318 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目在 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 条附言  ·  318 天前

    此问题已解决

    解决过程

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

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

    chronos
        16
    chronos  
       318 天前
    正常来说使用 localhost 就可以直接访问,如果出现问题就只能使用 ip 访问了。我的做法是在 wsl 里面写一个 systemd 的 service 在开机时使用脚本添加一个固定的局域网 IP ,并且调用 powershell 给 windows 这边的 WSL 网卡也添加一个同网段的固定 IP ,这样就可以直接通过这个固定 IP 访问到 WSL 了。
    cogear
        17
    cogear  
    OP
       318 天前
    #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  
       318 天前
    咦,还真没注意到。我的是自动可以访问的 localhost ip 127 都能,
    ivslyyy
        19
    ivslyyy  
       317 天前
    会弹提示啊。启动后会弹提示和链接,点就能用。
    yuyanglive
        20
    yuyanglive  
       317 天前
    试试把端口号调大,我这偶尔会莫名其妙连不上,端口号调大(大于 10000 )就可以,可能是端口号冲突了,没深究。
    xmsz
        21
    xmsz  
       245 天前
    我记录一下刚刚的情况

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

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



    然后各种调试,还是不行

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

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