我有适用于 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 中以管理员身份运行该命令。