ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

WSL2桥接网络配置:让WSL2获得独立局域网IP

WSL2桥接网络配置:让WSL2获得独立局域网IP 第一次把 WSL2 里的服务跑起来之后我做的第一件事就是用手机访问一下。结果自然是不行。WSL2 默认走 NATWindows 会给它分配一个 172.x.x.x 的内部地址和我家路由器下面的 192.168.x.x 网段完全不在一个世界。Windows 本机上用 localhost 能访问是因为系统做了转发但局域网其他设备根本看不到这个 172 地址。很多人第一反应是装代理、做端口转发其实 WSL2 的桥接网络并不需要代理——关键是选对网络模式把 WSL2 变成局域网里的一台普通主机。这篇文章聊聊我实际测试下来的几种做法重点给出一套能让 WSL2 拿到独立局域网 IP 的桥接配置方案。1. WSL2 默认网络模式到底卡在哪1.1 默认 NAT 模式的工作方式WSL2 本质上是跑在 Hyper-V 虚拟机平台上的轻量虚拟机它和 Windows 之间通过一块名为vEthernet (WSL)的虚拟网卡通信。WSL2 里的eth0拿到的是这块虚拟网卡分配的私有地址通常是 172.x.x.x掩码 255.255.0.0。Windows 在这块网卡上做了一次 NAT把 WSL2 的流量转发到物理网卡再走路由器上网。这套机制在“只有你一个人用”的场景下体验很好因为 Windows 会自动把 WSL2 的 localhost 端口映射到宿主机比如你在 WSL2 里启动一个服务监听 8080Windows 浏览器直接访问localhost:8080就能通。看似正常实际上这个转发只限于宿主机本身。问题出在局域网设备上。手机、另一台电脑、电视盒子访问宿主机 IP 的 8080 端口时流量到了 Windows 网卡Windows 不知道要转给 WSL2于是直接丢弃。即使你知道 WSL2 的 172.16.x.x 地址把它填到手机浏览器里路由也不通因为 172 段在物理网络里不存在。这就是默认 NAT 模式的最大限制WSL2 相当于躲在 Windows 后面的一台隐身机器对外完全不可见。1.2 为什么一定想要独立 IP我一开始也觉得麻烦点就算了后来需要给同事开放一个 Git 仓库又要在另一台电脑上直接访问 WSL2 里跑的 Web 服务才意识到必须让 WSL2 在局域网里有一个自己能直达的地址。独立 IP 的好处很直接第一任何设备都能通过这个 IP 访问 WSL2 里的服务不需要在 Windows 上开端口转发也不需要在 WSL2 里装任何代理第二WSL2 可以主动访问局域网里的其他设备比如 NAS、路由器、打印机链路更自然第三SSH 直连变得非常简单电脑手机都能直接以 WSL2 的 IP 为目标连接不用绕道 Windows 再进 WSL2。说白了独立 IP 就是让 WSL2 从“Windows 的附属进程”变成“局域网里的一台真主机”。2. 三种网络模式选型对比2.1 微软官方原生支持的 mirrored 模式在 Windows 11 22H2 及以上的系统里WSL2 提供了一个官方网络选项mirrored 模式。原理是把 WSL2 的网络栈“镜像”到 Windows 上让两者共享宿主机的 IP 和网络接口。配置只有一行在%UserProfile%\.wslconfig文件里加上[wsl2] networkingModemirrored然后执行wsl --shutdown重启 WSL2让配置生效。之后局域网设备直接访问 Windows 主机的 IP就能访问到 WSL2 里的服务不需要任何代理和端口转发。mirrored 模式最大的优势是稳定、官方支持、配置快缺点是 WSL2 没有自己的 IP它是共享宿主机 IP 的。如果你需要给不同服务绑定不同 IP或者想用独立 IP 区分 WSL2 和其他虚拟机它就不太适合。2.2 真正的桥接模式 bridged和 mirrored 不同桥接模式是让 WSL2 的虚拟网卡直接挂到物理局域网里由路由器的 DHCP 直接给 WSL2 分配一个和宿主机同网段的 IP。这个模式在较新的 WSL 预览版里开始被支持配置同样是改.wslconfig[wsl2] networkingModebridged开启后WSL2 的eth0不再是 172.x.x.x而是直接变成 192.168.x.x具体取决于你家里的网段。此时 WSL2 就是一台独立主机局域网里的所有设备都能直接访问它它也能直接访问局域网里的所有设备。这是目前唯一能让 WSL2 拿独立 IP 同时保持网络配置最简单的方式。缺点是对 WSL 版本有要求旧版本或者稳定版默认可能没有这个选项需要更新 WSL 到预览版才能看到。2.3 兜底方案端口转发如果你的系统版本不支持上面任何一种模式还有个传统做法在 Windows 用netsh interface portproxy把特定端口转发到 WSL2 的地址。比如 WSL2 里跑了 8000 端口就在 Windows 上用管理员 PowerShell 执行netsh interface portproxy add v4tov4 listenaddress0.0.0.0 listenport8000 connectaddress$(wsl hostname -I) connectport8000 netsh advfirewall firewall add rule nameWSL2_8000 dirin actionallow protocolTCP localport8000这个方案的优点是版本兼容性好缺点是每个端口都要加一条规则而且 WSL2 的 IP 改变后规则会失效需要脚本动态更新。它本质上不是独立 IP只是把 Windows 的某个端口导流到 WSL2适合临时用不适合长期当正式环境。2.4 模式对比一览模式独立局域网 IP是否需要代理局域网直接访问配置难度版本要求默认 NAT否需要端口转发难无全部mirrored否共享宿主 IP否可以低Win11 22H2bridged是否可以低新版 WSL/预览版端口转发否否可以仅指定端口中全部看表就很清楚了想要不折腾、局域网可访问选 mirrored想要真正独立 IP选 bridged系统太老什么功能都没有只能端口转发临时扛一下。3. 实操三步让 WSL2 获得独立局域网 IP3.1 第一步检查版本确认是否有 bridged 选项先打开 PowerShell 或 Windows Terminal执行wsl --version wsl --status我这里以 WSL 2.4.4 为例。如果版本号很老先执行一次更新wsl --update更新完成后再去看.wslconfig支持哪些选项。有一个简便判断方法直接编辑%UserProfile%\.wslconfig加上networkingModebridged然后wsl --shutdown再启动 WSL2最后在 WSL2 里执行ip addr看eth0的地址是否变成和物理局域网同一个网段。如果是说明你的版本支持如果还是 172.x.x.x说明当前版本不认这个参数需要切到 WSL 预览版再试。3.2 第二步启用 bridged 并重启 WSL确认系统能识别这个参数后编辑%UserProfile%\.wslconfig完整内容可以参考[wsl2] networkingModebridged dhcptrue注意dhcptrue让 WSL2 启动时自动从路由器获取 IP这样最简单。保存文件后执行wsl --shutdown再重新进入 WSL2wsl -d Ubuntu-22.04进入后第一时间看地址ip addr show eth0如果看到inet 192.168.1.87/24之类的地址且和你 Windows 主机的网段一致那桥接就已经生效了。此时在局域网任何设备上 ping 这个地址应该能通。如果eth0没有自动获取到 IP可以尝试手动请求 DHCPsudo dhclient eth0再执行ip addr show eth0确认。3.3 第三步固定 IP防止重启后地址漂移DHCP 分配的地址有一个现实问题路由器可能每次分配给 WSL2 不一样的 IP。试验阶段没问题但作为正式服务跑起来还是建议固定下来。有两个思路一种是在路由器后台做 MAC 地址绑定把 WSL2 虚拟网卡的 MAC 和某个 IP 固定绑定另一种是直接在 WSL2 里用 netplan 配置静态 IP。我更推荐后者因为可控性更强。WSL2 的 Ubuntu 里编辑/etc/netplan/01-netcfg.yamlnetwork: version: 2 ethernets: eth0: dhcp4: false addresses: - 192.168.1.50/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 192.168.1.1 - 223.5.5.5注意把192.168.1.50换成你局域网里没被占用的地址把网关192.168.1.1换成你路由器的实际地址DNS 可以写路由器地址也可以写公共 DNS。保存后执行sudo netplan apply如果你用的是不带 netplan 的发行版或者无法使用 netplan可以直接用 ip 命令临时验证sudo ip addr add 192.168.1.50/24 dev eth0 sudo ip route add default via 192.168.1.1 echo nameserver 192.168.1.1 | sudo tee /etc/resolv.conf配置完成后重启一次 WSL2 再进去确认保证地址依然生效。如果重启后又回到 172 网段说明 bridged 参数没有被系统加载需要回退到前面提到的兼容方案。3.4 版本不支持 bridged 时的备用实操路径如果你更新了 WSL 还是不支持 bridged也不用立刻放弃独立 IP 这个目标。还可以尝试用 Hyper-V 的外部虚拟交换机做一次“半桥接”的配置在 Windows 的功能里确认 Hyper-V 已启用。按WinR输入virtmgmt.msc打开 Hyper-V 管理器。右侧“虚拟交换机管理器”新建虚拟网络交换机类型选“外部”。选择你当前用的物理网卡有线或无线命名如WSLBridge确认创建。创建过程中 Windows 的网络会短暂断开这是正常的。建完后再在 WSL2 里用上面第 3.3 节的静态 IP 方法把eth0配成和物理网卡同网段的地址网关指向路由器。有一部分环境里这样配置后局域网设备可以直接访问 WSL2 的 IP因为这个外部交换机本身会把流量桥到物理局域网里。实测中成功率受无线网卡驱动影响比较大。有线网络下更稳Wi-Fi 下经常出现能 ping 通但访问服务不稳定的情况。如果发现这种方式在你的无线网卡上行不通老实换回 mirrored 模式或者端口转发别死磕。4. 局域网访问的防火墙规则与问题排查4.1 Windows 防火墙放行端口即便 WSL2 拿到了独立 IPWindows Defender 防火墙仍然可能拦截来自局域网的请求。最典型的情况是手机能 ping 通 WSL2 的 IP但浏览器访问端口没反应或者 SSH 连接超时。解决办法是在 Windows 上以管理员身份给对应端口加一条入站规则。比如放行 TCP 22 和 8080netsh advfirewall firewall add rule nameWSL2_SSH dirin actionallow protocolTCP localport22 netsh advfirewall firewall add rule nameWSL2_8080 dirin actionallow protocolTCP localport8080如果 WSL2 里还跑了 UDP 服务比如 mDNS、局域网游戏服务端还需要放行对应的 UDP 端口netsh advfirewall firewall add rule nameWSL2_UDP dirin actionallow protocolUDP localport5353我建议先放行需要的端口而不是直接关闭防火墙“裸奔”这样能避免暴露不必要的系统服务。4.2 常见问题速查表症状可能原因解决思路WSL2 启动报虚拟化错误BIOS 里虚拟化未开启进固件开启 Intel VT-x / AMD-V改完 .wslconfig 没效果WSL 版本不支持 bridgedwsl --update到最新版或预览版eth0 始终是 172.x.x.xbridging 参数未生效确认 WSL 版本退回 mirrored 或端口转发局域网 ping 不通 WSL2 IP路由器 AP 隔离开启在路由器后台关闭 AP 隔离ping 通但端口访问不了Windows 防火墙拦截添加入站规则放行指定端口DNS 一直解析不了/etc/resolv.conf 被覆盖手动写 DNS 或关闭自动生成配置Wi-Fi 下网络不稳定无线网卡驱动不支持桥接换有线网卡或改 mirrored 模式重启 WSL2 后 IP 变回 172bridged 配置没持久化检查 .wslconfig 路径和 WSL 版本4.3 排障链路从网卡到路由到防火墙遇到问题别瞎猜我习惯按这个链路查先在 WSL2 里看网络状态ip addr show eth0 ip route show cat /etc/resolv.conf确认三件事eth0 有没有拿到局域网 IP默认路由是不是指向路由器DNS 能不能解析。如果 eth0 没有局域网 IP问题在网络模式配置如果有 IP 但没路由手动补默认路由如果 DNS 有问题改/etc/resolv.conf或者 netplan 里的 DNS 配置。然后在 Windows 上看网卡和转发ipconfig /all Get-NetIPInterface确认物理网卡和vEthernet (WSL)的网段配置。如果配置看起来都正常再用ping和Test-NetConnection探测ping 192.168.1.50 Test-NetConnection 192.168.1.50 -Port 8080最后排查防火墙。临时关闭防火墙测试是最快的定位方式但测试完记得重新打开再按需添加放行规则。我在实际环境中发现不少局域网访问失败的问题不是 WSL2 配置问题而是 Windows 防火墙默认拦截虚拟机的入站流量。4.4 Wi-Fi 网卡的桥接玄学Wi-Fi 下做桥接坑比有线多很多。无线网卡本身工作在共享介质上很多驱动不支持把虚拟机的虚拟端口直接挂到无线网络上加上路由器端如果开了“AP 隔离”所有无线客户端之间的互访都会被禁止WSL2 就算拿到同网段 IP 也会被孤立。我实测过几台电脑Intel 无线网卡在部分驱动版本下桥接后丢包严重换成 USB 有线网卡后立竿见影。如果你的目标是在 Wi-Fi 环境里稳定让局域网设备访问 WSL2我其实是建议直接用 mirrored 模式省心得多。5. 配好桥接能干嘛三个实际场景5.1 局域网 Git 仓库WSL2 里裸跑一个 Git 仓库用 SSH 协议供局域网协作是桥接后最有价值的玩法。比如在 WSL2 里创建裸仓库sudo apt install git mkdir /srv/git/project.git cd /srv/git/project.git git init --bare然后局域网另一台电脑直接提交推送git clone ssh://user192.168.1.50/srv/git/project.git前提是 WSL2 里装了 SSH 服务并启动了sshd。这套组合非常适合小团队内网协作不依赖任何外部平台也没有代理和映射的麻烦。5.2 局域网文件共享与网页下载WSL2 里跑一个 nginx 或者 Python 自带的 HTTP 服务就能把文件共享变成网页下载。比如在某个目录下cd /home/me/share python3 -m http.server 8000 --bind 0.0.0.0局域网设备直接访问http://192.168.1.50:8000就能下载文件。这个场景用 mirrored 模式也能实现但桥接模式下 WSL2 有独立 IP多人同时访问时更清晰不占用 Windows 宿主机的端口空间也不容易被 Docker Desktop 或者宿主机上的其他服务冲突。5.3 WSL2 里跑 Ollama局域网设备直接调用现在很多人在 WSL2 里跑 Ollama把大模型推理能力暴露给局域网里的电脑和手机。默认情况下 Ollama 监听 127.0.0.1需要让它监听所有网卡OLLAMA_HOST0.0.0.0:11434 ollama serve或者通过 systemd 设置环境变量。桥接模式下局域网设备的 API 请求直接发到 WSL2 的独立 IP例如curl http://192.168.1.50:11434/api/generate -d {model:qwen2.5,prompt:hello}这样局域网内所有的设备都能通过同一个 IP 访问大模型服务不用在每台设备上都装一套模型环境。6. 一点个人体会折腾过几轮之后我的选择逻辑很简单如果只是想让手机和同事的电脑访问 WSL2 里的几个服务直接开 mirrored 模式官方支持、稳定、不用代理几分钟搞定如果确实需要独立 IP比如要给多个虚拟机、容器分配不同地址就升级到新版 WSL 用 bridged配置本身不复杂关键是 Wi-Fi 网卡的兼容性要自己测试。还有一点想单独提醒桥接模式拿到独立 IP 之后WSL2 变成了局域网里的普通主机安全性问题也随之而来。尽量别开着默认密码的 SSH别让数据库监听 0.0.0.0 还没设认证该开防火墙就开防火墙。我见过有人配好桥接后直接把 Redis 6379 暴露给整个内网结果被同事扫到后把数据清空的惨剧这都是教训。另外局域网里跑大模型、分享大文件这些场景桥接的独立 IP 真的比端口转发舒服太多。哪天系统升级可以切换模式了大家可以试一次之后就再也回不去 NAT 时代了。
返回列表