从局域网访问WSL2 | 青训营笔记

4,546 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记。

为什么要这么做?

在开发「第三届青训营 -后端场」的抖音项目时,如果想要用上redis,那么不可避免地需要一个Linux开发环境。作为一名普通的Windows用户,并且这名用户不想在自己的电脑上装一个双系统,也不想装VMWare这类软件,那么唯一可以走得通的路便是使用WSL2。

Q:为什么不想装虚拟机,却可以容忍WSL2?

A:因为WSL可以直接从Micrsoft Store下载 —— 奇怪的精神洁癖

可以看到这名Windows用户有着奇怪的精神洁癖,甚至连虚拟机都不想装。那显然,他也不会去装安卓模拟器这种东西。没有了安卓模拟器,那么唯一可以走得通的路便是用真机调试。

众所周知,使用真机调试可能会碰上一些网络上的问题。但幸运的是,这名Windows用户今年24岁,是学生,所以用的是校园网。也就是说,在电脑和手机均连校园网的情况下,电脑上启动服务后,只要简单地把电脑的ip地址和服务对应的端口填入手机上的客户端中就可以开始快乐地“刷抖声”。

当然,每个学校的校园网配置可能不太一样。某些校园网下或许不能就这么简单快乐地连上服务,这部分同学可能要做一些额外的配置(sad)

但上述一切的简单快乐都建立在服务是在宿主机,也就是本机上运行的。如果你的服务在WSL2里运行,那么上述方法将不再奏效。这也就引出了我们的问题,如何从局域网访问WSL2

怎么做?

在着手解决问题之前,我们需要了解一些相关知识:
Comparing WSL 1 and WSL 2 | Microsoft Docs(只要看讲network的部分,ctrl+f 输入 net 即可)
[WSL 2] NIC Bridge mode 🖧 (Has TCP Workaround🔨) · Issue #4150 · microsoft/WSL (github.com)

当然,如果你觉得这些东西太长,不想看的话,也没有任何问题

我们可以从这些东西提取出这些信息:WSL1用的是桥接网络模式,WSL2用的是NAT模式,以及跑项目不在WSL1上跑的原因。

关于网络的这两个模式的区别可以看这篇:NAT和桥接的区别。 - 知乎 (zhihu.com)

网络上有许多教程,皆旨在把WSL2改成桥接模式来满足局域网访问的需求。但当我这样做时,我的校园网认证客户端直接崩了,具体原因我也不太清楚,但反正这条路是寄了。

既然桥接行不通,那么还有什么方法可以让局域网中的其他主机访问到本机的WSL2呢?前面放的知乎文章中有提到:NAT相当于在本机网络的基础上生成了一个子网络。这个子网络其实就相当于一个内网,而此时的局域网就相当于外网,那么从外网访问内网的主机则自然可以想到借助端口映射这个工具。

而这个工具微软已经写好了,并且集成到了系统里,它就是 Netsh interface portproxy
文档在这里:Netsh commands for interface portproxy | Microsoft Docs

这个项目要用到的命令如下:

netsh interface portproxy add v4tov4 listenport=22 connectaddress= 11.45.14.25 connectport=8080 listenaddress=0.0.0.0 protocol=tcp

listenport 后面跟本机端口(你提供给手机访问的端口),connectaddress 后面跟WSL2的ip地址,connectport 后面跟WSL2里服务使用的端口。

操作步骤

  1. 首先打开 listenport 对应端口的防火墙。
    教程:开启win10防火墙开启某端口__刘文凯_的博客-CSDN博客_win10防火墙开放端口

  2. 以管理员模式打开 PowerShell,键入命令。

    做完这两步,接下来在手机上就可以像访问宿主机一样访问WSL2了。


补充的一些东西

查看监听了哪些ip和端口

netsh interface portproxy show all

删除本机某个ip-端口对的监听

netsh interface portproxy delete v4tov4 listenport=22 listenaddress=0.0.0.0

鉴于WSL2每次重启ip都会发生变化,如果你像我一样懒得为WSL2设置静态ip,那么就需要在WSL2重启后重新设置端口映射。方法很简单,把 connectaddress 后面的ip地址改成新的ip地址即可。同时这么做会覆盖掉原来的ip-端口对的监听,无需担心会因新增一个监听而需要删除旧的监听这种事。