从局域网访问wsl2内的网络程序
— wsl, wsl2, 局域网访问, windows linux子系统 — 1 min read
原始需求
用wsl2子系统开发时,访问上面运行的网络服务,只需要使用localhost即可。但从开发机外部网络(例如局域网)就访问不到。
原因
从wsl2开始linux子系统运行在虚拟机上,网络是从win上NAT过来的,跟win本身处于另一个局域网,所以外部无法访问。
解决方法
跟从公网访问路由器内的机器思路是一样的,开启端口映射即可。
以设置主机的10000端口映射到wsl2内的10000端口为例
获取linux子系统ip
1ifconfig
输出
1eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 15002 inet 192.168.111.4 netmask 255.255.240.0 broadcast 192.168.111.2553 inet6 fe80::215:5dff:fe36:ad50 prefixlen 64 scopeid 0x20<link>4 ether 00:15:5d:36:ad:50 txqueuelen 1000 (Ethernet)5 RX packets 11619 bytes 4941392 (4.9 MB)6 RX errors 0 dropped 0 overruns 0 frame 07 TX packets 2159 bytes 2406370 (2.4 MB)8 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 09
10lo: flags=73<UP,LOOPBACK,RUNNING> mtu 6553611 inet 127.0.0.1 netmask 255.0.0.012 inet6 ::1 prefixlen 128 scopeid 0x10<host>13 loop txqueuelen 1000 (Local Loopback)14 RX packets 30590 bytes 36540958 (36.5 MB)15 RX errors 0 dropped 0 overruns 0 frame 016 TX packets 30590 bytes 36540958 (36.5 MB)17 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
一般是eth0接口,192.x.x.x的ip,这里是192.168.111.4
设置端口映射
在开始菜单搜索powershell, 找到终端应用程序,右键选中powershell, 以管理员身份运行
1netsh interface portproxy add v4tov4 listenport=10000 listenaddress=0.0.0.0 connectport=10000 connectaddress=192.168.111.4
执行完就设置好监听win上所有ip地址和10000端口,并转发到192.168.111.4的10000端口了
删除端口映射
1netsh interface portproxy delete v4tov4 listenport=4000 listenaddress=0.0.0.0
执行这个可以删除上面设置好的端口映射配置
查看所有端口映射配置
1netsh interface portproxy show all
输出
1侦听 ipv4: 连接到 ipv4:2
3地址 端口 地址 端口4--------------- ---------- --------------- ----------50.0.0.0 10000 192.168.111.4 10000
打开windows防火墙
配置好端口映射后,还需要打开windows防火墙,允许访问才行。参考下图所示的顺序设置就可以了。
赶紧试试局域网访问吧
已知问题
仅支持tcp协议,不支持ipv6