# 2024 年，如何为 Windows 的 Linux 子系统（WSL 2）解决网络问题？

> 本文开放前 70% 正文，剩余内容会员可见。

原文：https://utgd.net/article/20564

对于软件开发者来说，Windows 的开发环境配置一直都是不小的麻烦，由于服务器往往是 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：更改将 DNS 请求从 WSL 代理到 Windows 的方式。

- autoProxy：强制 WSL 使用 Windows 的 HTTP 代理信息。

## 解决 Docker 问题

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

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

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

---

[前往标准阅读页](https://utgd.net/article/20564?audience=web)
