2024 年,如何为 Windows 的 Linux 子系统(WSL 2)连接网络和配置代理?

7 min


对于开发者来说, 的开发环境配置一直都是不小的麻烦,由于服务器往往是 Linux 环境,在 Windows 下开发,开发者需要解决各种各样的 Linux 兼容性问题。

微软在 2016 年正式推出了 Windows 的 Linux 子系统(Windows Subsystem for Linux,简称 WSL),又在 2019 年 5 月推出了 WSL 2,WSL 2 引入了完整的 Linux 内核。

既然有了这么好的,理论上开发者就可以很轻松地在 WSL 2 上布置开发环境并进行开发了,但实际情况却是 WSL 2 还存在不少小问题,有些直到近期才得到解决。

本文主要讲讲 WSL 2 在配置方面的问题和解决方法。因为在早期版本中,WSL 2 的网络配置相对复杂。用户经常遇到的问题包括:

  • 网络隔离问题:WSL 2 默认的网络模式可能导致与宿主机的网络隔离,使得某些网络服务无法正常工作。
  • 网络配置问题:在 WSL 2 中需要做很多命令行操作,但并不是所有命令行都会走网络代理。
  • Docker 配置困难:我们有时候需要通过 Docker 在本地部署一些服务,但如果用错误的方法在 WSL 2 中安装 Docker。
  • IP 地址变动问题:每次重启 WSL 2 或 Windows 系统后,WSL 2 分配的 IP 地址会发生变化,这导致需要频繁更新服务配置。

以往为了解决这些网络问题,用户不得不采取一些手动配置的步骤,比如用脚本动态获取 IP 地址,并在系统启动时运行,但这种方法既不方便又不稳定,往往需要用户具备一定的脚本编写能力,在某些情况下还可能导致网络无法连接。

随着 WSL 2 的更新,微软也逐渐提供了更加简化的网络配置方法。在最新版本中,已经可以较为简单地解决这些问题了。

解决网络隔离问题

首先我们来解决网络隔离问题。WSL 2 在早期版本中默认使用虚拟网络适配器,导致了与宿主机的网络隔离问题。

现在,你可以在 Windows 的用户目录 C:\Users\【用户名】\ 下创建一个配置文件 .wslconfig,将内容修改如下。就可以让 WSL 2 直接访问外部网络,同时宿主机也能够访问 WSL 2 中运行的服务。

[wsl2]
networkingMode=mirrored
firewall=true
  • networkingMode:这一项设置为 mirrored 的作用是「启用镜像网络模式」,如果输入其他字符串会生成 NAT 网络。
  • firewall:如果设置为 true,则 Windows 防火墙规则以及特定于 Hyper-V 流量的规则可以筛选 WSL 网络流量。

解决网络代理配置问题

.wslconfig 文件中的 autoProxy 设置可以用来配置网络代理。你可以设置 autoProxy 为 true,这样 WSL 2 就会自动使用 Windows 的代理设置。这可以通过在 .wslconfig 文件中添加以下内容来实现:

[wsl2]
dnsTunneling=true
autoProxy=true
  • dnsTunneling:更改将 请求从 WSL 代理到 Windows 的方式。
  • autoProxy:强制 WSL 使用 Windows 的 HTTP 代理信息。
最终配置如图

解决 Docker 问题

很多人在安装 WSL 2 后,往往想以 Linux 的方式安装 Docker。但实际上在 WSL 2 中有更简便的方法来安装 Docker。

方法就是在 Windows 上安装 Docker Desktop,然后启用 WSL Integration 即可,宿主机的 Docker Desktop 会自动处理 WSL 2 的网络配置。

Docker Desktop 设置

一个踩坑经验:如果采用了这种方式,千万不要在 Windows 和 WSL 2 中同时安装 Docker,这会导致在 WSL 中执行 Docker 命令时,无法在 Docker Desktop 图形界面中看到对应的容器状态。VSCode 的也会不知道识别哪一个 Docker。解决方法也不难,就是卸载掉 WSL 中的版本。只是排查这种问题非常浪费时间,因为两个 Docker 都在正常运行,不会产生报错信息。

解决 IP 地址变动问题

关于这一点,我找到很多文章,用各种方法去固定 WSL 2 的 IP 地址,或者动态获取 WSL 2 的 IP 地址。我试过一部分,效果并不算好,往往会造成其他的问题。

后来了解到 WSL 2 的设计目的本就是在动态环境下工作,微软官方也不建议用静态 IP 地址去访问它。再加上「获取 WSL 2 IP 地址」的目的很可能就是为了解决上面的几个问题,所以我的解决方法是遵循微软的建议:通过端口转发忽略 IP 地址变动的问题

  1. 在 WSL 2 中启动你的服务:首先在 WSL 2 中启动你想要访问的服务,比如一个 Web 服务器或库。
  2. 找出服务运行的端口:确定这个服务运行在哪个端口上。例如,一个标准的 Web 服务可能运行在端口 80 或 8080 上。
  3. 使用 Windows 主机 IP 地址访问服务:你可以直接使用 Windows 主机的 IP 地址加上服务的端口来访问 WSL 2 中的服务。
    • 例如,如果你的 Windows IP 地址是 192.168.1.5,服务运行在端口 8080 上,你可以在中输入 http://192.168.1.5:8080 来访问该服务。
  4. 配置端口转发(如果需要):如果服务不在 WSL 2 和 Windows 之间自动转发,你可能需要手动设置端口转发,或者利用 VSCode 之类的工具的 GUI 界面做一层转发。
VSCode 中的实用功能:WSL 插件和端口转发 GUI

使用这种方法,你就无需担心 WSL 2 的 IP 地址变动了,只需使用 Windows 的稳定 IP 地址和适当的端口即可访问 WSL 2 中的服务。这是目前微软官方推荐的、简单且高效的方法来访问 WSL 2 中的网络服务。

参考资料:WSL 中的高级设置配置 | Microsoft Learn


Like it? Share with your friends!

0
Anonymous

Choose A Format
Story
Formatted Text with Embeds and Visuals
List
The Classic Internet Listicles
Countdown
The Classic Internet Countdowns
Open List
Submit your own item and vote up for the best submission
Ranked List
Upvote or downvote to decide the best list item
Video
Youtube and Vimeo Embeds