为什么在 WSL2 中设置 /etc/wsl.conf 后无法访问外网?详细教程帮你解决!

在这篇文章中,我们将探讨为什么在 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,确保 generateResolvConftrue

    [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,都可以帮助你实现既能访问外网,又能正常使用服务的目标。

希望这篇文章对你有所帮助。如果有其他问题或建议,欢迎在评论区留言讨论。

声明:本站所有文章,如无特殊说明或标注,均为本站(王大神)原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
指数词

为什么微软要将 Copilot 集成到 Edge 浏览器的加密钱包中?

2024-6-24 9:06:04

指数词

为什么AI技术能让耳机“看一眼”就锁定你想听的声音?

2024-6-24 14:27:54

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索