WSL2 网络模式详解与配置笔记

本文详细介绍 WSL2 的两种主流网络模式:NAT(默认)、镜像(Mirrored),包含架构原理、完整配置步骤、适用场景与排障命令。

注:WSL 曾提供桥接模式(Bridged),但自 WSL 2.4.5 起已被微软官方弃用,不再维护,本文不再介绍。官方推荐以镜像模式替代。


目录


一、NAT 模式(默认模式)

1.1 架构原理

WSL2 底层是运行在 Hyper-V 虚拟化平台上的轻量级虚拟机。NAT 模式使用 WSL 虚拟交换机(vSwitch)+ 网络地址转换

flowchart TB subgraph WIN["Windows 宿主机"] PHY["物理网卡<br/>192.168.x.x / 公网"] VSW["Hyper-V 虚拟交换机 (WSL)"] VETH["vEthernet (WSL) 适配器<br/>172.24.x.1(NAT 网关)"] subgraph WSLVM["WSL2 虚拟机"] ETH0["eth0: 172.24.160.20<br/>⚠️ 每次重启 WSL,IP 可能变化"] end PHY --> VSW --> VETH --> ETH0 end EXT["外网 / 局域网"] --> PHY
  • 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 和网络栈:

flowchart TB EXT["局域网其他机器"] --> PHY subgraph WIN["Windows 宿主机"] PHY["物理网卡: 192.168.1.100"] subgraph WSLVM["WSL2(镜像模式)"] ETH0["eth0: 192.168.1.100<br/>(与宿主机同 IP)"] LO["localhost 与宿主机双向互通"] end PHY --- WSLVM end

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 镜像模式不可用

五、防火墙分层配置

镜像模式下防火墙分两层:

flowchart TB EXT["局域网 / 外部"] --> L1 subgraph L1["第一层:Windows 防火墙(边界防护)"] NOTE[".wslconfig 配置 firewall=true 时<br/>规则会同步进 WSL"] subgraph L2["第二层:WSL 内部防火墙(ufw / firewalld)"] WARN["⚠️ 所有发行版共享同一网络栈<br/>任一发行版启用的规则对全部生效"] end end

推荐方案:单层防火墙(默认首选)

只保留 Windows 防火墙,WSL 内部的 ufw / firewalld 全部禁用。开放端口只需:

New-NetFirewallRule -DisplayName "WSL-服务名-端口" -Direction Inbound -Protocol TCP -LocalPort <端口> -Action Allow

进阶方案:启用 WSL 内部防火墙(三条铁律)

  1. 只在一个发行版里启用一个防火墙——多发行版同时启用必然规则打架,firewalld 还会与 Docker 冲突。建议选 Ubuntu 的 ufw。
  2. 显式放行所有业务端口(规则对全部发行版生效):
# 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
  1. 变更后必须验证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

posted @ 2026-07-21 14:57  RK5123153  阅读(155)  评论(0)    收藏  举报