WSL2 网络模式详解与配置笔记
本文详细介绍 WSL2 的两种主流网络模式:NAT(默认)、镜像(Mirrored),包含架构原理、完整配置步骤、适用场景与排障命令。
注:WSL 曾提供桥接模式(Bridged),但自 WSL 2.4.5 起已被微软官方弃用,不再维护,本文不再介绍。官方推荐以镜像模式替代。
目录
一、NAT 模式(默认模式)
1.1 架构原理
WSL2 底层是运行在 Hyper-V 虚拟化平台上的轻量级虚拟机。NAT 模式使用 WSL 虚拟交换机(vSwitch)+ 网络地址转换:
- WSL 实例获得 172.16.0.0/12 或 192.168.x.x 网段的私有 IP(每次重启可能变化)
- Windows 宿主机上生成一块
vEthernet (WSL)虚拟网卡作为网关 - 出站流量经 NAT 伪装成宿主机 IP 出去,WSL 访问外网无任何障碍
1.2 连通性矩阵
| 方向 | 行为 |
|---|---|
| WSL → 外网 | ✅ 直接通(NAT 伪装) |
| WSL → 宿主机 | ✅ 访问宿主机 IP 即可(宿主机防火墙可能拦截) |
| 宿主机 → WSL | ⚠️ localhost 可通,但 WSL IP 直连常有坑 |
| 局域网其他机器 → WSL | ❌ 完全不可达(除非配端口代理) |
1.3 localhost 自动转发
NAT 模式下,Windows 访问 localhost:<端口> 会自动转发到 WSL 中监听的端口,前提是:
- WSL 内服务监听
0.0.0.0(不能只监听127.0.0.1) wslhost.exe/wslrelay.exe进程正常工作
注意:localhost 走的是转发通道,而
172.24.x.x直连走的是路由 + Hyper-V 防火墙策略,两条路径的拦截规则不同。这会导致"localhost 能连、WSL IP 连不上"或时通时不通的现象。
1.4 配置方法
NAT 是默认模式,无需任何配置。但为应对"局域网不可达"和"WSL IP 浮动"问题,通常需要配置端口代理(portproxy)。
场景 A:局域网机器访问 WSL 服务
以把 WSL 内 MongoDB(27017)映射到宿主机 27024 为例:
# 添加端口代理(管理员 PowerShell)
netsh interface portproxy add v4tov4 listenport=27024 listenaddress=0.0.0.0 connectport=27017 connectaddress=172.24.160.20
# 查看所有端口代理
netsh interface portproxy show all
# 删除指定代理
netsh interface portproxy delete v4tov4 listenport=27024 listenaddress=0.0.0.0
# 同时需要放行 Windows 防火墙入站规则
New-NetFirewallRule -DisplayName "WSL-MongoDB-27024" -Direction Inbound -Protocol TCP -LocalPort 27024 -Action Allow
场景 B:应对 WSL IP 重启后变化
WSL 重启后 IP 改变会导致 portproxy 失效,可用脚本在每次启动时自动更新:
# update-wsl-portproxy.ps1
$wslIp = (wsl -d <发行版名称> hostname -I).Trim().Split()[0]
netsh interface portproxy delete v4tov4 listenport=27024 listenaddress=0.0.0.0
netsh interface portproxy add v4tov4 listenport=27024 listenaddress=0.0.0.0 connectport=27017 connectaddress=$wslIp
Write-Host "端口代理已更新:27024 -> ${wslIp}:27017"
将此脚本挂到 Windows 任务计划程序(登录时触发)即可自动化。
1.5 优缺点
优点:零配置开箱即用;WSL 访问外网无任何障碍。
缺点:IP 浮动不稳定;局域网不可达;防火墙层次多(Windows 防火墙 + Hyper-V 防火墙策略 + WSL 内部防火墙),排障复杂;VPN 环境下容易断网。
二、镜像模式(Mirrored Mode)
推荐模式,需 Windows 11 22H2 及以上。
2.1 架构原理
镜像模式不再创建独立 NAT 网段,而是把宿主机的网络接口"镜像"进 WSL,两者共享同一套 IP 和网络栈:
2.2 特性
| 特性 | 说明 |
|---|---|
| IP 地址 | 与宿主机一致,不再有 172.x 浮动私有 IP |
| localhost | ✅ 双向完全互通(WSL 里也能访问 Windows 的 localhost 服务) |
| 局域网可达性 | ✅ 局域网机器直接访问宿主机 IP 即可连到 WSL 服务 |
| IPv6 | 完整支持 |
| VPN 兼容性 | ✅ 大幅改善 |
| Hyper-V 防火墙问题 | 基本消失(不再走 vSwitch 路由层) |
| 端口冲突 | ⚠️ WSL 与 Windows 监听同一端口会冲突 |
2.3 访问地址选择:本机用 127.0.0.1,局域网用宿主机 IP
镜像模式的一个重要特性(不是故障):从宿主机本机用自己的局域网 IP(如 192.168.1.100)连接 WSL 服务,流量不会进入 WSL。Windows 发现目标 IP 是自己的,直接在本地 TCP 栈处理——本机没有程序监听该端口,连接即失败。只有 127.0.0.1(localhost)会被特殊中继进 WSL。
| 访问来源 | 应使用的地址 |
|---|---|
| 宿主机本机(Navicat、浏览器、SSH 客户端等) | 127.0.0.1:<端口> |
| 局域网其他机器 | 宿主机IP:<端口>(如 192.168.1.100) |
典型现象:本机
Test-NetConnection 192.168.1.100 -Port 2222失败,而127.0.0.1 -Port 2222成功——这是设计行为,不是网络故障。
2.4 配置方法
步骤 1:确认系统版本
# 需 Windows 11 22H2 (Build 22621) 及以上
winver
# 确保 WSL 为最新版本
wsl --update
wsl --version
步骤 2:编辑 .wslconfig
在 Windows 用户目录创建/编辑 C:\Users\<用户名>\.wslconfig:
[wsl2]
networkingMode=mirrored
# ===== 可选的附加配置(注释必须独立成行,不能写在值后面)=====
# DNS 隧道,改善 VPN/代理环境下的 DNS 解析
dnsTunneling=true
# 让 Windows 防火墙规则同步应用到 WSL 内部
firewall=true
# 自动继承 Windows 系统代理设置
autoProxy=true
⚠️ 注意:
.wslconfig不支持行内注释。#注释必须独立成行,写在配置值后面会被当作值的一部分,导致配置失效。
各选项说明:
| 选项 | 作用 | 建议 |
|---|---|---|
networkingMode=mirrored |
启用镜像模式 | 必填 |
dnsTunneling=true |
DNS 请求经由宿主机隧道转发,解决 VPN 下解析失败 | 使用 VPN 时必开 |
firewall=true |
Windows 防火墙规则同时作用于 WSL | 建议开启,便于统一管控 |
autoProxy=true |
WSL 自动使用 Windows 的 HTTP 代理 | 使用代理时开启 |
步骤 3:重启 WSL 生效
wsl --shutdown
# 重新进入 WSL
wsl -d <发行版名称>
步骤 4:验证
# WSL 内查看 IP —— 应与宿主机一致
ip addr
# 测试 localhost 双向互通
# WSL 内访问 Windows 上的服务,例如 Windows 跑了 8080 端口:
curl http://localhost:8080
# Windows 侧访问 WSL 服务,直接用 localhost 或宿主机 IP
Test-NetConnection -ComputerName localhost -Port 27017
2.5 优缺点
优点:localhost 双向互通;局域网直接可达;IP 稳定;VPN 兼容好;防火墙统一管理。
缺点:仅支持 Win11 22H2+;与 Windows 共享端口空间(同端口冲突);部分旧版企业安全软件可能不兼容。
三、两种模式对比
| 维度 | NAT(默认) | 镜像(Mirrored) |
|---|---|---|
| 系统要求 | 所有版本 | Win11 22H2+ |
| WSL 访问外网 | ✅ | ✅ |
| localhost 互通 | 宿主机→WSL 单向 | ✅ 双向 |
| 局域网访问 WSL | ❌ 需 portproxy | ✅ |
| IP 稳定性 | ❌ 重启会变 | ✅ 与宿主机相同 |
| VPN 兼容性 | ⚠️ 差 | ✅ 好 |
| 防火墙复杂度 | 高(多层防火墙 + Hyper-V 策略) | 低(统一 Windows 防火墙) |
| 配置复杂度 | 零配置 | 低(.wslconfig 几行) |
| 端口冲突风险 | 无 | 有(共享端口空间) |
| Wi-Fi 环境 | ✅ 可用 | ✅ 可用 |
四、场景选型建议
| 场景 | 推荐模式 | 理由 |
|---|---|---|
| 日常开发,仅本机访问 WSL 服务 | NAT 或镜像 | NAT 零配置;镜像体验更好 |
| Win11 22H2+,本机/局域网都要访问 | 镜像 | 一劳永逸,localhost 双向互通 |
| 公司/家庭局域网多机访问 WSL 服务 | 镜像 或 NAT+portproxy | 镜像最省事;Win10 只能用 portproxy |
| 频繁使用 VPN / 公司安全客户端 | 镜像 | NAT 模式下 VPN 极易断 WSL 网 |
| 纯 Wi-Fi 环境 | 镜像 或 NAT | 两者均不依赖有线网卡 |
| Windows 10 环境 | NAT + portproxy | 镜像模式不可用 |
五、防火墙分层配置
镜像模式下防火墙分两层:
推荐方案:单层防火墙(默认首选)
只保留 Windows 防火墙,WSL 内部的 ufw / firewalld 全部禁用。开放端口只需:
New-NetFirewallRule -DisplayName "WSL-服务名-端口" -Direction Inbound -Protocol TCP -LocalPort <端口> -Action Allow
进阶方案:启用 WSL 内部防火墙(三条铁律)
- 只在一个发行版里启用一个防火墙——多发行版同时启用必然规则打架,firewalld 还会与 Docker 冲突。建议选 Ubuntu 的 ufw。
- 显式放行所有业务端口(规则对全部发行版生效):
# ufw(Ubuntu)
sudo ufw allow 2222/tcp
sudo ufw allow 27017/tcp
sudo ufw enable
# firewalld(RHEL 系)
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
- 变更后必须验证:
sudo ufw status verbose/firewall-cmd --list-all,再用Test-NetConnection 127.0.0.1 -Port <端口>逐个确认。
⚠️ 注意:
systemctl stop firewalld只是临时停止,发行版重启后会自动恢复;彻底关闭必须systemctl disable --now。
速查对照
| 操作 | 位置 | 命令 |
|---|---|---|
| 开放端口(边界) | Windows | New-NetFirewallRule ... -LocalPort <端口> |
| 开放端口(内部,可选) | 仅一个发行版 | ufw allow <端口>/tcp |
| 排查"监听正常但连不上" | WSL | ss -tlnp + sudo iptables -L INPUT -n -v 看 policy 是否 DROP |
| 排查防火墙状态 | 各发行版 | ufw status(Ubuntu)/ systemctl status firewalld(RHEL 系) |
六、通用排障命令速查
Windows 侧
# 彻底重启 WSL 网络栈(大部分网络问题的万能第一步)
wsl --shutdown
# 查看 Hyper-V 防火墙策略(NAT 直连失败时重点检查)
Get-NetFirewallHyperVVMSetting -PolicyStore ActiveStore
# 查看 / 配置端口代理
netsh interface portproxy show all
# 确认 vEthernet (WSL) 网卡状态与网段
ip addr | findstr 172.24
# 测试端口连通性
Test-NetConnection -ComputerName <WSL_IP> -Port <端口>
# 更新 WSL 到最新版本
wsl --update
WSL 侧
# 确认当前 IP
ip addr
# 确认服务监听地址(必须是 0.0.0.0 或具体网卡 IP,不能只监听 127.0.0.1)
ss -tlnp | grep <端口>
# 检查 WSL 内部防火墙(Ubuntu)
sudo ufw status
# 检查 DNS 解析
cat /etc/resolv.conf
nslookup baidu.com
典型症状与处理
| 症状 | 可能原因 | 处理 |
|---|---|---|
| localhost 能连,WSL IP 连不上 | localhost 转发通道与直连路由是两条路径,Hyper-V 防火墙拦截 | 优先用 localhost;或 wsl --shutdown 重启网络栈 |
| 时通时不通,重启后恢复 | NAT 模式下 WSL IP 变化 / 转发进程异常 | 切换镜像模式根治 |
| Navicat 等工具连不上 WSL 数据库 | 服务只监听 127.0.0.1,或防火墙拦截 | 确认 ss -tlnp 监听 0.0.0.0;检查多层防火墙 |
| 端口在监听但连接 timeout(丢包) | 任一发行版里的 ufw/firewalld 规则 DROP(共享网络栈,影响所有发行版) | sudo iptables -L INPUT -n -v 看 policy;到对应发行版放行端口或 disable --now |
| 局域网机器完全无法访问 WSL | NAT 模式入站无映射 | 配置 portproxy,或切镜像模式 |
| 开 VPN 后 WSL 断网 / DNS 失败 | NAT 与 VPN 路由冲突 | 切镜像模式并开启 dnsTunneling=true |
文档更新时间:2026-07-21|适用环境:Windows 10/11 + WSL2

浙公网安备 33010602011771号