【WSL2】使WSL2网络与Windows完全一致(镜像网络)

WSL2 2023年秋季的这次更新彻底解决了WSL2长期以来的网络连接难题,带来了原生级体验

引入

一年前使用过几次WSL2,那个时候WSL2的网络问题就令我头大,特别是需要访问部分外网资源的时候,为了共享主机的代理实在是花了我一番功夫,详细可以查看【WSL2】在WSL2中开启HTTP代理。后面因为C盘空间不足,转用vmware下的linux虚拟机环境进行开发,WSL2就很长时间不用了。

最近因为部分原因又要开始使用WSL2,又被网络问题折磨的头大,后面搜索解决方式的时候发现,2023年秋季的WSL2更新几乎已经彻底解决了WSL2长期以来的网络连接难题,故有了此文。

WSL2 2.0的更新特性

WSL2 2.0 版本,有如下以下特性:

  • 支持自动回收内存
  • 支持自动释放 WSL2 虚拟硬盘空间
  • 支持和 Windows 使用相同的网络(镜像网络)
  • 支持 DNS Tunneling
  • 支持 Windows 设置的代理
  • 支持 Windows 防火墙
  • 支持 Multicast

详细可以前往:Windows Subsystem for Linux September 2023 update

开启方法

更新系统版本到 23H2 及以上,然后把 WSL2 更新到 2.0.0 或以上版本
在 %userprofile%.wslconfig 中写入以下内容然后保存:

[experimental]
autoMemoryReclaim=gradual # 选择gradual 、dropcache 、disabled之一
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
sparseVhd=true

接着运行 wsl --manage 发行版名字 --set-sparse true 启用稀疏 VHD 允许 WSL2 的硬盘空间自动回收,比如 wsl --manage Ubuntu --set-sparse true

最后,若有使用 VSCode 中 WSL 插件的,建议在 VSCode 的设置中把自动端口转发关掉(Remote: Auto Forward Ports),避免冲突,因为 WSL2 此时已经和 Windows 是同一个IP地址了,不再需要端口转发了。

配置选项解释

不想了解具体选项含义的,知道我们上面的配置已经把上面所提及的WSL2 2.0的更新特性几乎全部开启就行了,这个section可以直接跳过。

networkingMode=mirrored(镜像网络模式)

表明启用了镜像网络,它让 WSL2 实例与 Windows 主机共享同一个网络栈,意味着它们将拥有相同的 IP 地址(无论是本地回环地址 127.0.0.1还是局域网 IP)。这彻底改变了之前 NAT 模式下的网络隔离状况。这意味着:

  • Windows 和 WSL2 可以通过 localhost 互相访问对方的服务
  • 局域网内的其他设备也可以通过 Windows 主机的IP地址访问 WSL2 中的所有服务,无需撰写复杂的端口转发规则。
  • 另外,该模式原生支持 IPv6 网络!

autoProxy=true(自动代理)

当此选项启用时,WSL2 会自动检测并使用我们在 Windows 系统中设置的 HTTP 代理配置。无需在 WSL2 内部的 Linux 发行版中手动设置代理环境变量(如 http_proxy)。

dnsTunneling=true(DNS 隧道)

此功能让 WSL2 的 DNS 请求通过一个虚拟化通道由 Windows 来处理和响应,而不是直接发送网络包来解析。启用此功能(true)可以显著提高在复杂网络环境下的 DNS 解析可靠性,特别是在使用 V2rayN/Clash 这一类的代理软件时,能有效避免 DNS 解析失败或污染的问题。

firewall=true(Windows 防火墙集成)

此选项启用 Hyper-V 防火墙功能,使得 Windows 防火墙的规则能够同样应用于 WSL2 子系统的网络流量。这意味着可以像管理 Windows 应用一样,通过 Windows 防火墙控制 WSL2 内应用的网络访问(入站和出站)。首次启用时,Windows 防火墙可能会弹出提示,需要我们允许 WSL2 相关网络的通信。

autoMemoryReclaim=gradual(自动内存回收)

此功能用于解决 WSL2 虚拟机(VM)长时间运行后内存占用不断增长却不会自动释放的问题。它提供了三种回收策略:

  • gradual(渐进的):在检测到 CPU 空闲时,逐步、缓慢地释放缓存内存。这是平衡性能和内存占用的推荐选项。
  • dropcache(立即的):更积极地在分配的内存占满后立即回收缓存。
  • disabled(禁用):关闭自动内存回收功能。

sparseVhd=true(稀疏虚拟硬盘)

此功能允许 WSL2 的虚拟硬盘(VHD)文件自动回收未使用的空间。当在 WSL2 内删除文件后,其占用的空间能够被返还给 Windows 系统。设置为 true可以防止 WSL2 的虚拟硬盘文件无限膨胀,无需再手动执行 wsl --shutdown和 diskpart等命令来压缩 VHD 文件。

更新后在 WSL2 中使用 Docker

另外如果需要在 WSL2 里使用 docker,应该将 autoMemoryReclaim 配置为 dropcache 或者 disabled,然后在 /etc/docker/daemon.json 中添加配置选项 "iptables": false ,否则可能无法正常使用 docker。

这是由于autoMemoryReclaim功能旨在解决 WSL2 虚拟机内存占用只增不减的问题。但当它在回收缓存时,可能会清除掉 Docker 容器运行所依赖的内存页面,从而导致容器进程因内存访问错误而意外终止或无法启动。因此需要设置为 dropcache 或者 disabled 。

同时,Docker 默认会尝试操作 Linux 系统内部的 iptables规则来管理容器网络的端口转发和访问控制。在镜像网络模式下,网络包的路由和过滤理应由 Windows 主机的网络栈(包括 Windows 防火墙)来主导。如果 Docker 再自行修改 WSL2 内部的 iptables,就会产生规则冲突,可能导致容器网络无法正常工作。通过在 Docker 的配置文件 /etc/docker/daemon.json中添加 "iptables": false,就是明确告知 Docker 不要插手 iptables规则,将网络管理的职责完全交给外部的镜像网络模式,从而避免冲突。

参考文献

© 版权声明
THE END
努力变成更好的自己
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容