WSL2在去年下半年时候更新了2.0的Pre-Relese版本,详细更新内容:https://github.com/microsoft/WSL/releases/tag/2.0.0
总结一下主要是:
- 支持自动回收内存
- 支持自动释放 WSL2 虚拟硬盘空间
- 支持和 Windows 使用相同的网络(镜像网络)
- 支持 DNS Tunneling
- 支持 Windows 设置的代理
- 支持 Windows 防火墙
- 支持 Multicast
终于,WSL2可以和宿主机的Windows共用一套网络端口了。
之前的的方式是使用桥接模式给WSL2配置静态IP,现在可以设置镜像网络,直接通过127.0.01来访问WSL2中的服务。这样也能解决当网络环境变化时候,需要重新配置IP的问题。
Note:
- Windows系统版本需要至少 Windows 11 23H2
- WSL最新正式版本为2.0.14
1. 在Windows宿主机上修改WSL的config
在当前用户目录(C:\Users\xxx)下修改.wslconfig,内容:
123456789101112 | [wsl2]# networkingMode=bridged# vmSwitch=Home # 此处的名称和指定的虚拟网络交换机一致# dhcp=false # 禁用DHCP,在WSL2系统中通过设置Linux的静态IP实现获取IPnetworkingMode = mirrored # 端口自动转发,Windows和WSL共享端口,都使用127.0.0.1dnsTunneling = true # WSL的DNS请求通过Windows转发firewall = true # WSL同步Windows防火墙规则autoProxy = false # Windows设置代理时自动同步给WSL[experimental]sparseVhd = true # 自动清理磁盘空间autoMemoryReclaim = disabled # 可以在gradual 、dropcache 、disabled之间选择,开启会造成WSL中Docker启动异常 |
Note:
- 如果你在WSL里使用docker,需要将 autoMemoryReclaim配置为dropcache或者disabled否则无法启动Docker
- 如果你在WSL里使用docker,需要在/etc/docker/daemon.json 里添加一句 “iptables”: false,否则你可能无法在Windows中连接Docker容器。
修改下WSL2下
/etc/wsl.conf
,修改内容:123 | [network]generateResolvConf = truegenerateHosts = true |
4. 在WSL2中配置DHCP自动获取IP
修改WSL2下的
/etc/network/interfaces
,修改内容:123456789101112 | # The primary network interface# 开机自动连接网络auto eth0allow-hotplug eth0 iface eth0 inet dhcp# 注释掉wsl bridged配置# auto eth0# iface eth0 inet static# address 192.168.3.2# netmask 255.255.255.0# gateway 192.168.3.1 |
在powershell中输入:
1 | wsl --shutdown |
再次打开WSL2,使用
ip addr
命令查看IP地址,已经和宿主机Windows的IP一致了:1234 | 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff inet 192.168.3.3/24 brd 192.168.3.255 scope global noprefixroute eth1 valid_lft forever preferred_lft forever |
已经成功设置完成。
配置完成后,发现docker中在运行的服务有些挂掉了,重启提示端口冲突,在Windows中使用
netstat -aon | findstr "3306"
查看进程,也没有查到相关端口。查阅资料后发现,这个问题的原因分为两部分:
Windows
中有一个TCP 动态端口范围,处在这个范围内的端口,有时候会被一些服务占用。在Windows Vista
(或Windows Server 2008
)之前,动态端口范围是1025
到5000
;在Windows Vista
(或Windows Server 2008
)之后,新的默认起始端口为49152
,新的默认结束端口为65535
。
- 如果安装了
Hyper-V
,那么Hyper-V
会为容器宿主网络服务(Windows Container Host Networking Service)随机保留一些端口号使用。
正常情况下,
Hyper-V
虽然会在TCP 动态端口范围中随机挑一些端口号保留(占用),不过保留的端口号普遍比较大,就算保留几百、几千个也影响不大。但是,Windows 自动更新有时会出错,导致这个范围的起始端口被重置为 1024
。这就会导致一些常用端口因为被保留而无法使用。使用命令
netsh int ipv4 show dynamicport tcp
可以查看目前TCP 动态端口的范围:12345 | 协议 tcp 动态端口范围---------------------------------启动端口 : 1024端口数 : 13977 |
这只是一个待选择范围,并不代表其中的所有端口都会被保留,只是有一部分会被
Hyper-V
征用。使用 netsh int ipv4 show excludedportrange protocol=tcp
命令可以查看当前所有已经被征用了的端口:123456789 | 协议 tcp 端口排除范围开始端口 结束端口---------- -------- 3296 3334 5357 5357 27339 27339 50000 50059 |
这些端口有时候会随机到一些常用端口,比如3000、3306、8080等,导致这些常用端口无法使用。
可以通过重启网络来重设随机预留的端口,但是这就和开盲盒一样,随机性太高。正确的解决思路,因该是调整TCP 动态端口范围,避开常用的端口区间。
使用管理员权限运行Powershell,执行:
12345 | netsh int ipv4 set dynamic tcp start=50000 num=15536netsh int ipv6 set dynamic tcp start=50000 num=15536# 重启网络net stop winnatnet start winnat |
把TCP 动态端口范围限定在50000-65535,重启网络,再次查看目前TCP 动态端口的范围:
12345 | 协议 tcp 动态端口范围---------------------------------启动端口 : 50000端口数 : 15536 |
这样就可以成功避开日常使用的端口,保证不会因为端口冲突导致docker等服务无法运行的问题。