使用 WSL 访问网络应用程序
使用 WSL 访问网络应用程序
本文详细介绍了在Windows Subsystem for Linux (WSL)中访问网络应用程序的相关知识。文章涵盖了IP地址识别、默认网络模式(NAT)下的网络访问、镜像模式网络的特点以及DNS隧道、自动代理等功能。
使用网络应用和 WSL 时需要了解一些注意事项。 默认情况下,WSL 使用基于 NAT 的体系结构。建议尝试新的镜像网络模式以获得最新的功能和改进。
标识 IP 地址
确定 IP 地址(用于通过 WSL 运行的 Linux 分发)时,需要考虑两种场景:
场景一:从 Windows 主机的角度来看
你想要查询通过 WSL2 运行的 Linux 分发的 IP 地址,使 Windows 主机上的程序可连接到分发(实例)中运行的服务器程序。
Windows 主机可使用命令:
wsl -d <DistributionName> hostname -I
如果查询默认分发,则可省略指定该分发的此部分命令:
-d
。 请务必使用大写
-I
标志,而不是小写
-i
。
在后台,主机命令
wsl.exe
启动目标实例并执行 Linux 命令
hostname -I
。 然后,此命令将 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 可使用
localhost
(127.0.0.1) 作为目标地址相互连接,因此不需要使用查询对等机的 IP 地址。
默认网络模式:NAT
默认情况下,WSL 使用基于 NAT(网络地址转换)的网络体系结构。 使用基于 NAT 的网络体系结构时,请牢记以下注意事项:
从 Windows (localhost) 访问 Linux 网络应用
如果要在 Linux 分发版中构建网络应用(例如,在 NodeJS 或 SQL server 上运行的应用),可以使用
localhost
从 Windows 应用(如 Microsoft Edge 或 Chrome Internet 浏览器)访问它(就像往常一样)。
从 Linux(主机 IP)访问 Windows 网络应用
如果要从 Linux 分发版(即 Ubuntu)访问 Windows 上运行的网络应用(例如,在 NodeJS 或 SQL 服务器上运行的应用),则需要使用主机的 IP 地址。 虽然这不是一种常见方案,但你可以执行以下步骤来使其可行。
- 通过在 Linux 分发版中运行以下命令来获取主机的 IP 地址:
ip route show | grep -i default | awk '{ print $3}'
- 使用复制的 IP 地址连接到任何 Windows 服务器。
下图显示了一个示例,该示例说明如何通过 curl 连接到在 Windows 中运行的 Node.js 服务器。
通过远程 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 访问,那么在 WSL 中运行的应用程序也可供在 LAN 中访问。
这不是 WSL 2 中的默认情况。 WSL 2 有一个带有其自己独一无二的 IP 地址的虚拟化以太网适配器。 目前,若要启用此工作流,你需要执行与常规虚拟机相同的步骤。 (我们正在寻找改善此体验的方法。)
下面是使用Netsh 接口 portproxyWindows 命令添加端口代理的示例,该代理侦听主机端口并将该端口代理连接到 WSL 2 VM 的 IP 地址。
netsh interface portproxy add v4tov4 listenport=<yourPortToForward> listenaddress=0.0.0.0 connectport=<yourPortToConnectToInWSL> connectaddress=(wsl hostname -I)
在此示例中,需要更新
到端口号,例如
listenport=4000
。
listenaddress=0.0.0.0
表示将接受来自任何 IP 地址的传入请求。 侦听地址指定要侦听的 IPv4 地址,可以更改为以下值:IP 地址、计算机 NetBIOS 名称或计算机 DNS 名称。 如果未指定地址,则默认值为本地计算机。 需要将
值更新为希望 WSL 连接的端口号,例如
connectport=4000
。 最后,
connectaddress
值必须是通过 WSL 2 安装的 Linux 分发版的 IP 地址(WSL 2 VM 地址),可通过输入命令:
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 看到的 WINDOWS 计算机的 IP 地址 (WSL 2 VM)
使用
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 看到的 WINDOWS 计算机的 IP 地址 (WSL 2 VM)
使用
listenaddress=0.0.0.0
将侦听所有IPv4 端口。
镜像模式网络
在运行 Windows 11 22H2 及更高版本的计算机上,可以,以启用镜像模式网络。 启用此功能会将 WSL 更改为全新的网络体系结构,其目标是将 Windows 上的网络接口“镜像”到 Linux 中,以添加新的网络功能并提高兼容性。
以下是启用此模式的当前优势:
- IPv6 支持
- 使用 localhost 地址
127.0.0.1
从 Linux 内部连接到 Windows 服务器。 不支持 IPv6 localhost 地址
::1 - 改进了 VPN 的网络兼容性
- 多播支持
- 直接从局域网 (LAN) 连接到 WSL
注意
使用管理员权限在 PowerShell 窗口中运行以下命令,以配置 Hyper-V 防火墙设置,从而允许入站连接:
Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
或
New-NetFirewallHyperVRule -Name "MyWebServer" -DisplayName "My Web Server" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 80
。
这种新模式解决了使用基于 NAT(网络地址转换)的体系结构时出现的网络问题。 查找已知问题或针对GitHub 上的 WSL 产品存储库中发现的任何 bug 提交反馈。
DNS 隧道
在运行 Windows 11 22H2 及更高版本的计算机上,在可使 WSL 使用虚拟化功能来应答来自 WSL 内的 DNS 请求,而不是通过网络数据包请求它们。 此功能旨在提高与 VPN 和其他复杂网络设置的兼容性。
自动代理
在运行 Windows 11 22H2 及更高版本的计算机上,在会强制 WSL 使用 Windows 的 HTTP 代理信息。 如果已在 Windows 中设置了代理,启用此功能会使该代理也在 WSL 中自动进行设置。
WSL 和防火墙
在运行 Windows 11 22H2 及更高版本以及运行 WSL 2.0.9 及更高版本的计算机上,Hyper-V 防火墙功能将默认打开。 这将确保:
- 请参阅具有高级安全性的 Windows Defender 防火墙,详细了解将自动应用于 WSL 的 Windows 安全功能。
- 请参阅配置 Hyper-V 防火墙,详细了解如何在本地应用这些规则和设置,以及如何通过 Intune 之类的在线工具这样做。