尧图精选

WSL2 桥接局域网完全指南:独立 IP 访问,告别端口转发

🕒 发布时间:2026/10/1 8:57:44 📁 来源:尧图网络
如果你跟我一样喜欢把服务直接跑在 WSL2 里比如开个局域网 Git 仓库、跑一个 Ollama 给全家的设备用、或者在 WSL2 里搭 Nextcloud 做文件同步那你大概率会被同一个问题卡住默认情况下 WSL2 用的是 NAT 网络Windows 本机能访问 WSL2 里的服务手机、平板、公司其它电脑统统访问不了。网上很多教程会让你折腾端口转发或者在 Windows 上起一个中转服务把流量转进去但每次 WSL2 重启 IP 一变这些配置就全失效了维护成本极高。这篇文章要聊的是更干净的思路直接把 WSL2 桥接到局域网让它拿到一个独立的局域网 IP这样任何设备都能像访问普通电脑一样访问 WSL2全程不用端口转发也不依赖任何中转服务。我会把原理、新版 WSL 的官方桥接选项、通用 Hyper-V 外部交换机方案、验证方法、备选方案和踩过的坑一并写清楚适合 Linux/Windows 双修的开发者也适合在局域网里做自部署服务的人参考。1. 为什么 WSL2 默认连不上局域网桥接到底改了什么1.1 WSL2 默认 NAT 网络是怎么回事WSL2 本质是一台轻量级虚拟机底层用 Hyper-V 虚拟化技术。它默认的网络模式是 NATWindows 为 WSL2 创建一个内部虚拟交换机WSL2 里面的 eth0 网卡会拿到一个私有网段的 IP典型的是 172.x.x.xWindows 宿主机则作为 NAT 网关负责地址转换和路由。所有从 WSL2 发出的网络请求都会在 Windows 内核层做一次源地址转换对外看起来就是从 Windows 的 IP 发出去的。反过来局域网里的其它设备想主动连到 WSL2就找不到路了因为那个 172.x.x.x 的地址是 Windows 内部虚拟出来的路由器根本不知道这个网段怎么走。Windows 本机之所以能直接访问 WSL2 里的服务是因为 WSL2 提供了一个 localhost 回环映射机制。你在 Windows 浏览器里打开 http://localhost:8080Windows 会把请求转发到 WSL2 内部的 8080 端口你感觉不到差别。但换一台手机、另一台电脑这个 localhost 映射就不存在了。1.2 桥接网络和 NAT 的本质区别桥接网络的做法是把 WSL2 的虚拟网卡直接挂到一个外部虚拟交换机上这个交换机绑定在真实物理网卡上相当于给 WSL2 开了一条直通物理局域网的通道。此时 WSL2 不再躲在 NAT 网关后面而是像家里多插了一台设备一样直接从路由器要一个局域网 IP。用生活里的类比来说NAT 模式就像小区单元楼统一装了个门禁你可以在屋里给朋友打电话主动发出连接但朋友凭空来找你只能在楼下按门铃还得你下去接端口转发桥接模式则是直接给你家开了一个临街门牌号朋友按着地址就能直接敲门进来。这也是为什么标题说“不使用代理、不做端口转发”也能访问因为 WSL2 本身已经出现在局域网里了所有设备能直接路由到它Windows 这台宿主机只相当于一个中间桥梁不再需要做任何端口映射。2. 动手前先确认环境版本、网卡、方案选择2.1 检查 WSL 版本和系统版本桥接配置在不同版本的 WSL 里支持程度不一样所以第一步是确认自己的环境。打开 PowerShell 或者 Windows Terminal执行wsl --version如果输出类似WSL version: 2.4.x.x说明 WSL 已经是比较新的版本。如果提示找不到这个命令说明 WSL 内核太老了先执行wsl --update更新到最新版。版本检查很重要因为新版 WSL 在.wslconfig里直接支持networkingModebridged配置起来非常快老版本只能走后面的 Hyper-V 外部交换机方案但效果一样只是步骤多几步。顺便也确认一下 Windows 版本winver命令可以查看系统版本号。Windows 11 22H2 以上跑新版 WSL 基本都没问题Windows 10 也能用外部交换机方案只是官方 bridged 选项可能不支持。2.2 确定要桥接的物理网卡桥接的本质是把虚拟交换机和物理网卡绑定所以先看清楚自己的机器上有几块网卡。管理员身份的 PowerShell 里运行Get-NetAdapter | Format-Table Name, InterfaceDescription, Status输出里会列出以太网、WLAN、蓝牙网络、虚拟网卡等。重点看两块有线网卡名字一般是“以太网”或“Ethernet”无线网卡名字可能是“WLAN”或者“Wi-Fi”。我自己的台式机用的是有线网卡接口名就叫“以太网”笔记本用户如果用 WiFi就要选 WLAN 对应的那块。千万别选错成虚拟网卡比如 vEthernet (Default Switch) 这类否则 WSL2 桥接了半天还是在虚拟网络里打转。2.3 不同版本的配置路径总览在开始配置之前先说一下总体的路线选择避免走弯路。下表是我实际用下来对三种方案的总结方案适用环境配置位置难度特点官方 bridged 模式WSL 2.0Windows 11 较新版本.wslconfig加两行配置低配置快但老环境可能不支持Hyper-V 外部交换机所有 WSL2 环境Win10/11 通用创建虚拟交换机 .wslconfig中兼容性好本文重点讲的通用路线端口转发不想改网络架构只暴露一两个端口netsh portproxy低无需独立 IP但 IP 一变就失效如果你用的 WSL 版本很新优先试第 3 节的方法省事。如果版本不够新或者官方选项配置完不对直接跳到第 4 节用 Hyper-V 外部交换机也能实现一模一样的桥接效果。3. 新版一键桥接先把官方 bridged 模式用起来3.1 修改 .wslconfig 开启 bridged新版 WSL 的配置集中在用户目录下的.wslconfig文件里路径是C:\Users\你的用户名\.wslconfig。没有这个文件就自己新建一个文件名前面有个点注意别写错。用 VS Code 或记事本打开写入[wsl2] networkingModebridged如果你的环境里有多个物理网卡想指定桥接哪一块可以再指定一个已经存在的 Hyper-V 交换机名称。不过这里有个前提官方 bridged 模式下WSL 会自动帮你铺一个外部网络大多数场景下先只写networkingModebridged试一次不行再加。保存文件后管理员 PowerShell 里执行wsl --shutdown然后重新进入 WSLip addr show eth0如果看到inet 192.168.x.x/24这样的局域网 IP说明桥接已经生效。我实测过一次拿到的是路由器 DHCP 池里的地址手机直接就能访问。如果拿到的是 169.254.x.x 这种地址说明自动桥接没铺对赶紧看第 4 节的通用方案。3.2 官方选项没生效怎么办如果你执行完上面的步骤发现 WSL 里的 IP 还是 172.x.x.x或者干脆 eth0 没起来大概率是当前 WSL 版本或 Windows 版本不支持networkingModebridged。这时候不要硬扛直接用下一节的 Hyper-V 外部交换机方案效果完全一样。另外注意改完.wslconfig一定要wsl --shutdown再重启 WSL光退出发行版终端不够WSL2 虚拟机还活着配置不会重新加载。4. 通用方案用 Hyper-V 外部交换机给 WSL2 一个独立 IP4.1 原理其实还是走 Hyper-V 虚拟交换机WSL2 的网卡本质上就是挂在 Hyper-V 虚拟交换机上的一块虚拟网卡默认挂在一个内部交换机上所以只能 NAT。如果我们新建一个外部虚拟交换机把物理网卡和虚拟交换机桥接在一起再把 WSL2 的配置指向这个外部交换机WSL2 的虚拟网卡就等于直连到了物理局域网。这个方案的好处是不依赖 WSL 的新特性只要你的机器能跑 WSL2Hyper-V 底层就一定在所以 Windows 10 和 Windows 11 都能用。我自己的 Windows 10 老机器就是用这个方案做成桥接的。4.2 创建外部虚拟交换机先用管理员身份打开 PowerShell确认物理网卡名称然后创建外部虚拟交换机Get-NetAdapter New-VMSwitch -Name WSLExternal -NetAdapterName 以太网 -AllowManagementOS $trueNew-VMSwitch的参数解释一下Name交换机名称随便起但建议用英文后面.wslconfig里要引用。NetAdapterName要绑定的物理网卡名称就是我前面说的“以太网”或者“WLAN”一定要和Get-NetAdapter里看到的一模一样。AllowManagementOS $true这个参数很关键它允许 Windows 宿主系统继续和这块物理网卡共享连接。如果设成$falseWindows 自己会瞬间和物理网卡脱钩直接断网。创建成功后打开“控制面板 → 网络连接”或者运行ncpa.cpl你会发现多了一个叫vEthernet (WSLExternal)的虚拟网卡这是正常的Windows 后续会通过这块虚拟网卡走物理网卡上网。执行完这条命令后网络可能会短暂断开几秒然后自动恢复。如果超过 10 秒还没恢复多半是AllowManagementOS没生效重新删除交换机再建一次确认参数写对。4.3 修改 .wslconfig 指向新交换机编辑C:\Users\你的用户名\.wslconfig写入[wsl2] vmSwitchWSLExternal如果你的 WSL 版本比较新想同时显式开启官方桥接也可以这样写[wsl2] vmSwitchWSLExternal networkingModebridged但老版本不认识networkingModebridged所以最稳妥的写法是只写vmSwitchWSLExternal。配置文件的vmSwitch指定的交换机名称必须和New-VMSwitch建出来的名称完全一致注意大小写和空格。保存后管理员 PowerShell 执行wsl --shutdown再重新进入 WSLip addr show eth0正常情况下 eth0 会从路由器那里 DHCP 拿到一个局域网 IP和 Windows 的 IP 在同一网段。比如 Windows 是 192.168.1.100WSL2 可能就是 192.168.1.101 或其它可用地址。4.4 没有自动获取 IP 时的手动补救有些网络环境的路由器对 DHCP 分配比较严格或者物理网卡本身没有开启 DHCPWSL2 可能会拿到一个无效地址最常见的是169.254.x.x这是 Windows 系自动私有地址说明 DHCP 失败。这时候可以在 WSL 里手动指定 IP 和网关。假设你的局域网网段是 192.168.1.0/24网关是 192.168.1.1可以这样临时设置sudo ip addr add 192.168.1.50/24 dev eth0 sudo ip link set eth0 up sudo ip route add default via 192.168.1.1但这种方法重启后会失效。想彻底固定建议在 WSL 里用 netplan 配置静态 IP。Ubuntu 22.04 的 WSL 环境一般自带 /etc/netplan可以写一个配置文件network: 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保存后执行sudo netplan apply。注意 IP 地址、网关要按你自己的网络环境改别直接抄。提示如果你不想在 WSL 里折腾静态 IP也可以在路由器后台给 WSL2 网卡的 MAC 地址做一个 DHCP 保留这样每次拿到的 IP 都是固定的省心很多。5. 验证桥接成果HTTP、Git、Ollama 三种实战5.1 先做一次最基础的 HTTP 访问测试配置完成以后先做一个最简单的验证在 WSL2 里起一个 HTTP 服务用手机或者另一台电脑访问。进入 WSLcd /tmp python3 -m http.server 8080 --bind 0.0.0.0然后在局域网另一台设备的浏览器里输入http://192.168.x.x:8080也就是 WSL2 刚刚拿到的那个局域网 IP。如果能看到文件列表页面说明桥接链路已经通了WSL2 的服务对局域网完全可见。这一步如果失败最常见的两个原因一是服务只监听了 127.0.0.1所以务必加--bind 0.0.0.0二是 Windows 防火墙把入站请求拦了这个我在 5.4 节专门说。5.2 局域网 Git 仓库实战很多人桥接 WSL2就是为了在局域网里搭一个 Git 仓库。WSL2 拿到独立 IP 之后这个需求变得特别简单。先在 WSL2 里安装 SSH 服务并启动sudo apt update sudo apt install -y openssh-server sudo systemctl enable --now ssh然后初始化一个裸仓库mkdir ~/repo.git cd ~/repo.git git init --bare局域网另一台电脑上直接就可以克隆git clone ssh://你的用户名192.168.x.x/home/你的用户名/repo.git从此你不需要在 Windows 上挂任何中转服务也不用担心端口转发脚本失效。代码直接推给 WSL2 里的裸仓库局域网同事拉取、推送都很顺畅。5.3 WSL2 跑 Ollama 给局域网用最近很多人会把 Ollama 装在 WSL2 里让局域网内的电脑、手机都能调大模型接口。桥接之后同样很简单。安装 Ollamacurl -fsSL https://ollama.com/install.sh | sh默认情况下 Ollama 只监听 127.0.0.1需要把它改成监听所有网卡再启动OLLAMA_HOST0.0.0.0:11434 ollama serve然后局域网另一台电脑试着调用curl http://192.168.x.x:11434/api/tags如果返回一个 JSON里面列出了模型列表说明 WSL2 里的 Ollama 已经对局域网开放了。之后你在其它设备上配置OLLAMA_HOSThttp://192.168.x.x:11434就能直接连上。5.4 别忘了 Windows 防火墙桥接成功之后流量从局域网进入 WSL2Windows 防火墙依然会做一道拦截。很多用户配置完桥接发现手机还是访问不了一排查发现是 Windows Defender 防火墙默认拦了入站。最简单的做法是给需要开放的端口加一条入站规则。以 8080 端口为例管理员 PowerShell 执行New-NetFirewallRule -DisplayName WSL2-LAN-8080 -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow如果只允许局域网网段访问不希望其它地方也能进来可以加-RemoteAddress 192.168.1.0/24参数比如New-NetFirewallRule -DisplayName WSL2-LAN-8080 -Direction Inbound -Protocol TCP -LocalPort 8080 -RemoteAddress 192.168.1.0/24 -Action Allow加完规则后再试一次访问基本就能通了。6. 备选方案不想改网卡就端口转发NAT 环境的轻量抢救6.1 端口转发适合什么场景桥接虽好但不是每个人都愿意动网络架构。比如你只想临时让同事访问一下 WSL2 里的某个网页或者公司电脑没有管理员权限创建不了 Hyper-V 交换机这时候端口转发反而是更轻量的方案。WSL2 默认 NAT 模式下Windows 宿主机可以访问 WSL2 里的服务所以思路很简单在 Windows 上加一个端口转发规则把 Windows 的某个端口映射到 WSL2 的 IP 和端口。局域网设备访问 Windows IP:端口Windows 再把流量转发给 WSL2。6.2 netsh portproxy 具体配置先拿到 WSL2 当前的 IPwsl hostname -I然后管理员 PowerShell 里添加端口转发。假设 WSL2 的 IP 是 172.25.100.50要在 Windows 的 8080 端口转发到 WSL2 的 8080 端口netsh interface portproxy add v4tov4 listenaddress0.0.0.0 listenport8080 connectaddress172.25.100.50 connectport8080别忘了加防火墙规则New-NetFirewallRule -DisplayName WSL2-Port-8080 -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow这样局域网设备访问http://Windows的IP:8080就能转到 WSL2 里的服务。6.3 端口转发和桥接怎么选端口转发最大的问题是 WSL2 的 IP 不固定。每次 WSL2 重启内部 IP 都可能变一旦 IP 变了portproxy 规则里的 connectaddress 就失效了必须手动更新。我早期用这种方式经常是早上同事说访问不了我一看WSL IP 变了又得重新改一遍。桥接和端口转发的取舍我是这样看的如果只是临时开放一个服务端口转发更快更省事如果是长期要把 WSL2 当作局域网内的一台开发机或服务器桥接才是正道。端口转发适合轻量抢救桥接适合长期使用两条路可以并存不用互相排斥。7. 常见问题排查速查我把自己踩过、以及身边朋友踩过的坑整理成了一张表按概率从高到低排列现象可能原因解决办法WSL 启动报“未启用虚拟化”BIOS 里虚拟化没开或 Windows 功能没开重启进 BIOS 开启 Intel VT-x/AMD-V控制面板启用“虚拟机平台”创建外部交换机后 Windows 断网AllowManagementOS没设置或设置错误删除交换机重新创建确认加-AllowManagementOS $trueWSL 拿到 169.254.x.x 地址DHCP 失败路由器没分配手动指定 IP 和网关或路由器开 DHCP手机/其它电脑访问不通Windows 防火墙拦入站New-NetFirewallRule放行对应端口服务明明在 WSL 里却访问不了服务只监听了 127.0.0.1启动命令里加--bind 0.0.0.0或配置监听所有网卡.wslconfig改了没反应没执行wsl --shutdown或文件路径错误确认路径是C:\Users\用户名\.wslconfig改完重启 WSL笔记本切换 WiFi/有线后失效外部交换机还绑在旧物理网卡上删除旧交换机重新为新网卡创建交换机DNS 无法解析WSL 里/etc/resolv.conf配置异常wsl --shutdown重启或手动指定 DNSDocker 容器网络异常WSL2 网络被改动Docker 默认 NAT 受影响优先让 Docker 保持默认 NAT容器用--network host或单独网络7.1 特别提醒虚拟化没开启的最常见报错热词里经常有人搜“WSL2 无法启动因为此计算机上未启用虚拟化”这个报错其实和桥接配置无关属于前置环境问题。解决办法是先确认 Windows 功能里的“适用于 Linux 的 Windows 子系统”和“虚拟机平台”都勾选并启用了然后重启电脑。如果还不行再到 BIOS 里开启虚拟化选项Intel 平台一般是Intel Virtualization TechnologyAMD 平台是SVM Mode。7.2 桥接后的安全提醒桥接等于把 WSL2 里的服务直接暴露到局域网这个事是双刃剑。以前 NAT 模式下外面进不来你不需要太担心现在 WSL2 有了独立 IP局域网里任何人都有可能访问到你的服务。我建议至少做两件事一是服务本身能开认证就开认证能用密钥登录就别用弱密码。二是 Windows 防火墙不要一股脑全放行尽量只开你真正需要的端口能用-RemoteAddress 192.168.1.0/24限定到局域网网段就尽量不要对全体 IP 开放。结尾这套 WSL2 桥接方案我前后在台式机和笔记本上各折腾过一遍最大的体会是先在.wslconfig里试官方 bridged 模式不行就立刻转 Hyper-V 外部交换机别在一个方案上死磕。真正配置起来其实很快一旦 WSL2 拿到了独立局域网 IP后面的体验完全不一样Git 仓库、HTTP 服务、Ollama 这些都能像访问一台普通 Linux 小主机一样直接访问不再需要写一堆脚本去同步 WSL IP、刷新端口转发。最后再给一个实用建议如果你准备长期用桥接最好顺手在路由器里给 WSL2 的 MAC 地址做 DHCP 保留或者直接在 WSL 里配静态 IP。我一开始没做结果 WSL 每次重启 IP 都变脚本、书签、同事电脑里的配置全要跟着改烦得不行。固定住 IP 以后这台 WSL2 就真的可以当作局域网里的一个稳定节点来用了。另外笔记本用户要注意 WiFi 和有线网络切换时外部交换机的绑定关系可能会失效切换网络后检查一下 WSL 里的 IP 是否还在局域网网段不在就重新绑定一次基本上就这些坑了。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →