提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、WSL2安装
- 二、使用步骤
- 1.NAT
- 2.镜像
- 三、写在最后
- 总结
前言
WSL2的出现感觉真的是一个惊喜,又想玩Linux,又怕日用搞不了的最佳替代方案。而且经过测试WLS2除了IO性能略弱以外,其它的性能损失的真不多。生产力几乎全线支持,甚至核AI开发息息相关的CUDA也支持。
我曾经好几次使用Windows+WSL2的组合解决很多问题,今天就重点说下WSL2的网络问题,给不太懂的小伙伴提供点有价值的经验。
一、WSL2安装
这里只说网络配置,安装我的其它帖子有,不会的可以先移步看下教程。
二、使用步骤
拿SSH(默认22端口)
当例子,当然现实可能使用Nginx代理的情况更多,原理是一样的。目前WSL2支持两种方式允许LAN访问
。所谓LAN访问就是跟你的Windows主机一个局域网的设备直接访问WSL2,就相当于替代了完整的Linux的功能。
1.NAT
网路地址转换
,这个是默认
支持的方式。Windows为WSL2的实例创建了一个虚拟网卡
,这个虚拟网卡和Windows的物理网卡不是一个,但是它们可以互通
。
你再WSL2实例里面使用ifconfig
看下网卡信息会发现一般都是172开头
的,显然和你的Windows以太网卡不是一个网段。
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.24.34.81 netmask 255.255.240.0 broadcast 172.24.47.255
inet6 fe80::215:5dff:fe11:5b4 prefixlen 64 scopeid 0x20<link>
ether 00:15:5d:11:05:b4 txqueuelen 1000 (Ethernet)
RX packets 221 bytes 187749 (187.7 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 107 bytes 9147 (9.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
这个时候你可以在Windows里面访问WSL2的任何端口
,但是和你的Windows设备同网段的设备不能访问WSL2的端口,哪怕你在WSL2里面绑定的是全地址也不行,比如*:22
。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 229 root 3u IPv4 17708 0t0 TCP *:ssh (LISTEN)
sshd 229 root 4u IPv6 17710 0t0 TCP *:ssh (LISTEN)
办法还是有的,巨硬已经给我们了。没错,就是通过Windows端口映射
WSL2里面的端口到Windows本地,当然Windows也得配全地址
。
具体命令如下:
注意:需要管理员权限!
netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=22 connectaddress=(wsl hostname -I)
字段解释:
netsh interface portproxy add v4tov4:
这个是添加IPV4地址的意思,保持不变。
listenport:
Windows的代理端口,LAN访问通过这个端口
listenaddress:
Windows代理的地址,0.0.0.0是全地址,还可以指定地址,但一定是可访问的
connectport:
WSL2里面绑定的端口,比如SSH
connectaddress:
WSL2的实例的IP地址,你也可以通过ifconfig查看并指定绑定哪个地址
配置好后就是下面的样子:
注意:Windows映射的端口不能被其它程序占用,否则失败!
2.镜像
这个网络架构是后来出的,不是所有的版本都支持的,需要Windows11 22H2+版本
才行。它的方案和NAT完全不是一回事,它将 Windows 上的网络接口“镜像”
到 Linux 中,以添加新的网络功能并提高兼容性。
要使用这个功能你需要在Windows的用户目录创建一个文件,名字叫.wslconfig
。它的名字就叫.wslconfig
,没有其它的后缀什么的。然后再里面配置以下命令:
# Settings apply across all Linux distros running on WSL 2
[wsl2]
#如果值为 mirrored,则会启用镜像网络模式。 默认或无法识别的字符串会生成 NAT 网络。
networkingMode=mirrored
#networkingMode=NAT
配置好之后一定要执行wsl --shutdown
,然后再重新启动WSL2实例。启动完成后你看到的网络配置长下面这样:
eth2(或者叫其它的名字)就是你的Windows的以太网的镜像,它的IP地址和你的Windows地址一模一样。
eth2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.20.52 netmask 255.255.255.0 broadcast 10.0.20.255
inet6 fe80::9672:e4cf:652d:1d8a prefixlen 64 scopeid 0x20<link>
ether 70:b5:e8:88:0d:5e txqueuelen 1000 (Ethernet)
RX packets 38 bytes 13077 (13.0 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 53 bytes 6194 (6.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
loopback0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:15:5d:c0:0c:af txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
这个模式除了需要Windows11 22H2这个硬性要求外,几乎不需要额外配置
,你在WSL2里面绑定的任何端口都可以通过LAN直接访问*
。
注*:防火墙配置必须能够放行,以后再讨论防火墙问题,很多人可能不会在WSL2里面配置防火墙,保持默认即可。
三、写在最后
不管哪种方式配置,注意你都是共用Windows的以太网带宽
,你要注意带宽瓶颈
。只能说这种方式提供一种测试的或小型网络需求,但是无疑给你提供了非常好的测试平台,你只需要一台支持WSL2的Windows电脑就搞定了。
总结
1、目前只支持这两种方式,后续有新的再说。