WSL 网络配置实战指南:NAT、镜像、桥接 3 种模式怎么选、怎么配
【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL
这篇文章带你看懂 Windows Subsystem for Linux(WSL)里的网络配置。WSL 让你在 Windows 上直接跑 Linux,而它能不能上网、能不能被局域网访问、能不能和 Windows 共享本地端口,全取决于一种叫networkingMode(网络模式)的设置。读完本文,你能独立判断该用哪种模式、写好%UserProfile%\.wslconfig里的配置,并验证它真的生效。
这一节帮你解决"到底该选哪种模式"
先建立一个直觉:WSL2 的 Linux 运行在一台轻量虚拟机里,它和 Windows 之间隔着一层"网络边界"。边界怎么画,决定了 Linux 里的localhost(指向自己本机的地址)还等不等于 Windows 的localhost。
官方支持三种networkingMode,用一张表先压住信息:
| 模式 | 默认? | Linux 有独立 IP? | 和 Windows 共享 localhost? | 适合场景 |
|---|---|---|---|---|
| NAT | 是 | 有(虚拟网段,如 172.x) | 仅靠端口转发单向打通 | 日常开发、跑容器、不折腾 |
| mirrored(镜像) | 否 | 与 Windows 同网段 | 是,双向直接互通 | 前端连后端、需要 Windows 直接访问 Linux 服务 |
| bridged(桥接) | 否 | 有(来自真实网卡,可被局域网访问) | 否,Linux 成为网络里的独立节点 | 局域网内其他设备要直连 WSL |
怎么选,一句话决策:
- 懒得折腾、只要自己能上网→ 用默认 NAT,别动它。
- WSL 里的服务要被 Windows 本机直接访问(比如浏览器开
localhost:8000)→ 切镜像。 - 局域网里的手机/同事电脑要访问 WSL 上的服务→ 切桥接。
注意:你八成会在别处看到"virtio 模式"这种说法。virtio-net 只是 WSL2 底层给虚拟机用的虚拟网卡设备,不是一个能写进
.wslconfig的networkingMode,别被误导去配置它。
这一节帮你把默认 NAT 模式用到极致
NAT 是出厂默认,很多"WSL 连不上/访问不了"的问题,根因都是它没被正确配置。这一节的目标:确认 NAT 处于健康状态,并搞清它的 localhost 转发到底怎么工作。
1. 确认或创建配置文件。.wslconfig是一个 INI 文本文件(不是 JSON),放在用户目录下:
# 文件位置:%UserProfile%\.wslconfig [wsl2] networkingMode=NAT localhostForwarding=true这一步在做什么:[wsl2]是段落头,networkingMode=NAT明确锁定为 NAT,localhostForwarding=true允许 Windows 把对本地端口的请求转发进 Linux。
2. 重启 WSL 让配置生效。配置只在虚拟机重建时读取:
wsl --shutdown wslwsl --shutdown关掉所有正在运行的 WSL2 实例(相当于重启那台虚拟机),下次wsl起来时重新应用配置。
3. 验证。进 Linux 里跑:
ip addr show eth0 curl -s https://api.ipify.org第一步看eth0拿到的 IP 是不是 172.x 这类虚拟网段地址;第二步看能不能出外网。两个都对,NAT 就是好的。
底层在哪里:NAT 的宿主侧逻辑主要在 src/windows/common/NatNetworking.cpp;模式枚举定义在 src/windows/common/WslCoreConfig.h(Nat=1 / Bridged=2 / Mirrored=3);Linux 一侧的本地端口处理见 src/linux/init/localhost.cpp。
这一节帮你让 Windows 直接访问 WSL 里的服务
这是新手最常卡住的地方:Linux 里python -m http.server 8000起来了,Windows 浏览器却打不开localhost:8000。根因是 NAT 模式下两个系统的localhost不是同一个。切到镜像模式能一劳永逸。
1. 改配置。把networkingMode改成mirrored:
# %UserProfile%\.wslconfig [wsl2] networkingMode=mirrored这一步在做什么:镜像模式让 WSL2 直接共享宿主机的网络命名空间,Windows 和 Linux 的localhost指向同一套接口,端口双向可达。
2. 重启生效:
wsl --shutdown wsl3. 验证。在 WSL 里起服务,再在 Windows 里访问:
# WSL 内 python3 -m http.server 8000# Windows 内 curl http://localhost:8000Windows 这边能拿到 200 响应,说明双向打通。
底层在哪里:镜像模式的宿主侧实现见 src/windows/service/exe/MirroredNetworking.cpp 与 src/windows/service/exe/WslMirroredNetworking.cpp;请求转发相关的代理逻辑在 src/windows/service/exe/LxssHttpProxy.cpp。
前提提醒:镜像模式要求较新的 WSL 版本和内核。如果你的系统版本太老、切完
ip addr报错,先升级 WSL(wsl --update)再配。
这一节帮你让局域网其他设备直连 WSL
当你想让办公室的同事、家里的手机直接访问 WSL 上跑的服务(比如一个内部 API 或 Git 服务器),就需要 WSL 拥有真实网段里的 IP。这正是桥接模式干的事。
1. 改配置。
# %UserProfile%\.wslconfig [wsl2] networkingMode=bridged这一步在做什么:桥接让 WSL2 的虚拟网卡直接"插"到物理网卡所在的网段,由路由器 DHCP 分配一个局域网真实 IP,Linux 就此成为网络里的平等成员。
2. 重启:
wsl --shutdown wsl3. 验证。看 IP 是否变成了真实网段(例如 192.168.x.x,和你 Windows 的ipconfig同网段):
ip addr show eth0然后从局域网另一台设备浏览器里访问这个 IP。能通,桥接就配好了。
底层在哪里:桥接的宿主侧逻辑见 src/windows/service/exe/BridgedNetworking.cpp;网络端点/网卡相关的配置解析在 src/windows/common/WslCoreNetworkEndpointSettings.cpp。
桥接模式对系统版本、网卡和虚拟化环境有要求,且切完如果拿不到 IP,多半是驱动或权限问题,先
wsl --update并确认以管理员运行过相关命令。
这一节帮你一次定位"为什么网络不对劲"
配置改完却不通,别慌。按这张表对着查,能覆盖绝大多数情况:
| 现象 | 最可能的原因 | 排查动作 |
|---|---|---|
| 端口打不开 | 用了 NAT 却忘了开localhostForwarding,或防火墙拦了 | 确认.wslconfig里该开关为 true;检查 Windows 防火墙入站规则 |
| DNS 解析失败 | /etc/resolv.conf里的 DNS 不对 | 查看cat /etc/resolv.conf,临时换成公共 DNS(如8.8.8.8) |
Windows 访问 WSL 的localhost不通 | 处于 NAT 模式、无转发 | 改用镜像模式,或配置端口转发 |
| 桥接后拿不到 IP / IP 冲突 | 版本过低、DHCP 冲突 | 先wsl --update;给 WSL 固定静态 IP |
| 时快时慢、不稳定 | 模式与需求不匹配 | 按上面决策树重新选模式 |
几个通用验证命令,随取随用:
ip addr show eth0 # 看网卡和 IP 是否属于预期网段 ping 8.8.8.8 # 验证基础外网连通(绕过 DNS) cat /etc/resolv.conf # 看当前 DNS 配置NAT 模式下宿主侧的端口转发/中继逻辑,可参考 src/windows/wslrelay/localhost.cpp;官方对 localhost 转发的机制说明在 doc/docs/technical-documentation/localhost.md。
动手挑战:让一个服务"两边都够得着"
给你一个能直接练的场景,把三种模式的价值一次吃透:
- 先用默认NAT,在 WSL 里
python3 -m http.server 8000,观察 Windows 的localhost:8000能否访问,记录结果。 - 切成镜像,重复上面步骤,对比
localhost:8000的行为变化——你会直观感受到"两个 localhost 是否合一"。 - 最后切桥接,从局域网另一台设备访问 WSL 的真实 IP,体会"WSL 变成独立网络节点"的含义。
每切一次都记得wsl --shutdown再进。做完这三步,networkingMode对你就不再是一行看不懂的配置,而是三张你能随手切换的网络蓝图。
还想深入 Linux 一侧的启动与网络初始化,可以继续看 doc/docs/technical-documentation/ 下的相关文档,源码入口集中在 src/linux/init/ 和 src/windows/common/。
【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考