怎样实现WSL网络的连接?

常见问题 2025-08-22 745

最近身边不少朋友都在用Windows Subsystem for Linux(WSL)搞开发,结果卡在“网络连不上”这一步,要么是ping不通外网,要么是apt update报错,甚至有朋友折腾半天发现是防火墙把WSL的端口堵了,今天我就结合自己踩过的坑,用最接地气的方式聊聊如何正确连接WSL网络,保证连电脑小白都能看懂!

WSL网络到底是怎么工作的?

先别急着动手,先搞明白原理能少走很多弯路,WSL2和WSL1的网络模式完全不同:

如何连接WSL网络-产品亮点-产品亮点
  • WSL1:本质是“翻译层”,Windows和Linux共享同一个网络命名空间,直接用主机的IP和端口,所以网络配置简单,但性能差。
  • WSL2:基于Hyper-V虚拟化,每个WSL实例有独立的虚拟网卡(vEthernet),通过NAT和主机通信,性能接近原生Linux,但网络配置复杂。

关键点:WSL2的网络是虚拟化的,默认情况下它通过主机的“虚拟交换机”访问外网,但主机访问WSL内部服务需要额外配置端口转发。

第一步:检查基础网络是否通畅

很多人遇到网络问题,第一反应是改配置,结果发现是基础网络没通,先做这三个检查:

  1. WSL2是否能访问外网
    打开WSL终端,输入:

    ping -c 4 baidu.com

    如果显示Name or service not known,说明DNS解析失败;如果ping通但apt update失败,可能是代理问题。

  2. 主机是否能访问WSL服务
    比如你在WSL里启动了Nginx(默认端口80),在Windows浏览器输入http://localhost应该能访问,如果打不开,说明端口转发没配置。

  3. 防火墙是否拦截
    Windows防火墙可能会阻止WSL的流量,打开“控制面板 > Windows Defender防火墙 > 高级设置”,检查入站规则是否有Hyper-V Virtual Switch相关的允许规则。

真实案例:我有个朋友配置完WSL2后,curl example.com能通,但git clone失败,最后发现是公司网络限制了Git的端口,改用SSH协议就解决了。

WSL2网络配置的三大核心操作

手动设置静态IP(避免IP变化)

WSL2默认每次启动都会分配新IP,导致主机访问WSL服务时需要频繁查IP,解决方法是给WSL2分配静态IP:

  1. 在Windows中以管理员身份运行PowerShell,输入:

    Get-NetAdapter "vEthernet (WSL)" | Select-Object Name, InterfaceDescription

    记下vEthernet (WSL)的网卡名称。

  2. 创建静态IP配置文件(比如C:\wsl_static_ip.xml如下:

    <StaticIP xmlns="http://schemas.microsoft.com/wsl/2019/09/switchconfig">
      <Interface Name="vEthernet (WSL)" Address="192.168.100.1" Mask="255.255.255.0">
        <Gateway Address="192.168.100.254"/>
      </Interface>
    </StaticIP>

    (IP段需和主机不在同一网段,比如主机是168.1.x,WSL2可以用168.100.x

  3. 重启WSL并应用配置:

    wsl --shutdown
    netsh interface ip set address name="vEthernet (WSL)" static 192.168.100.1 255.255.255.0 192.168.100.254

配置端口转发(主机访问WSL服务)

比如你想在Windows访问WSL里的MySQL(默认端口3306),需要手动转发:

  1. 在PowerShell中执行:

    netsh interface portproxy add v4tov4 listenport=3306 listenaddress=0.0.0.0 connectport=3306 connectaddress=192.168.100.1

    168.100.1替换为你设置的WSL2静态IP)

  2. 验证是否生效:

    netsh interface portproxy show all

进阶技巧:如果需要转发多个端口,可以写个批处理脚本一键配置,

@echo off
netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=192.168.100.1
netsh interface portproxy add v4tov4 listenport=3306 listenaddress=0.0.0.0 connectport=3306 connectaddress=192.168.100.1

解决DNS解析问题

WSL2默认使用Windows的DNS,如果遇到ping通但域名解析失败,可以手动指定DNS:

  1. 编辑WSL中的/etc/wsl.conf(没有则创建),添加:

    [network]
    generateResolvConf = false
  2. 手动创建/etc/resolv.conf为:

    nameserver 8.8.8.8
    nameserver 8.8.4.4
  3. 重启WSL生效:

    sudo chattr +i /etc/resolv.conf  # 防止WSL自动覆盖
    wsl --shutdown

常见问题排查清单

  1. WSL2启动后网络不通

    • 检查wsl -l -v是否显示“Running”
    • 执行wsl --shutdown后重新启动
    • 更新WSL内核:wsl --update
  2. 端口转发无效

    • 确认防火墙允许inboundoutbound的对应端口
    • 检查WSL服务是否监听所有接口(ss -tulnp | grep 3306
    • 避免端口冲突(比如Windows已占用3306)
  3. 速度慢或丢包

    • 关闭Windows的“随机硬件地址”(设置 > 网络 > Wi-Fi > 硬件属性)
    • 升级到WSL2(WSL1性能差)
    • 检查主机网络是否稳定(比如Wi-Fi信号弱)

终极懒人方案:一键配置脚本

如果你懒得手动操作,这里有个整合脚本(需以管理员身份运行):

@echo off
:: 设置WSL2静态IP
netsh interface ip set address name="vEthernet (WSL)" static 192.168.100.1 255.255.255.0 192.168.100.254
:: 配置端口转发
netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=192.168.100.1
netsh interface portproxy add v4tov4 listenport=3306 listenaddress=0.0.0.0 connectport=3306 connectaddress=192.168.100.1
:: 添加防火墙规则
netsh advfirewall firewall add rule name="WSL2_Port_80" dir=in action=allow protocol=TCP localport=80
netsh advfirewall firewall add rule name="WSL2_Port_3306" dir=in action=allow protocol=TCP localport=3306
echo WSL2网络配置完成!请重启WSL生效。
pause

WSL网络配置的核心逻辑

  1. WSL2是虚拟机:它的网络和主机隔离,需要通过NAT或端口转发通信。
  2. 静态IP+端口转发:解决主机访问WSL服务的问题。
  3. DNS和防火墙:80%的网络问题源于这两点。

最后提醒:如果公司

怎样开启Windows子系统WSL以实现效率提升?
« 上一篇 2025-08-22

文章评论

设置好WSL的IP和主机文件后,网络连通超顺畅!