熊师傅牛逼
最近在学IOT,如果在wsl里模拟固件,即使启动成功,也无法成功的在本机访问服务,一开始也没学过计网,也不了解wsl的网络机制,被这个问题困扰好久,只能在虚拟机里去运行,但我实在是不喜欢虚拟机,因此执着于研究wsl如何才能启用Firmae,今天在熊师傅的帮助下终于成功,下面说一下原理和流程
原理
由于我不是很懂计网,还在学习,只能用不专业的语言来描述一下原理,但或许不专业的语言更有助于其他小白理解这个问题
wsl的网络是如何运作的呢?
正常wsl里的服务是能够访问的到的,让我们来看一个实验

在wsl里启用一个虚拟服务,打开的是8000端口,我们来看一下我们的ip,此时是172.23.162.33
在本机的浏览器里输入172.23.162.33:8000,成功访问

能够成功访问
这个实验说明:wsl是可以和主机进行正常通讯的
问题来了,为什么是172.23.162.33而不是127.0.0.1,也就是本机?
先来看一下主机的ip

此时网段是学校的内网
来看一个图

如果访问的是localhost(127.0.0.1),那么访问的是主机的localhost,并不是wsl里的localhost,也就是说,我的访问请求压根不会访问到wsl里的服务,因此,想要直接访问wsl的服务,我们需要直接访问wsl的ip:127.23.162.33
换句话说,wsl要想和外界通信,或者外界想和wsl通信,必须要经过172.23.162.33
好,那我们现在来用Firmae启动一下固件

好,启动成功了,并且他说Network reachable on 192.168.0.1,因为是路由器(这个是goahead服务)默认开启80端口,所以我们来访问一下这个地址

访问不到
就应该访问不到!刚才说了,和外界通信必须要走172.23.162.33,也就是说,我们发送的请求找不到192.168.0.1这个服务,因为它是wsl内部启动的服务,如图:

那访问172.23.162.33呢?

自然也不行,这个ip上面又没有运行任何的服务,我们想访问wsl内部启动的一个虚拟服务,就必须要经过172.23.162.33,但是直接访问172.23.162.33也无法让请求到达192.168.0.1啊?
所以有没有办法,让我在访问172.23.162.33的时候,可以把我的请求送到192.168.0.1呢?
答案是:端口转发
现在,让我们在wsl开启一个端口转发,以7300端口为例,现在我们通过一系列的设置,让wsl上面的7300端口只要收到请求,就把这个请求转发到192.168.0.1上面去

那么此时,如果我在访问172.23.162.33的7300端口,他就会把我的请求转发到192.168.0.1上去,也就是可以实现从外部访问了
实操
让我们来实操一下
进行端口转发的工具是socat
下载方式是
sudo apt install socat
下载好之后,我们另起一个终端,输入(此时我的路由器一直是一个启动状态)
socat TCP4-LISTEN:监听端口号,fork TCP4:转发到的ip:转发到的接口 &
那么在这里我们输入
socat TCP4-LISTEN:7300,fork TCP4:192.168.0.1:80 &

“&”表示后台运行
现在,我们访问172.23.162.33:7300

成功
注意不能访问192.168.0.1,因为我只是进行了转发操作,并没有让这个ip地址暴露出来