88

最近我在我的 Windows 机器上安装了WSL Ubuntu 18.04,但似乎没有任何工作正常,因为我无法访问互联网
我尝试了一些命令并sudo apt update说“连接失败”并且ping google.com确实需要永远,如您在此屏幕截图中看到的那样:


我还检查nano /etc/resolv.conf并确保名称服务器是正确的,完全禁用卡巴斯基及其防火墙,禁用 Hyper-V,重新安装 WSL 几次,甚至禁用 Windows Defender。没有任何帮助。

那么你有什么想法可能是这里的问题吗?

4

21 回答 21

133

出现此错误的原因是 Windows 自动生成带有错误名称服务器的 resolv.conf 文件。

要解决此问题,请按照以下步骤操作。

  1. 通过运行以下命令找到该文件:

    sudo nano /etc/resolv.conf

您将在文件中看到以下内容:

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/resolv.conf
# [network]
# generateResolvConf = false
nameserver xxx.xx.xx
  1. 将名称服务器值更改为8.8.8.8并保存文件。您现在应该可以连接到互联网了。
于 2021-05-30T01:04:42.723 回答
126

以管理员身份打开命令提示符并键入以下命令:

netsh winsock reset 
netsh int ip reset all
netsh winhttp reset proxy
ipconfig /flushdns

重新启动您的机器。

https://github.com/microsoft/WSL/issues/3438#issuecomment-410518578

于 2020-08-25T11:59:08.000 回答
24

复制对我有用的食谱。
在 Windows 10 上使用 WSL 2。

在https://github.com/microsoft/WSL/issues/5336#issuecomment-653881695找到的解决方案


脚步

  1. 以管理员身份打开 Powershell 或 Cmd
    并运行以下每个命令:

    wsl --shutdown
    netsh winsock reset
    netsh int ip reset all
    netsh winhttp reset proxy
    ipconfig /flushdns
    

  2. 按 Windows 键,
    键入Network Reset, 按
    回车键。

    你应该看到这个窗口。
    单击“立即重置”。

    网络重置魔法 WSL 修复

  3. 重新启动 Windows

如果幸运的话,WSL 2 现在应该能够sudo apt-get update && sudo apt-get upgrade.


奇怪的边缘案例

对我来说,我仍然无法 ping 站点,但互联网似乎在 WSL 2 的其他任何地方都可以使用。

例如,ping stackoverflow.com(或 ping 任何站点)
会导致“100% 数据包丢失”。

但是curl --location stackoverflow.com -i
会导致成功响应。

sudo apt-get update && sudo apt-get upgrade现在工作。


找到上述配方之前的故障排除步骤

几个月没有使用 WSL 2,sudo apt update当我发现我的互联网无法正常工作时,正在尝试从 Debian 发行版的终端。

花了一个小时配置我的 WSL 的 /etc/resolv.conf 和 /etc/wsl.conf 并排除自动配置错误 ( https://github.com/microsoft/WSL/issues/3928 )。仍然没有工作。

然后我找到了这个页面。尝试了张贴的方向。没用。

终于找到了这个发布的解决方案,WSL 2 突然完美运行。


花了我几个小时试图解决这个问题,希望有一天这对某人有用。

于 2020-10-26T22:09:54.080 回答
13

对我有用的食谱。(WSL2 + 思科 AnyConnect)

  1. 连接 VPN 并获取 DNS 服务器列表,稍后我们将需要它(在提升的 PowerShell 中执行)
Get-DnsClientServerAddress -AddressFamily IPv4 | Select-Object -ExpandProperty ServerAddresses
  1. 获取搜索域(在 PowerShell 中执行)
Get-DnsClientGlobalSetting | Select-Object -ExpandProperty SuffixSearchList
  1. 打开 WSL 并运行:
sudo unlink /etc/resolv.conf # this will unlink the default wsl2 resolv.conf

# This config will prevent wsl2 from overwritting the resolve.conf file everytime
# you start wsl2
cat <<EOF | sudo tee -a /etc/wsl.conf
[network]
generateResolvConf = false
EOF

cat <<EOF | sudo tee -a /etc/resolv.conf
nameserver 10.50... # The company DNS/nameserver from the command in step 1
nameserver 10.50... # The company DNS/nameserver from the command in step 1
nameserver 10.50... # list all nameservers from step 1
nameserver 8.8.8.8
nameserver 8.8.4.4
search this.searchdomain.com # The search domain that we got from step 2
EOF

# Make the new /etc/resolve.conf immutable
sudo chattr +i /etc/resolv.conf 
  1. 在 powershell 内将 Cisco Anyconnect 指标从默认 1 更改为 6000
Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 6000

每次 VPN 连接时都需要这样做。请参阅此处https://gist.github.com/machuu/7663aa653828d81efbc2aaad6e3b1431如何自动执行此任务。

  1. 在同一个提升的 powershell 上重新启动 wsl2,然后您可以打开 wsl2,它应该可以连接到互联网。
Restart-Service LxssManager

在这里拍摄:https ://jamespotz.github.io/blog/how-to-fix-wsl2-and-cisco-vpn

于 2021-10-19T18:45:12.430 回答
9

对我来说,当我从一个网络切换到另一个网络时,就会出现这个问题。例如,我在办公室 wifi 工作,然后我回家开始使用家庭 wifi。上面的https://stackoverflow.com/a/63578387/1409707答案对我有用。这似乎是一个实际问题,所以在 Windows 提出解决方案之前,我每次都必须找到一种更简单的方法来做到这一点。我复制了命令并创建了一个 bat 文件,将其保存在桌面上。因此,每次切换 wifi 连接/网络时,我都会以管理员身份运行 bat 文件并重新启动系统。我希望这对那些试图弄清楚它为什么会发生以及如何知道解决它的简单方法(不是永久的)的人有所帮助。

使用以下内容创建一个新的 .bat 文件。

我将我的文件命名为networkreset.bat

wsl --shutdown
netsh winsock reset
netsh int ip reset all
netsh winhttp reset proxy
ipconfig /flushdns
netsh winsock reset
shutdown /r 

每次切换 wifi/网络时,以管理员身份运行脚本并重新启动。

重新启动互联网后,在已连接网络上的 WSL 上工作。

于 2020-09-25T04:30:24.833 回答
5

所以我不知道这是否对任何人有帮助,但我在 Windows 上安装了 Docker,并按照 Microsoft 的说明安装了 Docker 推荐的 WSL2 引擎。

然后使用 WSL2 安装 Ubuntu 18.04 LTS 并遇到完全相同的问题 - 没有互联网。我真正想做的就是在我的工作笔记本电脑上构建一些 docker 镜像来测试,所以没有互联网的 WSL2 对我来说完全不行。

在围绕包括这个线程在内的各种论坛和指南进行了大量探索之后,这最终对我有用:

  • 我用 WSL2 重新安装了 Docker
  • 我从 Microsoft Store 安装了 Ubuntu 20.04 LTS,但使用命令提示符将 WSL 版本设置为 1,如下所示

第一个命令显示发行版列表:
C:\users\xyz> wsl -l -v

姓名 状态 版本
Ubuntu-20.04 跑步 1
码头工人桌面数据 跑步 2
码头工人桌面 跑步 2

所以现在使用以下命令设置 WSL 版本 - 替换您的发行版名称并使用 1 切换到 WSL v1

C:\users\xyz> wsl --set-version

结果

  1. 至此,我在 WSL 中拥有了一个完全正常工作的 Ubuntu 发行版,可以完全访问互联网,并且没有无法访问更新档案等的烦恼。但是,Ubuntu 发行版和我的 Docker 桌面之间没有连接。
  2. 为了解决最后一块难题 - 我使用了此链接上提供的指导。只需直接从那里按照说明进行操作 - 在这里复制太长了。

底线:我有一个 WSL1 Ubuntu 发行版,它连接到互联网,我可以使用 Dockerfiles 在 Ubuntu 中使用 CLI 构建 docker 映像,没有任何问题。

于 2021-03-20T06:16:24.943 回答
5

在我的情况下,如果不在 VPN 上,我的 WSL 上的互联网可以正常工作。当我连接到 VPN 时,它突然停止工作。有一个相关的讨论(在我发布的那天仍然开放)关于 WSL 上的互联网丢失而在 VPN here上。

之前针对此问题提出的此解决方案有效,但需要重新启动:

netsh winsock reset 
netsh int ip reset all
netsh winhttp reset proxy
ipconfig /flushdns

之前提出的另一个解决方案:

sudo nano /etc/resolv.conf

随着名称服务器更改为 8.8.8.8 或 1.1.1.1 或任何其他随机地址,它在 VPN 上对我不起作用。

解决它的方法是第二种解决方案和上面讨论的混合体:

步骤1:

在 Powershell中使用 VPN时:

ipconfig /all

搜索链接到您的 VPN 连接的适配器。通常你可以在描述中找到类似的东西

“思科 Anyconnect ...”

在该块中搜索您的 DNS 服务器的地址(对我来说,第一个 DNS 服务器不起作用,所以我选择了第二个)

第 2 步:取自 PowerShell 中的相同讨论

Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 6000

第 3 步:

在我的 WSL上使用 VPN时:

$ sudo echo "nameserver <the DNS server address from point 1>" > /etc/resolv.conf

此解决方案的缺点(与之前的解决方案一样)是您需要在每次新启动 WSL 时都执行此操作。为了让它更容易一点,可以创建一个简短的 .sh 脚本来自动化它。在您的 WSL 上:

$touch restore_internet_connection.sh
$nano restore_internet_connection.sh

将以下文本放入:

echo "nameserver <the output from point 1>" > /etc/resolv.conf

下次遇到问题时,只需重复步骤 2 并:

$sudo restore_internet_connection.sh
于 2021-07-14T08:50:37.330 回答
5

对我来说,名称服务器不再可 ping。所以我做了下面的事情,它对我有用。

  • 在 Windows 提示符中输入“打开或关闭 Windows 功能”,打开应用程序在此处输入图像描述
  • 在 Windows 功能中禁用 Linux 子系统在此处输入图像描述
  • 禁用 hyper-v(所有子组件)在此处输入图像描述
  • 单击“确定”并按照重新启动
  • 在 Windows 功能中启用 Linux 子系统在此处输入图像描述
  • 启用超 V在此处输入图像描述
  • 单击“确定”并按照重新启动

不幸的是,我无法删除 Ubuntu,因为它包含了我的工作。我已经尝试了这个和其他 stackoverflow 帖子中的所有内容,但没有成功。

但是以上内容对我有用,并且没有任何工作损失。

于 2021-07-29T04:13:14.577 回答
5

如果您修复它更改 DNS 但 WSL2 继续覆盖继续阅读。

  1. 替换名称服务器类似于@Jeffrey Kilelo's
# Replace the nameserver
sudo rm /etc/resolv.conf
sudo bash -c 'echo "nameserver 1.1.1.1" > /etc/resolv.conf'

如果你得到Operation not allowed。使用手动更改它sudo nano /etc/resolv.conf

  1. 要防止 WSL 2 覆盖此值,请运行以下命令
# Turn off generateResolvConf
sudo bash -c 'echo "[network]" > /etc/wsl.conf'
sudo bash -c 'echo "generateResolvConf = false" >> /etc/wsl.conf'
sudo chattr +i /etc/resolv.conf
于 2021-09-21T15:12:34.480 回答
3

非来自上面的工作。但是切换到 WSL 1 奏效了!

所以在 PowerShell 中作为管理员:

wsl --set-default-version 1

然后重新安装Ubuntu

于 2021-02-02T07:52:27.027 回答
3

确保对以下文件禁用 NTFS 压缩:

%TEMP%\swap.vhdx

%TEMP%\ApppData\Local\Temp 的文件属性窗口

如果您将整个 %TEMP% 文件夹移动到另一个位置,也可能会发生这种情况。

参考:

于 2021-06-01T20:39:01.883 回答
2

我多次使用此答案重新启动网络,但最后一次它不起作用。

它仅在取消选中压缩到“临时”文件夹 (%TEMP%) 后才恢复工作

compact /u /s:"%TEMP%" /i /Q

https://github.com/microsoft/WSL/issues/5336#issuecomment-770494713

因此,网络重启步骤。

命令行参考:

https://www.tenforums.com/tutorials/26340-compress-uncompress-files-folders-windows-10-a.html

于 2021-05-03T19:59:19.773 回答
2

注意- 此修复解决了 WSL 中的 DNS 解析问题。荒谬的设置可能会导致 WSL 发行版根本没有任何互联网连接。

解决方法是将以太网/WiFi 适配器的 DNS 设置为您的首选。WSL 使用主机的 DNS。像这样wget的命令对我有用,但是像这样的命令apt update似乎不起作用 - 基本上它无法解析 ubuntu 存档 URL。

如图所示,DNS 值为空。它是从主机的 DNS 推断出来的。

wsl_adapter_settings

这是手动提供 DNS 的主机的适配器属性的图像。如果您为主机选择自动 DNS 选项,某些事情可能无法在您的 ISP 提供的 DNS 上运行。

主机适配器设置

建议使用 OpenDNS、Google DNS 或 CloudFlare DNS,因为它们非常快速且可靠。使用 DNSBenchmark 为您的连接找到最快的。我想强调的是,这完全是您的选择。

于 2021-07-23T22:47:46.697 回答
1

不幸的是,对我来说唯一的解决方案是:

  • 卸载任何 Ubuntu(18.10 和 20.04)
  • 删除 Windows 功能中的 Linux 子系统
  • 重新开始
  • 在 Windows 功能中启用 Linux 子系统
  • 重新开始
  • 重新安装 Ubuntu 20.04

这是 Win10 V1909 (OS Build 18363.1379)。我已经尝试了这个和其他 stackoverflow 帖子中的所有内容,但没有成功。

我只建议将上述步骤作为绝对的最后手段。

于 2021-02-17T15:13:15.700 回答
1

好的,我知道这个帖子有一段时间没有太多活动了。我花了几天时间试图在工作笔记本电脑上解决这个问题,因为公司设置不允许 8.8.8.8 (Google DNS) 地址,我不仅必须编辑 WSL2 /etc/wsl.conf

#/etc/wsl.conf
[network]
generateResolvConf = False

我还必须编写一个 PowerShell 脚本,从 Windows 将实际的 DNS 服务器地址写入 WSL2 文件夹。我不知道是因为我的工作 PC 被锁定了多少还是什么,但我只能使用我的 Windows 机器使用的 DNS 服务器,而 WSL2 总是提取自己的 IP 地址来填充 resolv.conf 文件,该文件有没有 DNS 服务器。

任何其他遭受此问题的人,这就是我解决它的方法。将其保存为您想要的任何内容(在我的情况下,debian.ps1,从管理员 PowerShell 提示符 ./debian.ps1 运行),我使用导入的自定义 Debian Buster WSL2 发行版设置为默认值;如果您使用其他未设置为默认值的内容,则必须更改最后一行 (wsl.exe) 以启动正确的分发:

# Get the DNS server of the Windows machine, save into variable nameserver
$nameserver = Get-WmiObject -Namespace root\cimv2 -Query "Select dnsserversearchorder from win32_networkadapterconfiguration" | where {$_.DNSServerSEarchOrder -ne $null} | select -ExpandProperty DNSServerSearchOrder
# Convert nameserver object into a string
$nameserver = Out-String -InputObject $nameserver
# Run Set-Contents (sc) to write the resolv.conf file in a public location as it has DOS formatted line endings written by PowerShell, not readable by Linux
sc -Path 'c:\Users\Public\Documents\resolv.conf' -Value ('nameserver ' + $nameserver) -Encoding utf8
# Convert the DOS formatted file into UNIX format for WSL2 and write it in the proper place (\etc\resolv.conf, its primary location is \\wsl$\[distro_name] from Windows)
[string]::Join( "`n", (gc 'c:\Users\Public\Documents\resolv.conf')) | sc '\\wsl$\debian\etc\resolv.conf'
wsl.exe

请注意,如果您的发行版不在 \wsl$\debian\ 下,则需要将其更改为实际所在的位置。我知道这并不漂亮,并且从互联网上发布的许多不同解决方案中提取,但它是唯一适用于我公司管理的 PC 和组策略的解决方案。希望这可以在公司管理的 PC 上为某人节省很多麻烦。请注意,如果您通过 VPN 连接,我认为这不会起作用 - 我也没有在办公室测试过冠状病毒,它是在家庭 WiFi 上运行的。如果您直接在公司网络上,可能需要进行一些调整。

于 2021-07-23T21:19:49.800 回答
0

我在使用 debian 10 的 WSL2 上安装了 ufw,在删除它并重新启动 Windows 之后它就可以工作了。

于 2020-10-20T14:27:41.903 回答
0

当我试图在 WSL2 上安装 MySQL-Server 并搞砸 ssh@local 主机试图在 Ubuntu 上访问 root 时,这发生在我身上。
系统本身变得非常奇怪(有时我希望有 Ubuntu 的替代品)所以我尝试重新启动 vEthernet(WSL)适配器并重新启动计算机,它又恢复了工作。

于 2021-03-16T20:13:23.620 回答
0

就我而言,当我安装 WSL2 要求并将我的 wsl 升级到版本 2 时,WSL 网络开始无法正常工作。

它可以将域解析为 IP,但无法通过 Internet 访问 IP。

我将 OS 和 wsl2 模块更新为最新版本,并尝试了所有解决方案,但没有奏效。

最后,我找到了解决方案。

  1. 转到设备管理器并检查查看>隐藏设备
  2. 卸载所有 Hyper-V 虚拟交换机扩展
  3. 从功能中删除“适用于 Linux 的 Windows 子系统”
  4. 重新开始
  5. 从功能中添加“适用于 Linux 的 Windows 子系统”

对我来说,发行版在那之后仍然是第 2 版,但它正在工作!值得一试。

于 2021-04-22T19:39:05.257 回答
0

我安装了 wsl 和 Ubuntu 20.04。

经过几天的故障排除后,这对我有用。

我想相信像我这样遇到这个问题的人正在运行 wsl 版本 2。

这个问题在我切换回 wsl 版本 1 后立即得到解决,无需进一步配置。

要查看如何影响此更改,请点击此链接更改 wsl 版本

于 2021-07-07T07:19:38.853 回答
-1

您只需在终端中键入此命令即可解决此问题

-> sudo systemctl 重启网络管理器

于 2021-01-07T12:28:31.347 回答
-2

对我来说,这是 VPN 服务(NordVPN 服务)的一个问题,它会导致很多问题。只需从services.msc停止其服务。

于 2020-11-10T19:07:22.230 回答