- WSL2 使用具有自己网络的虚拟机,可通过 NAT 或镜像模式进行配置,并由 Hyper-V 管理。
- wsl.conf 和 .wslconfig 的组合允许您调整从自动挂载和 systemd 到内存、CPU 和网络策略的一切内容。
- dnsTunneling、autoProxy 和 Hyper-V 防火墙等功能改进了 Windows 11 中 VPN、代理和安全性的集成。
- 通过精心配置,WSL2 可以成为一个用于开发、容器和安全自托管的可靠平台。
WSL2彻底改变了Linux与Windows的集成方式,尤其是在网络方面:现在我们拥有一个轻量级的虚拟机,它有自己的网络协议栈、IP地址和独立的访问规则。这为开发、测试、容器和自托管环境带来了诸多可能性,但也引发了服务无法访问的问题,就像WSL1那样。
了解 WSL2 的网络配置、NAT 和镜像模式、.wslconfig 和 wsl.conf 的使用方法,以及它们如何与防火墙、VPN、Docker 和 Tailscale 等工具交互,是避免各种麻烦的关键。我们将逐步讲解整个设置的工作原理,如何将服务暴露给 Windows 和局域网,如何使用命令获取正确的 IP 地址,以及有哪些高级配置选项可以微调环境,使其稳定且安全。
WSL2 中的网络实际工作原理
WSL2 不再像 WSL1 那样共享主机网络堆栈。相反,它在由 Hyper-V 管理的小型虚拟机中运行每个 Linux 发行版。该虚拟机有自己的虚拟网卡(通常)。 eth0)以及由内部虚拟交换机分配的私有 IP 地址。
WSL2 默认使用基于 NAT 的架构。 (网络地址转换)。Windows 充当路由器/主机,而 Linux 发行版则位于私有子网中,通常在指定范围内。 172.16.0.0/12重启或 WSL 重启后,此子网可能会发生变化,这在配置静态防火墙规则时让不少人感到抓狂。
从实际角度来看,这意味着您的 WSL2 发行版的 IP 地址不稳定,也无法像 WSL1 那样直接从 LAN 访问:默认情况下,Windows 和 WSL2 之间只能通过重定向规则和 NAT 进行连接,而暴露于本地网络则需要额外的步骤或使用镜像模式。
除了这种基本架构之外,Windows 11 22H2 及更高版本还增加了新的网络功能 (镜像模式、DNS隧道、自动代理、Hyper-V防火墙等)均由全局文件控制 .wslconfigLinux 中的某些选项是通过以下方式管理的: /etc/wsl.conf.
在 WSL2 中识别 IP 地址
使用 WSL2 时,需要明确区分两种 IP 地址场景:一种是需要 Linux 发行版的 IP 地址,另一种是从 Linux 系统视角获取 Windows 主机的 IP 地址。这两种场景分别使用不同的命令处理。
场景 1:在 Windows 系统中,您需要获取 WSL2 发行版的 IP 地址,以便主机上的应用程序(例如客户端、浏览器或测试工具)能够连接到在 Linux 系统中运行的服务。为此,您可以在 Windows 系统中运行以下命令(CMD 或 PowerShell):
wsl.exe --distribution <DistroName> hostname -i
如果要使用默认发行版,可以省略 distribution 参数。 只需拨打电话即可 wsl.exe hostname -i该命令在后台以 Linux 系统启动。 hostname --ip-addresses 并返回实例的 IP 地址。典型的结果可能如下所示:
172.30.98.229
场景 2:例如,在 Linux 发行版中,您需要知道 Windows 主机的 IP 地址,以便 WSL2 应用程序能够连接到在 Windows 上原生运行的服务器(Node.js、SQL Server、Caddy 等)。在 Linux shell 中,您可以使用:
ip route show | grep -i default | awk '{ print $3 }'
输出结果将是 WSL2 虚拟机的默认网关,它对应于 Linux 系统中看到的 Windows 主机 IP 地址,例如:
172.30.96.1
该值(例如, 172.30.96.1)是您的 Linux 客户端应该指向的地址 当您想在经典 NAT 模式下访问 Windows 主机上运行的服务时。
NAT 模式:WSL2 网络的默认行为
WSL2 默认以 NAT 模式运行,对于许多简单的开发环境来说,这已经足够了。重要的是要了解哪些功能“自动”有效,哪些无效,这样才不会浪费时间徒劳无功。
使用 localhost 从 Windows 访问 Linux 服务如果您在 WSL2 发行版上运行网络应用程序(例如,Node.js 服务器、Flask 服务器、Linux 上的 SQL Server),则可以使用以下命令从 Windows 访问它: localhost:puertoWindows 会自动将传入的连接转发到 WSL2 VM 的内部 IP 地址。
从 Linux 访问 Windows 上运行的服务:情况有所不同。要从 WSL2 访问主机上的网络应用程序(例如 Windows 上的 Node.js 服务器、SQL Server 或 Caddy),您必须使用从 Linux 看到的主机 IP 地址,该地址可通过默认路径命令获取:
ip route show | grep -i default | awk '{ print $3 }'
通过该 IP 地址,您可以从 Linux 连接到主机上的任何服务。, 例如 http://172.30.96.1:3000 如果您的 Windows 服务器监听所有接口的 3000 端口。
当您使用远程 IP 地址(而非本地主机)进行连接时,应用程序会将它们视为 LAN 连接。这意味着必须配置许多服务器来监听 0.0.0.0 而不是 127.0.0.1例如,使用 Flask,您可以启动:
app.run(host='0.0.0.0')
这一改变提高了可访问性,但需要格外注意安全性,因为您允许来自本地网络的连接,而不仅仅是来自设备本身的连接。
使用 NAT 从局域网 (LAN) 访问 WSL2
从 WSL1 升级到 WSL2 最令人恼火的变化之一是,发行版不再能直接从局域网访问。在 WSL1 中,如果你的 Windows 系统在网络上可见,发行版的服务几乎可以毫不费力地继承这种网络暴露。
在 WSL2 中,虚拟机拥有自己的私有 IP 地址,不会自动在局域网内发布。要实现与旧版虚拟机类似的功能,在 NAT 模式下,您需要在 Windows 中创建一个端口代理,就像您为任何 Hyper-V 虚拟机所做的那样。
Windows 系统自带一个经典的工具来完成这项任务: netsh interface portproxy将主机端口重定向到 WSL2 IP/端口的典型命令如下:
netsh interface portproxy add v4tov4 listenport=<puertoHost> listenaddress=0.0.0.0 connectport=<puertoWSL> connectaddress=(wsl hostname -I)
实际上,你需要将标记替换为特定值,例如:
netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100
这里 listenaddress=0.0.0.0 这表明 Windows 将监听主机上的所有 IPv4 地址。并将通过 4000 端口传入的数据转发到 192.168.101.100:4000这将是使用以下命令获得的 WSL2 IP 地址:
wsl hostname -I它会显示 WSL2 虚拟机内部 Linux 发行版的 IP 地址。cat /etc/resolv.conf它从 WSL2 中显示 Windows Vista 主机的 IP 地址。
使用此技术,您可以使在 WSL2 上运行的服务可从 LAN 上的任何计算机访问,只要 Windows 防火墙允许,并且您明确表示您暴露的是虚拟机的服务,而不是主机本身的服务。
IPv6 和现代网络功能
WSL2 也支持 IPv6,这在现代环境、VPN 和企业网络中尤为重要。管理地址时,Linux 中的基本命令与 IPv4 的命令相同:
wsl hostname -i从 Windows 查看 WSL2 发行版的 IP 地址ip route show | grep -i default | awk '{ print $3 }'从 Linux 获取 Windows 主机的 IP 地址
IPv6 和 VPN 支持质量的真正飞跃体现在镜像网络模式上,该模式在 Windows 11 22H2 及更高版本中可用,我们稍后将详细介绍。
镜像网络模式:在 Linux 中镜像 Windows 接口
在安装了 Windows 11 22H2 或更高版本的计算机上,您可以在 WSL2 中激活“镜像”网络模式,这将完全改变网络模式:Linux 不会使用传统的 NAT,而是“看到” Windows 网络接口的镜像。
要启用它,您需要编辑该文件。 .wslconfig 您的用户,位于 %UserProfile%\.wslconfig您可以使用管理员权限通过 PowerShell 打开它:
notepad $env:USERPROFILE\.wslconfig
在配置文件中添加(或修改)[wsl2] 部分以激活镜像模式:
[wsl2]
networkingMode=mirrored
文件保存后,需要重启 WSL2 才能使更改生效,例如:
wsl --shutdown
重启后,WSL 将使用新的镜像网络架构,这带来了几个强大的优势:
- 原生支持 IPv6,并改进了与企业网络和 VPN 的集成
- 能够从 Linux 连接到 Windows 服务
127.0.0.1直接 (尽管这是不允许的)::1(例如使用 IPv6 回环) - 改进了 Windows-Linux 集成中的多播支持
- 无需使用 netsh portproxy 即可从 LAN 直接访问 WSL使用 Windows 计算机本身的 IP 地址
启用此模式可以解决许多经典的 WSL2 NAT 问题,并且是大多数现代开发和自托管环境中(可以使用更新的 Windows 11)的推荐选项。
WSL2 中的 DNS 隧道和代理的使用
在 Windows 11 22H2 及更高版本中,WSL2 的名称解析也得到了重大改进。关键在于以下两个功能: .wslconfig: dnsTunneling y autoProxy.
选择 dnsTunneling 默认情况下,[wsl2] 部分已启用此功能。 这样一来,Linux DNS 请求就可以通过虚拟化功能进行处理,而不是作为普通的网络数据包发送出去。这大大提高了与 VPN 以及主机上复杂网络配置的兼容性。
就其本身而言, autoProxy=true 强制 WSL 使用 Windows HTTP 代理设置如果主机位于企业代理或安全代理之后,WSL2 会自动继承它,而无需您手动处理环境变量。
例如,你可以在你的文件中放入类似这样的内容。 .wslconfig:
[wsl2]
dnsTunneling=true
autoProxy=true
这样可以确保 WSL2 网络的行为与主机配置保持一致,这对于具有严格网络和过滤策略的公司来说尤其有用。
Hyper-V 防火墙和安全服务暴露
在现代环境中,WSL2 网络还会经过专用防火墙。从 Windows 11 22H2 上的 WSL 2.0.9 开始,Hyper-V 防火墙功能默认启用,为虚拟机流量(包括 WSL2 流量)增加了一层额外的过滤。
如果您在镜像模式下工作,并且想要永久地将 WSL2 服务暴露给 LAN(例如 API、仪表板或自托管服务),则需要确保防火墙规则允许这样做。
使用具有管理员权限的 PowerShell 的合理方法是为专用网络创建 Hyper-V 规则:
New-NetFirewallHyperVRule -DisplayName "WSLPrivateInboundRule" -Profiles Private -Direction Inbound -Action Allow -VMCreatorId ((Get-NetFirewallHyperVVMCreator).VMCreatorId)
如果出于某种原因您想要禁用该特定的 Hyper-V 保护(不建议这样做),您可以使用:
Set-NetFirewallHyperVVMSetting -Name ((Get-NetFirewallHyperVVMCreator).VMCreatorId) -Enabled False
其理念是尽可能保持防火墙处于活动状态,将规则限制在专用网络和真正需要的端口上,并将任何大规模停用作为最后的手段,并且始终以在一切正常运行后立即重新加强配置为目标。
WSL2 网络架构、X11 和 172.16.0.0/12 网段
一个揭示 WSL2 网络细节的经典案例是通过 X11 使用图形应用程序,例如在 Windows 上启动 Xming 并通过 DISPLAY 发送 Linux 应用程序。
从 WSL1 升级到 WSL2 时,许多用户发现 X 停止工作。 因为网络不再是“共享”的,而是变成了具有以下范围的虚拟NAT网络: 172.16.0.0/12每次重启 Windows 或 WSL 后,情况都可能发生变化。
要在 WSL2 中使用 Xming 让 X 重新工作,通常的方法是获取 Linux 看到的 Windows IP 地址:
ENS
DISPLAY=$(grep nameserver /etc/resolv.conf | cut -d' ' -f2):0
同时,需要调整 Windows 防火墙,允许来自该 NAT 子网的 X11 流量。一种典型的方法是通过添加范围来编辑 Xming 规则。 172.16.0.0/12 TCP+UDP 6000。
许多人最终选择禁用 Xming 身份验证。 -ac这实际上为来自该网络的任何客户端 X 都“敞开了大门”。虽然这种方法可行,但从安全角度来看却非常值得怀疑,因此值得考虑更有限的解决方案,或者在 Windows 11 中使用 WSLg(集成图形用户界面应用程序)。
wsl.conf 和 .wslconfig:高级 WSL2 配置
WSL 提供两个关键配置文件,分别控制虚拟机和每个发行版的行为。: /etc/wsl.conf (按发行版) %UserProfile%\.wslconfig (适用于所有 WSL2 发行版)
wsl.conf 它存在于 Linux 发行版中,在 /etc/wsl.conf它用于配置该发行版的本地选项:自动挂载、生成 hosts y resolv.conf与 Windows、默认用户、systemd 等的互操作性。
.wslconfig 它保存在 Linux 系统之外,而是保存在 Windows 用户配置文件中。 (C:\Users\<Usuario>\.wslconfig)并控制为 WSL2 提供支持的虚拟机的全局参数:内存、CPU、内核、网络模式、防火墙、DNS、虚拟磁盘大小、GUI 支持等。
一个有趣的细节是更改设置时的“8 秒规则”:修改任何这些文件后,必须确保 WSL 虚拟机完全关闭。即使关闭发行版窗口,它也可能在内存中保留几秒钟。
要强制重启子系统,可以使用:
wsl --list --running检查是否有任何活跃的发行版wsl --shutdown一次性关闭所有分配wsl --terminate <distroName>停止特定发行版
只有当 WSL 关闭并重新启动后,配置更改才会真正生效,很多人忽略了这一点,认为他们的设置“不起作用”。
按部分划分的主要 wsl.conf 选项
文件 wsl.conf 它借鉴了经典的 .ini 格式,包含各个部分和键。主要部分包括: [automount], [network], [interop], [user], [boot], [gpu] y [time].
En [automount] 您可以控制如何在 Linux 中挂载 Windows 驱动器。 (通常较低) /mnt):
enabled(布尔值,默认为 true)如果为真,C:/、D:/ 等将自动挂载。/mnt/c,/mnt/d...mountFsTab(布尔)如果属实,则进行处理。/etc/fstab启动发行版时。root(链):例如,驱动器将挂载到的根目录。/windir/有/windir/c.options(逗号分隔列表):DrvFs 特有的参数,例如metadata,uid,gid,umask,fmask,dmaskocase.
DrvFs 是 Windows 和 Linux 之间的桥接文件系统,旨在从 WSL 访问 NTFS,并具有权限控制、元数据和区分大小写的功能。
在本节中 [network] 您可以调整网络文件的自动生成。:
generateHosts如果为真,WSL 会自动生成/etc/hosts.generateResolvConf如果属实,WSL 会创建/etc/resolv.conf使用传统 DNS。hostname:发行版将使用的主机名。
部分 [interop] 控制与 Windows 的互操作性:
enabled启用或禁用从 WSL 启动 Windows 进程的功能。appendWindowsPath决定是否将 Windows 路径添加到$PATHLinux。
En [user] 您可以指定启动发行版时默认使用的用户。:
default:WSL 中默认启动的用户名。
部分 [boot] 它在 Windows 11 和 Server 2022 中尤其有用。 在 WSL 中自动启动 Docker 等服务:
command:启动 WSL 时要执行的命令字符串,例如service docker start.protectBinfmt:在启用 systemd 时保护 systemd 单元的生成。
你还有一些类似这样的部分 [gpu] (允许从 Linux 访问 Windows GPU),以及 [time] 将时区与 Windows 同步这样可以避免在切换到夏令时或旅行时出现问题。
.wslconfig:WSL2 虚拟机控制
wsl.conf 文件用于微调各个发行版的行为,而 .wslconfig 文件则允许您微调所有 WSL2 发行版共享的虚拟机。此文件仅适用于以 WSL2 方式运行的发行版,不适用于 WSL1。
内 .wslconfig 主要部分是 [wsl2]您可以在此处定义关键参数:
kernelykernelModules:从 Windows 到自定义 Linux 内核及其模块的绝对路径。memory例如:虚拟机内存限制(默认为主机内存的 50%)。4GB.processors分配给虚拟机的逻辑处理器数量。localhostForwarding允许从 Windows 访问 WSL2 中的开放端口localhost.swapyswapFile虚拟机交换文件的大小和路径。guiApplications启用或禁用 GUI 应用程序支持 (WSLg)。dnsProxy当您处于 NAT 模式时,它会决定 Linux DNS 服务器是主机的 NAT 实例还是 Windows DNS 的副本。networkingMode在这里您可以选择none,nat,bridged(过时的),mirroredovirtioproxy.firewall,dnsTunnelingyautoProxy:我们讨论过如何更好地将 WSL 网络与 Windows 策略集成。defaultVhdSize:发行版文件系统存储的 VHD 的最大大小(默认 1 TB)。
还有一个部分 [experimental] 测试中激活哪些功能 如:
autoMemoryReclaim:自动内存恢复设置(禁用、渐进、删除缓存)。sparseVhd创建稀疏虚拟磁盘以节省空间。bestEffortDnsParsingydnsTunnelingIpAddress:针对 DNS 隧道进行微调。ignoredPorts:即使在镜像模式下,Linux 应用程序也可以使用这些端口,即使它们正在 Windows 上使用。hostAddressLoopback允许主机和容器以镜像模式使用主机的本地 IP 地址进行连接。
正确配置 .wslconfig 文件,可以区分资源消耗巨大的虚拟机和与 Windows 和网络良好配合的优化环境,尤其是在处理繁重工作负载、容器或多个并发发行版时。
使用 Tailscale 实现自托管的 WSL2、Docker 和网络
一个非常实际的例子是在 Windows 服务器(甚至是 Windows Server 2025)上使用 WSL2 作为自托管平台,将 WSL2 上的 Ubuntu、Docker Engine(不使用 Docker Desktop)、Tailscale 和像 Caddy 这样的反向代理结合起来,以公开 n8n 或 Supabase 等服务。
目标是在 WSL2 中构建一个稳定的 Docker 环境,避免服务器上 Docker Desktop 出现的问题。通过在 Ubuntu (WSL2) 上直接安装 Docker Engine,容器网络依赖于 WSL2 网络,而 WSL2 网络又依赖于 .wslconfig 文件中定义的 NAT 或镜像模式。
在 WSL2 上安装 Tailscale 后,您可以在网状 VPN 上发布您的服务,而无需在路由器上打开端口,并使用 Caddy 作为反向代理来集中管理 TLS 证书、路由和容器之间的轻量级负载均衡。
为了维护一个干净、可预测且安全的网络,建议:
- 选择一种统一的网络模式(NAT 或镜像)并记录下来。
- 避免 Windows 和 WSL2 之间的端口冲突依靠
ignoredPorts如果你使用镜像 - 仅通过 Tailscale 或 Caddy 控制服务暴露而不是在防火墙中“默认”打开端口
- 自动启动 Docker、Tailscale 和 Caddy
[boot]在 wsl.conf 中 为了拥有更接近生产环境的环境
有了这种架构,WSL2 不再仅仅是一个开发工具,而且可以成为一个相当严肃的自托管平台,前提是您接受它的局限性(通过 Hyper-V 进行虚拟化、额外的网络层等)并仔细配置它。
WSL2 网络开发和测试最佳实践
除了微调之外,还有许多指导原则可以帮助您轻松地使用 WSL2 网络,而无需不断地与 IP、端口和防火墙作斗争。
对于开发服务,请使用高端口(1024 以上),并避免使用特权端口或使用频繁的系统端口;这样可以最大限度地减少冲突,并消除对额外权限的需求。
确保代码和数据位于 Linux 文件系统中。 (你 ~/ 或内部路线)而不是直接处理 /mnt/c因为从 WSL 访问 NTFS 速度较慢,可能会影响 I/O 密集型服务。
使用脚本自动执行网络设置和重定向规则 在 PowerShell 和 Bash 中:例如,一个在 WSL2 启动时配置它的脚本。 netsh portproxy (如果您继续使用 NAT)或者在使用镜像时检查防火墙规则。
避免依赖频繁更换IP地址 由内部虚拟交换机生成。尽可能与……合作 localhost主机名或条目 /etc/hosts 为了您的服务,这样 IP 地址的变更就不会破坏您一半的测试基础设施。
在专业或半生产环境中,最好不要盲目依赖 WSL 的自动转发功能。应显式配置端口、代理和防火墙规则,以便准确了解哪些流量暴露在外以及暴露在何处。
正确配置后,WSL2 提供了一个隔离而灵活的网络,非常适合高级开发、API 测试、容器化工作以及模拟分布式环境。关键在于掌握网络模式(NAT 与镜像)、wsl.conf 和 .wslconfig 文件,以及与防火墙和堆栈中的工具(Docker、Tailscale、反向代理)的交互,从而确保 Windows 和 Linux 可以在同一台机器上运行,而不会出现端口冲突或安全隐患。