### [为什么在 WSL2 中设置 /etc/wsl.conf 后无法访问外网?详细教程帮你解决!](https://dashen.wang/article/39005) **Published:** 2024-06-24T01:40:04 **Author:** 大神 **Excerpt:** 在这篇文章中,我们将探讨为什么在 WSL2 中设置 后会导致无法访问外网的问题,并提供详细的解决方法。我们将一步步指导你如何配置 WSL2 以实现既能访问外网,又能正常使用服务的目标。 前言 在使用 Windows Subsystem for Linux 2 (WSL2) 时,很多用户都会遇到配置网络的问题。尤其是在设置了 后,可能会导致无法访问外网,但删除该文件后又无法使用某些服务。这篇文章将详细解析这个问题,并提供有效的解决方案。 环境配置 系统版本:Windows 11 专业工作站版 23H2 WSL 版本:2.2.4.0 内核版本:5.15.153.1-2 WSLg 版本:1.0.61 MSRDC 版本:1.2.5326 Direct3D 版本:1.611.1-81528511 DXCore 版本:10.0.26091.1-240325-1447.ge-release Windows 版本:10.0.22631.3447 .wslconfig (windows) 配置如下: /etc/wsl.conf 配置如下: /etc/resolv.conf 配置如下: 问题分析 在设置 并且 后,WSL2 无法访问外网的主要原因可能是 DNS 配置的问题。当 WSL2 使用自定义的 DNS 配置时,可能会导致与 Windows 主机的网络配置不匹配,从而无法正确解析外部地址。 解决方案… 在这篇文章中,我们将探讨为什么在 WSL2 中设置 `/etc/wsl.conf` 后会导致无法访问外网的问题,并提供详细的解决方法。我们将一步步指导你如何配置 WSL2 以实现既能访问外网,又能正常使用服务的目标。 * * * ## 前言 在使用 Windows Subsystem for Linux 2 (WSL2) 时,很多用户都会遇到配置网络的问题。尤其是在设置了 `/etc/wsl.conf` 后,可能会导致无法访问外网,但删除该文件后又无法使用某些服务。这篇文章将详细解析这个问题,并提供有效的解决方案。 ## 环境配置 **系统版本**:Windows 11 专业工作站版 23H2 **WSL 版本**:2.2.4.0 内核版本:5.15.153.1-2 WSLg 版本:1.0.61 MSRDC 版本:1.2.5326 Direct3D 版本:1.611.1-81528511 DXCore 版本:10.0.26091.1-240325-1447.ge-release Windows 版本:10.0.22631.3447 **.wslconfig (windows)** 配置如下: ``` [wsl2] memory=20GB #限制最大内存 processors=8 #限制线程数 localhostforwarding=true nestedVirtualization=true guiApplications=true [experimental] autoMemoryReclaim=gradual # gradual | dropcache | disabled networkingMode=mirrored dnsTunneling=true firewall=true autoProxy=true sparseVhd=true [network] generateResolvConf = false ``` **/etc/wsl.conf 配置如下:** ``` [boot] systemd=true [network] generateResolvConf = false [user] default = root ``` **/etc/resolv.conf 配置如下:** ``` nameserver 8.8.8.8 nameserver 8.8.4.4 ``` ## 问题分析 在设置 `/etc/wsl.conf` 并且 `generateResolvConf = false` 后,WSL2 无法访问外网的主要原因可能是 DNS 配置的问题。当 WSL2 使用自定义的 DNS 配置时,可能会导致与 Windows 主机的网络配置不匹配,从而无法正确解析外部地址。 ## 解决方案 ### 方案一:让 WSL2 使用 Windows 的 DNS 1. **修改 `/etc/wsl.conf`**,确保 `generateResolvConf` 为 `true`: ``` [boot] systemd=true [network] generateResolvConf = true ``` 2. **重启 WSL2**: 在 PowerShell 中运行以下命令: ``` wsl --shutdown wsl ``` 3. **检查 `/etc/resolv.conf`** 文件是否自动生成并包含正确的 DNS 服务器: ``` cat /etc/resolv.conf ``` 确保里面包含类似以下内容: ``` nameserver 172.XX.XX.XX # 这里的IP应该是Windows虚拟网络的DNS地址 ``` ### 方案二:手动设置静态 IP 和 DNS 1. **创建外部虚拟交换机**: 在 Hyper-V 管理器中,创建一个外部虚拟交换机。 2. **修改 `.wslconfig`**,使用桥接模式并设置固定 IP: ``` [wsl2] networkingMode=bridged vmSwitch=你创建的虚拟交换机名称 dhcp=false ``` 3. **设置 WSL2 的网络配置**: 创建或修改 `/lib/systemd/network/wsl_external.network` 文件: ``` [Match] Name=eth0 [Network] Description=bridge DHCP=false Address=192.168.1.10/24 # 自行修改 Gateway=192.168.0.1 # 自行修改 ``` 4. **修改 DNS 设置,禁止自动生成**: 在 `/etc/wsl.conf` 中加入以下内容: ``` [boot] systemd=true [network] generateResolvConf = false ``` 删除现有的 `/etc/resolv.conf` 文件,并手动设置 DNS: ``` sudo rm -f /etc/resolv.conf echo "nameserver 223.5.5.5" | sudo tee /etc/resolv.conf ``` 5. **重启 WSL2**: ``` wsl --shutdown wsl ``` ### 方案三:使用 `mirrored` 模式共享外部 IP 1. **配置 `.wslconfig`** 使用 `mirrored` 模式: ``` [wsl2] networkingMode=mirrored dnsTunneling=true autoProxy=true firewall=true [experimental] sparseVhd=true autoMemoryReclaim=gradual hostAddressLoopback=true ``` 2. **重启 WSL2**: ``` wsl --shutdown wsl ``` 在 `mirrored` 模式下,WSL2 和 Windows 主机共享同一个外部 IP,这样可以确保 WSL2 可以顺利访问外网。 ## 验证网络连接 1. **在 WSL2 中验证网络连接**: ``` ping google.com ``` 如果可以 ping 通,说明网络配置成功。 2. **在 Windows 主机中访问 WSL2 服务**: 使用 `ipconfig` 查看 Windows 虚拟网卡的 IP 地址,并确保可以通过该 IP 访问 WSL2 中运行的服务。 ## 结论 通过以上几个解决方案,你应该能够解决在 WSL2 中设置 `/etc/wsl.conf` 后无法访问外网的问题。无论是使用 Windows 的 DNS,手动设置静态 IP 和 DNS,还是使用 `mirrored` 模式共享外部 IP,都可以帮助你实现既能访问外网,又能正常使用服务的目标。 希望这篇文章对你有所帮助。如果有其他问题或建议,欢迎在评论区留言讨论。 **Tags:** Linux, Windows, 教程, 硬件, 网络 **Categories:** 技术折腾 ---