Windows 版 Ubuntu 应用程序偶尔会收到“名称解析暂时失败”错误

Windows 版 Ubuntu 应用程序偶尔会收到“名称解析暂时失败”错误

我有适用于 Windows 的 Ubuntu 应用程序(从 Microsoft 商店下载),但我不断收到名称解析错误暂时失败。

ping: google.com: Temporary failure in name resolution

在我连接到 VPN 和未连接到 VPN 时都会发生这种情况。但是,如果我运行以下命令:

echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

这样就解决了未连接到 VPN 时的问题。但是,即使运行该命令后,如果我连接到 VPN,它仍然不起作用。

我需要通过 ssh 连接到远程服务器,这需要我使用 VPN 才能访问。因此,我需要确定为什么连接到 VPN 时名称解析不发生。即使没有连接到 VPN,我也希望永久解决该问题,这样我就不必每次都运行上述命令。

/etc/resolv.conf文件如下所示(运行上述命令之前):

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.22.96.1

我非常感激任何想法!

答案1

我需要通过 ssh 连接到远程服务器,这需要我使用 VPN 才能获得访问权限。

对于这个特定的用例,至少解决方案应该(希望)相当简单——创建 WSL1 实例而不是 WSL2。

WSL2 的网络已虚拟化并进行了 NAT在后面(在)Windows 机器内。通常,当 WSL2 启动时,该/init进程会创建一个resolv.conf指向视窗机器,Windows 机器上的进程充当代理解析器。

虽然我不确定你的失败原因不是连接到 VPN,我确实知道 WSL2 在通过多种类型的 VPN 连接时存在严重问题。一些 VPN(尤其是企业 VPN)会阻止全部连接时本地流量。例如,如果您的本地网络上有另一台计算机或打印机,则连接到 VPN 时您可能也无法访问它。而且由于 WSL2 在 Windows 看来是“另一台计算机”(某种意义上),它也会阻止对它的访问。因此,当连接到许多 VPN 时,解析器将无法工作。

另一方面,WSL1 没有这个问题。它分享(一种“桥梁”)与 Windows 的网络接口。

由于ssh在 WSL1 下运行良好,所以这可能是您的最佳选择。

您可以将现有的 WSL2 发行版转换或复制到 WSL1。无论哪种方式,都从备份开始。从 PowerShell:

wsl -l -v
# Confirm the distribution name and 
# adjust the following commands as needed
wsl --export <distro> ubuntu_backup.tar

转换:

wsl --set-version <distro> 1

复制:

mkdir <location>
wsl --import Ubuntu_WSL1 <location> <path_to>/ubuntu.tar --version 1

其他可能性

我自己还没有测试过这个,但是如果你使用的是 Windows 11 专业版(或教育版)或更高版本,Microsoft Store 中有一个 WSL 预览版。此版本目前有一项新功能,可让你创建桥接的 Hyper-V 网络交换机并在 WSL2 中使用它。

可能允许您在连接到 VPN 时使用 WSL2。

这篇 Reddit 帖子了解详情。

但实际上,在这种情况下我会选择 WSL1。正是出于这个原因,我保留了 WSL2 和 WSL1 实例(以及其他一些 WSL1 仍然优于 WSL2 的实例)。

答案2

使用 WSL1 作为@NotTheDr01ds 建议如果这对您来说是一个选择的话,这可能是最简单的。

您的问题可能是由于 WSL2 的网络实现导致其流量看起来像本地网络而不是本地主持人到 VPN 适配器:

[...] 我们希望在 VPN 开启时所有流量都通过 VPN。唯一的问题是……VPN 只会转发来自本地计算机的流量,而来自 WSL 2 的流量不被视为您的本地计算机。VPN 驱动程序将其视为本地网络。想想吧!

简而言之,这就是我们的问题:每次 VPN 连接时,它都会向 WSL 2 的路由表添加一条高优先级规则。此路由会将所有 WSL 2 流量直接路由到 VPN 的虚拟适配器。适配器欣然接受,然后将其全部放入黑洞,从而有效地杀死所有网络流量。

解决方案的范围从相当复杂到非常复杂(我自己还没有解决它)。

起点是:

太棒了!有什么解决办法吗?很简单。我们删除 VPN 添加的优先路由。

一旦被丢弃,路由将回退到其他两个优先级较低的规则,并将所有 WSL 2 流量路由到 Windows 主机。到达那里后,它将像往常一样流经 VPN。

详细步骤关于作者如何实现这一点。请注意,他们有 3 篇关于这个问题的文章。

答案3

我找到了问题的答案,WSL 上的名称解析暂时失败, 在询问Ubuntu,确实对我有用。

New-NetFirewallRule -DisplayName "WSL allow in" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow

您只需要记住在 Powershell 中以管理员身份运行该命令。

相关内容