使用 WSL 访问网络应用程序

使用网络应用和 WSL 时,需要注意一些注意事项。 默认情况下,WSL 使用 基于 NAT 的体系结构,建议尝试新的 镜像网络模式 来获取最新的功能和改进。

标识 IP 地址

确定用于通过 WSL 运行的 Linux 分发的 IP 地址时,需要考虑两种情况:

方案一: 从 Windows 主机的角度来看,你想要查询通过 WSL2 运行的 Linux 分发版 IP 地址,以便 Windows 主机上的程序可以连接到分发(实例)中运行的服务器程序。

Windows 主机可以使用命令:

wsl -d <DistributionName> hostname -I

如果查询默认分布,则可以省略指定分发的命令的此部分: -d <DistributionName> 请务必使用大写 -I 标志,而不是小写 -i

在后台,主机命令wsl.exe启动目标实例并执行 Linux 命令hostname -I(这是--all-ip-addresses的简写)。 然后,此命令会将 WSL 实例的 IP 地址打印到 STDOUT。 然后,文本 STDOUT 内容将中继回 wsl.exe。 最后,wsl.exe 显示该输出到命令行。

典型的输出可能是:

172.30.98.229

方案二: 通过 WSL2(实例)在 Linux 分发中运行的程序想要知道 Windows 主机的 IP 地址,以便 Linux 程序可以连接到 Windows 主机服务器程序。

WSL2 Linux 用户可以使用命令:

ip route show | grep -i default | awk '{ print $3}'

典型的输出可能是:

172.30.96.1

因此, 172.30.96.1 此示例中是 Windows 的主机 IP 地址。

注释

当 WSL2 使用默认 NAT 网络模式运行时,通常需要上述 IP 地址查询作。 当 WSL2 运行在新的 镜像模式下时,Windows 主机和 WSL2 虚拟机 (VM) 可以相互连接,使用 (127.0.0.1)作为目标地址,因此不需要使用查询对方的 IP 地址。

默认网络模式:NAT

默认情况下,WSL 使用基于 NAT(网络地址转换)的体系结构进行网络。 使用基于 NAT 的网络体系结构时,请记住以下注意事项:

从 Windows 访问 Linux 网络应用(localhost)

如果要在 Linux 分发版中构建网络应用(例如,在 NodeJS 或 SQL Server 上运行的应用),则可以使用 localhost Windows 应用(如 Edge 或 Chrome Internet 浏览器)访问它(就像平时一样)。

从 Linux 访问 Windows 网络应用(主机 IP)

如果想要从 Linux 分发版(即 ie Ubuntu)访问在 Windows 上运行的网络应用(例如 NodeJS 或 SQL Server 上运行的应用),则需要使用主机的 IP 地址。 虽然这不是一种常见情况,但可以按照以下步骤使其发挥作用。

  1. 通过从 Linux 分发版运行以下命令来获取主机的 IP 地址:
ip route show | grep -i default | awk '{ print $3}'
  1. 使用复制的 IP 地址连接到任何 Windows 服务器。

下图显示了通过 curl 连接到在 Windows 中运行的 Node.js 服务器的示例。

通过 Curl 连接到 Windows 中的 NodeJS 服务器

通过远程 IP 地址进行连接

使用远程 IP 地址连接到应用程序时,它们将被视为来自局域网(LAN)的连接。 这意味着需要确保应用程序可以接受 LAN 连接。

例如,可能需要将应用程序绑定到0.0.0.0,而不是127.0.0.1。 在使用 Flask 的 Python 应用示例中,可以使用以下命令完成此作。 app.run(host='0.0.0.0') 在进行这些更改时,请记住安全性,因为这将允许来自 LAN 的连接。

从局域网(LAN)访问 WSL 2 分发版

使用 WSL 1 分发版时,如果计算机已设置为由 LAN 访问,则可以在 LAN 上访问在 WSL 中运行的应用程序。

这不是 WSL 2 中的默认情况。 WSL 2 具有具有其自己的唯一 IP 地址的虚拟化以太网适配器。 目前,若要启用此工作流,需要执行与常规虚拟机相同的步骤。 (我们正在研究改善此体验的方法。

下面是使用 Netsh 接口 portproxy Windows 命令添加一个端口代理的示例,该代理侦听主机端口并将该端口代理连接到 WSL 2 VM 的 IP 地址。

netsh interface portproxy add v4tov4 listenport=<yourPortToForward> listenaddress=0.0.0.0 connectport=<yourPortToConnectToInWSL> connectaddress=(wsl hostname -I)

在此示例中,需要更新 <yourPortToForward> 到端口号,例如 listenport=4000listenaddress=0.0.0.0 表示将从 ANY IP 地址接受传入请求。 侦听地址指定要侦听的 IPv4 地址,并且可以更改为包括:IP 地址、计算机 NetBIOS 名称或计算机 DNS 名称的值。 如果未指定地址,则默认值为本地计算机。 需要将 <yourPortToConnectToInWSL> 值更新为要在其中连接 WSL 的端口号,例如 connectport=4000。 最后,connectaddress该值必须是通过 WSL 2(WSL 2 VM 地址)安装的 Linux 分发版的 IP 地址,可通过输入以下命令找到该值: wsl.exe hostname -I

因此,此命令可能如下所示:

netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100

若要获取 IP 地址,请使用:

  • wsl hostname -I 用于通过 WSL 2 安装的 Linux 发行版的 IP 地址(WSL 2 VM 地址)
  • cat /etc/resolv.conf 是从 WSL 2 (WSL 2 VM) 视角看到的 Windows 计算机的 IP 地址

使用 listenaddress=0.0.0.0 将侦听所有 IPv4 端口

注释

使用带主机名命令的小写“i”将生成与使用大写“I”不同的结果。 wsl hostname -i 是本地计算机(127.0.1.1 是用于诊断的占位符地址),而 wsl hostname -I 将返回其他计算机看到的本地计算机的 IP 地址,并应用于标识通过 WSL 2 运行的 Linux 发行版的 connectaddress

IPv6 访问

  • wsl hostname -i 用于通过 WSL 2 安装的 Linux 发行版的 IP 地址(WSL 2 VM 地址)
  • ip route show | grep -i default | awk '{ print $3}' 是从 WSL 2 (WSL 2 VM) 视角看到的 Windows 计算机的 IP 地址

使用 listenaddress=0.0.0.0 将侦听所有 IPv4 端口

镜像模式网络

在运行 Windows 11 22H2 及更高版本的计算机上,你可以在networkingMode=mirrored文件中[wsl2].wslconfig进行设置,以启用镜像模式网络。 启用此项会将 WSL 更改为全新的网络体系结构,该体系结构的目标是将 Windows 上的网络接口“镜像”到 Linux,以添加新的网络功能并提高兼容性。

以下是启用此模式的当前优势:

  • IPv6 支持
  • 使用 localhost 地址 127.0.0.1从 Linux 内部连接到 Windows 服务器。 不支持 IPv6 本地主机地址::1
  • 改进了 VPN 的网络兼容性
  • 多播支持
  • 直接从局域网 (LAN) 连接到 WSL

注释

在 PowerShell 窗口中运行以下命令,具有管理员权限,以 配置 Hyper-V 防火墙 设置以允许入站连接: Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction AllowNew-NetFirewallHyperVRule -Name "MyWebServer" -DisplayName "My Web Server" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 80

此新模式解决了使用基于 NAT(网络地址转换)体系结构的网络问题。 在 GitHub 上的 WSL 产品存储库中查找已知问题或提交反馈。

DNS 隧道

在运行 Windows 11 22H2 及更高版本的计算机上,文件中的设置dnsTunneling=true[wsl2].wslconfig具有 WSL 使用虚拟化功能应答来自 WSL 中的 DNS 请求,而不是通过网络数据包请求这些请求。 此功能旨在提高与 VPN 和其他复杂网络设置的兼容性。

自动代理

在运行 Windows 11 22H2 及更高版本的计算机上,在文件中的设置autoProxy=true[wsl2].wslconfig会强制 WSL 使用 Windows 的 HTTP 代理信息。 如果已在 Windows 中设置了代理,则启用此功能也会使该代理在 WSL 中自动设置。

WSL 和防火墙

在运行 Windows 11 22H2 及更高版本(WSL 2.0.9 及更高版本)的计算机上,默认情况下将打开 Hyper-V 防火墙功能。 这将确保: