在 WSL 中使用网络应用时,需要区分访问方向和网络模式。WSL 默认采用基于 NAT 的网络架构;Microsoft 建议尝试镜像网络模式,以使用较新的网络功能和改进。
查询 IP 地址
查询通过 WSL 运行的 Linux 发行版所使用的 IP 地址时,主要有两种情况。
从 Windows 查询 WSL 2 发行版地址
如果 Windows 上的程序需要连接 Linux 发行版实例内运行的服务器,可以在 Windows 主机上执行:
wsl.exe --distribution <DistroName> hostname -I
查询默认发行版时,可以省略指定发行版的参数 --distribution <DistroName>,也可以使用其简写 -d <DistroName>。
这个命令会启动目标 WSL 实例,并在其中执行 Linux 命令 hostname --all-ip-addresses。Linux 命令将 WSL 实例的 IP 地址写入标准输出,wsl.exe 再把该输出显示在 Windows 命令行中。
原文给出的示例输出如下;它只是示例地址:
172.30.98.229
这里必须区分 hostname -I 与 hostname -i。原文这一段的说明文字要求“小写 -i”,但命令、--all-ip-addresses 的说明和后文提示均使用大写 -I。本文保留原文命令,并按后文说明采用大写 -I 来查询发行版地址;小写 -i 的结果可能是本机名称解析得到的 127.0.1.1,不应把它直接用作下文的 connectaddress。
从 WSL 2 查询 Windows 主机地址
如果 Linux 发行版中的程序需要连接 Windows 上运行的服务器,可以在 WSL 2 的 Linux 环境中执行:
ip route show | grep -i default | awk '{ print $3}'
原文给出的示例输出是:
172.30.96.1
在这个例子中,172.30.96.1 是 Windows 主机的 IP 地址。
上面的 IP 地址查询通常用于默认的 NAT 网络模式。在镜像网络模式下,Windows 主机与 WSL 2 虚拟机可以使用 localhost,即 127.0.0.1,作为目标地址互相连接,通常不需要再查询对端 IP 地址。
默认网络模式:NAT
NAT 是网络地址转换。使用这种网络架构时,应分别考虑下面几种访问情况。
从 Windows 访问 Linux 应用:localhost
如果在 Linux 发行版中开发网络应用,例如运行在 Node.js 或 SQL Server 上的应用,可以从 Windows 应用中通过 localhost 访问它。例如,在 Edge 或 Chrome 中访问 Linux 开发服务器的本地端口。
从 Linux 访问 Windows 应用:主机 IP 地址
如果需要从 Linux 发行版,例如 Ubuntu,访问 Windows 中运行的 Node.js、SQL Server 等网络应用,在 NAT 模式下需要使用 Windows 主机的 IP 地址。
- 在 Linux 发行版中执行以下命令,取得 Windows 主机地址:
ip route show | grep -i default | awk '{ print $3}'
- 使用取得的地址连接 Windows 上对应的服务器和端口。
原图的教学流程可用文字表示:Linux 中的 curl → Windows 主机的 Node.js 服务(示例端口 5000)→ 返回 Hello World,Windows 侧显示收到请求。这是对原图内容的说明,不是本机运行结果。
通过远程 IP 地址连接
通过远程 IP 地址连接应用时,这类连接会被当作来自局域网的连接。因此,应用必须能够接受局域网连接。
例如,应用可能需要绑定到 0.0.0.0,而不是 127.0.0.1。原文以 Flask 应用为例,使用 app.run(host='0.0.0.0') 设置监听地址。这样会允许来自局域网的连接,需要同时考虑监听范围和访问安全。
从局域网访问 WSL 2 发行版
对于 WSL 1,如果 Windows 计算机已经允许局域网访问,局域网中的其他设备也可以访问 WSL 中运行的应用。
WSL 2 的默认 NAT 网络并非如此:它有一个虚拟以太网适配器,并使用独立的 IP 地址。原文所述的端口代理办法,与访问常规虚拟机的处理方式相似。
下面是使用 Windows 的 Netsh interface portproxy 添加端口代理的原文示例。代理监听 Windows 主机上的端口,并将连接转发到 WSL 2 虚拟机的地址:
netsh interface portproxy add v4tov4 listenport=<yourPortToForward> listenaddress=0.0.0.0 connectport=<yourPortToConnectToInWSL> connectaddress=(wsl hostname -I)
其中:
<yourPortToForward>是 Windows 主机要监听的端口,例如listenport=4000。listenaddress=0.0.0.0表示在所有 IPv4 接口上监听,接受发往这些接口的请求。实际能否访问仍取决于应用监听和防火墙等设置。- 原文说明,
listenaddress指定监听的 IPv4 地址,也可采用计算机的 NetBIOS 名称或 DNS 名称;未指定地址时,默认使用本地计算机。使用前应核对所选名称解析到的地址和实际监听范围。 <yourPortToConnectToInWSL>是 WSL 内的目标端口,例如connectport=4000。connectaddress必须是目标 WSL 2 发行版的 IP 地址,可以通过wsl.exe hostname -I查询。
上面的第一条命令包含占位符,并保留了原文的 connectaddress=(wsl hostname -I) 写法。先确认命令运行环境以及目标地址;不要把占位符或多个地址直接当作一个已验证的目标地址。
原文给出的展开后示例如下:
netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100
192.168.101.100 仍然只是示例,使用时应替换为实际发行版地址。
原文随后列出两种查询方式:
wsl hostname -I:查询通过 WSL 2 安装的 Linux 发行版地址。cat /etc/resolv.conf:原文将它列为从 WSL 2 视角查看 Windows 地址的方法。官方配置说明注明,DNS 隧道启用时,该文件中的名称服务器地址由dnsTunnelingIpAddress指定,默认值为10.255.255.254。因此,不应未经核对就把 DNS 地址当作 Windows 服务的目标地址;本篇前面给出的默认路由查询用于 NAT 模式下的主机地址查询。
原文对监听地址的说明使用“所有 IPv4 端口”的表述;更准确地说,0.0.0.0 代表所有 IPv4 接口,监听端口仍由 listenport 指定。
原文的“IPv6 访问”小节
这个小节再次列出了:
wsl hostname -I:查询 WSL 2 发行版地址。ip route show | grep -i default | awk '{ print $3}':查询从 WSL 2 视角看到的 Windows 主机地址。
原文还重复了 listenaddress=0.0.0.0 的 IPv4 监听说明。这些内容本身并没有提供完整的 IPv6 配置步骤:0.0.0.0 和上面的 v4tov4 端口代理均属于 IPv4。下面的镜像模式说明才明确列出 IPv6 支持。
镜像网络模式
在 Windows 11 22H2 及更高版本的计算机上,可以在 .wslconfig 文件的 [wsl2] 部分 设置 networkingMode=mirrored,启用镜像网络模式。
这种模式采用不同的网络架构,将 Windows 上的网络接口“镜像”到 Linux,以增加网络功能并改善兼容性。原文列出的优势包括:
- 支持 IPv6。
- Linux 可以使用
127.0.0.1连接 Windows 服务器;原文注明不支持 IPv6 回环地址::1。 - 改善 VPN 网络兼容性。
- 支持多播。
- 可以从局域网直接连接 WSL。
原文还提供了两种 Hyper-V 防火墙设置办法。它要求在具有管理员权限的 PowerShell 窗口中执行。
第一种是修改 WSL 虚拟机的默认入站行为:
Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
另一种是添加针对示例 Web 服务 TCP 80 端口的规则:
New-NetFirewallHyperVRule -Name "MyWebServer" -DisplayName "My Web Server" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 80
两条命令的作用范围不同:第一条改变默认入站行为,第二条添加指定端口规则。应根据实际需要选择并核对防火墙策略,不要把允许全部入站与只允许示例端口视为同一操作。
镜像模式针对 NAT 架构中的部分网络问题提供改进。已知问题和反馈入口位于 WSL 产品仓库。
DNS 隧道
在 Windows 11 22H2 及更高版本上,原文说明 dnsTunneling 默认启用。它也位于 .wslconfig 的 [wsl2] 设置中。
DNS 隧道通过 WSL 的虚拟化机制回应 DNS 请求,而不是让请求直接作为网络数据包发出。其目标是改善 VPN 和其他复杂网络配置下的兼容性。
自动代理
在 Windows 11 22H2 及更高版本上,在 .wslconfig 的 [wsl2] 部分设置 autoProxy=true,会让 WSL 使用 Windows 的 HTTP 代理信息。
如果已经在 Windows 中配置了代理,启用该功能后,WSL 也会自动获得相应代理设置。
WSL 与防火墙
在 Windows 11 22H2 及更高版本、WSL 2.0.9 及更高版本的计算机上,原文说明 Hyper-V 防火墙功能默认启用。
可以进一步阅读:
- 具有高级安全性的 Windows Defender 防火墙:了解自动应用到 WSL 的 Windows 安全功能。
- 配置 Hyper-V 防火墙:了解如何在本机或通过 Intune 等管理工具应用规则。
来源:Microsoft 官方文档团队,《使用 WSL 访问网络应用程序》,页面标示更新日期为 2025-08-07,核对日期为 2026-10-03。文档采用 CC BY 4.0,仓库许可。本版调整中文措辞与排版,并说明原文的 -i/-I、IPv4/IPv6 和监听范围矛盾;示例命令与输出保留原样,未声称已经运行。
代码许可:The MIT License (MIT),Copyright (c) Microsoft Corporation。
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.











暂无评论内容