这是我参与「第三届青训营 -后端场」笔记创作活动的的第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里服务使用的端口。
操作步骤
-
首先打开
listenport
对应端口的防火墙。
教程:开启win10防火墙开启某端口__刘文凯_的博客-CSDN博客_win10防火墙开放端口 -
以管理员模式打开 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-端口对的监听,无需担心会因新增一个监听而需要删除旧的监听这种事。