怎样实现WSL网络的连接?
最近身边不少朋友都在用Windows Subsystem for Linux(WSL)搞开发,结果卡在“网络连不上”这一步,要么是ping
不通外网,要么是apt update
报错,甚至有朋友折腾半天发现是防火墙把WSL的端口堵了,今天我就结合自己踩过的坑,用最接地气的方式聊聊如何正确连接WSL网络,保证连电脑小白都能看懂!
WSL网络到底是怎么工作的?
先别急着动手,先搞明白原理能少走很多弯路,WSL2和WSL1的网络模式完全不同:

- WSL1:本质是“翻译层”,Windows和Linux共享同一个网络命名空间,直接用主机的IP和端口,所以网络配置简单,但性能差。
- WSL2:基于Hyper-V虚拟化,每个WSL实例有独立的虚拟网卡(vEthernet),通过NAT和主机通信,性能接近原生Linux,但网络配置复杂。
关键点:WSL2的网络是虚拟化的,默认情况下它通过主机的“虚拟交换机”访问外网,但主机访问WSL内部服务需要额外配置端口转发。
第一步:检查基础网络是否通畅
很多人遇到网络问题,第一反应是改配置,结果发现是基础网络没通,先做这三个检查:
-
WSL2是否能访问外网
打开WSL终端,输入:ping -c 4 baidu.com
如果显示
Name or service not known
,说明DNS解析失败;如果ping
通但apt update
失败,可能是代理问题。 -
主机是否能访问WSL服务
比如你在WSL里启动了Nginx(默认端口80),在Windows浏览器输入http://localhost
应该能访问,如果打不开,说明端口转发没配置。 -
防火墙是否拦截
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:
-
在Windows中以管理员身份运行PowerShell,输入:
Get-NetAdapter "vEthernet (WSL)" | Select-Object Name, InterfaceDescription
记下
vEthernet (WSL)
的网卡名称。 -
创建静态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
) -
重启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),需要手动转发:
-
在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) -
验证是否生效:
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:
-
编辑WSL中的
/etc/wsl.conf
(没有则创建),添加:[network] generateResolvConf = false
-
手动创建
/etc/resolv.conf
为:nameserver 8.8.8.8 nameserver 8.8.4.4
-
重启WSL生效:
sudo chattr +i /etc/resolv.conf # 防止WSL自动覆盖 wsl --shutdown
常见问题排查清单
-
WSL2启动后网络不通
- 检查
wsl -l -v
是否显示“Running” - 执行
wsl --shutdown
后重新启动 - 更新WSL内核:
wsl --update
- 检查
-
端口转发无效
- 确认防火墙允许
inbound
和outbound
的对应端口 - 检查WSL服务是否监听所有接口(
ss -tulnp | grep 3306
) - 避免端口冲突(比如Windows已占用3306)
- 确认防火墙允许
-
速度慢或丢包
- 关闭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网络配置的核心逻辑
- WSL2是虚拟机:它的网络和主机隔离,需要通过NAT或端口转发通信。
- 静态IP+端口转发:解决主机访问WSL服务的问题。
- DNS和防火墙:80%的网络问题源于这两点。
最后提醒:如果公司
文章评论
设置好WSL的IP和主机文件后,网络连通超顺畅!