在 WSL Ubuntu (Linux 的 Windows 子系统)上没有 Internet 连接

最近我在我的 Windows 机器上安装了 WSL Ubuntu 18.04,但似乎没有什么正常工作,因为我有 不能上网
我试了几个命令,结果 sudo apt update说“连接失败”,而 ping google.com就像你在这张截图中看到的那样,实际上永远都不会恢复:


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

那你知道这里的问题是什么吗?

228650 次浏览

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

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

重启你的机器。

Https://github.com/microsoft/wsl/issues/3438#issuecomment-410518578

对我来说,当我从一个网络切换到另一个网络时,就会出现这个问题。举个例子,我在办公室工作,然后回家开始使用家里的 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/network 时,以管理员身份运行脚本并重新启动。

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

我用 debian10在 WSL2上安装了 ufw,在删除它并重新启动 Windows 之后,它工作了。

抄袭我的配方。
在 Windows10上使用 WSL2。

https://github.com/microsoft/WSL/issues/5336#issuecomment-653881695发现的解决方案


步骤

  1. 以 Administrator < br > 打开 Powershell 或 Cmd 并运行以下命令:

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

  2. 按下 Windows 键,< br > 键入 Network Reset,
    按回车键。

    你应该看看这扇窗户。
    点击“立即重置”。

    Network Reset magic WSL fix

  3. 重启视窗

如果幸运的话,WSL2现在应该能够使用 sudo apt-get update && sudo apt-get upgrade了。


奇怪的边缘情况

对我来说,我仍然无法 ping 网站,但互联网似乎在其他任何地方的 WSL2工作。

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

但是 curl --location stackoverflow.com -i
导致一个成功的反应。

sudo apt-get update && sudo apt-get upgrade现在起作用了。


在找到上述配方之前的疑难解答步骤 :

已经几个月没有使用 WSL 2了,当我发现我的互联网无法工作时,我正试图从 Debian 发行版的终端上使用 sudo apt update

花了一个小时配置我的 WSL 的/etc/Resolv.conf 和/etc/WSL.conf 并排除自动配置错误(https://github.com/microsoft/WSL/issues/3928)。

然后我找到了这个页面,尝试了发布的说明,没有用。

最终找到了这个发布的解决方案,WSL2突然完美地工作了。


我花了好几个小时来解决这个问题希望有一天能派上用场。

对我来说,这是 VPN 服务(NordVPN 服务)的一个问题,它导致了许多问题。 只要停止它的服务从 服务,理学硕士

您可以通过在终端中键入这个命令来解决这个问题

- > sudo systemctl 重新启动网络管理器

不是上面的人干的。 但是切换到 WSL 1工作!

因此,在 PowerShell,作为一名管理者:

wsl --set-default-version 1

然后重新安装 Ubuntu

不幸的是,对我来说,唯一的解决办法是:

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

这是使用 Win10 V1909(OS Build 18363.1379)完成的。我已经尝试了所有这个和其他堆栈溢出的职位,没有成功。

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

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

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

然后用 WSL2安装了 Ubuntu 18.04 LTS,却遇到了完全相同的问题——没有网络。所有我真的想能够做的是建立一些码头图像测试,在我的工作笔记本电脑,所以 WSL2没有互联网是一个完全不适合我。

在浏览了各种论坛和指南(包括这个帖子)之后,下面是最终对我有效的方法:

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

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

姓名 国务院 版本
Ubuntu-20.04 跑步 1
多克-桌面-数据 跑步 2
Docker-桌面电脑 跑步 2

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

C: users xyz > wsl-set-version

结果

  1. 在这一点上,我有一个完全工作的 Ubuntu 发行版在 WSL,完全访问互联网,没有无法访问更新档案等烦恼。但是,Ubuntu 发行版和我的 Docker 桌面之间没有连接。
  2. 为了解决这个难题的最后一部分,我使用了 这个链接提供的指导。直接从那里按照说明做就行了——在这里重现太长了。

总之: 我有一个 wsl 1的 Ubuntu 发行版,它连接到互联网,我可以使用 Dockerfiles 的 CLI 在 Ubuntu 中构建 docker 图像,没有任何问题。

在我的例子中,当我安装 WSL2需求并将 WSL 升级到版本2时,WSL 网络就开始不工作了。

它可以将域解析为 IP,但不能通过因特网接触到 IP。

我更新了操作系统和 wsl2模块到最新版本,并尝试了所有的解决方案,但它不工作。

最后,我找到了解决办法。

  1. 转到设备管理器并检查查看 > 隐藏设备
  2. 卸载所有 Hyper-V 虚拟开关扩展
  3. 从特性中删除“ Linux 的 Windows 子系统”
  4. 重启
  5. 从特性中添加“ Linux 的 Windows 子系统”

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

我使用这个答案重新启动网络好几次,但最后一次它没有工作。

它只有在取消选中压缩到“ TEMP”文件夹(% 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

发生此错误的原因是 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并保存文件。现在您应该能够连接到 Internet。

确保禁用下列文件的 NTFS 压缩:

%TEMP%\swap.vhdx

(即 正常情况下{ 234} : C:\Users\%USERNAME%\AppData\Local\Temp\swap.vhdx)

File properties window for %TEMP%\AppData\Local\Temp

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

参考文献:

我安装了 wsl 和 Ubuntu 20.04。

经过几天的故障排除,这是什么为我工作。

我想相信那些像我一样经历这个问题的人正在运行 wsl 版本2。

当我切换回 wsl 版本1时,这个问题就得到了解决,不需要进一步的配置。

要了解如何影响这个变化,请按照这个链接 更改 wsl 版本

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

之前针对这个问题提出的解决方案可行,但需要重新启动:

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 上

然而,解决这个问题的是第二个解决方案和讨论提出的 以上的混合体:

第一步:

而在 Powershell 的虚拟专用网络:

ipconfig /all

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

“思科任何连接...”

在那块搜索您的 DNS 服务器的地址(对我来说,第一个 DNS 服务器不工作,所以我采取了第二)

第二步: 摘自 PowerShell 中的 给你:

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

第三步:

而在我的 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

下次你遇到这个问题的时候,你只需要重复第二步:

$sudo restore_internet_connection.sh

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

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

我还必须编写一个 PowerShell 脚本,从 Windows 将实际的 DNS 服务器地址写入 WSL2文件夹。我不知道这是否是因为我的工作电脑是如何锁定的或什么,但我只能使用我的 Windows 机器使用的 DNS 服务器,和 WSL2总是拉自己的 IP 地址来填充 Resolv.conf 文件,其中没有 DNS 服务器。

如果还有其他人受到这个问题的困扰,我是这样解决的。将它保存为您想要的任何内容(在我的例子中,debian.ps1,从 Admin 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 下,那么您需要将其更改为它实际驻留的位置。我知道这并不好看,而且从许多不同的解决方案张贴在整个互联网上,但它是唯一的一个工程与我的公司管理的个人电脑和组的政策。希望这可以为某些人在公司管理的个人电脑上省去很多麻烦。请注意,如果你通过 VPN 连接,我不认为这将工作-我也没有在办公室测试冠状病毒,它运行在家庭 WiFi。如果您直接使用公司网络,可能需要进行一些调整。

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

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

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

wsl_adapter_settings

下面是手动提供 DNS 的主机适配器属性的映像。如果您为 主持人选择了自动 DNS 选项,那么在 ISP 提供的 DNS 上可能会出现一些问题。

host_adapter_settings

建议使用 OpenDNS、 GoogleDNS 或 CloudFlare DNS,因为这些都是相当快速和可靠的。使用 DNSBenchmark 为您的连接找到最快的一个。我想强调的是,这完全是你的选择。

对我来说,命名服务器不再可以 pingable 了,所以我做了下面的工作,它对我很有用。

  • 在窗口提示中输入“打开或关闭 Windows 特性”,打开应用程序enter image description here
  • 在 Windows 特性中禁用 Linux 子系统enter image description here
  • 禁用超级 v (所有子组件)enter image description here
  • 点击“确定”,然后重新启动
  • 在 Windows 特性中启用 Linux 子系统enter image description here
  • 启动超 Venter image description here
  • 点击“确定”,然后重新启动

不幸的是,我不能删除 Ubuntu,因为它包含了我的工作。我已经尝试了所有这个和其他堆栈溢出的职位,没有成功。

但是上面的方法对我很有效,而且没有任何工作损失。

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

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

如果你得到 不允许行动。改变它手动使用 sudo nano /etc/resolv.conf

  1. 为了防止 WSL2覆盖这个值,运行以下 命令:
# 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

对我有效的配方。(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