WSL Ubuntu 上没有互联网连接(Windows Linux 的子系统)

No internet connection on WSL Ubuntu (Windows Subsystem for Linux)

最近我在我的 Windows 机器上安装了 WSL Ubuntu 18.04,但似乎没有什么能正常工作,因为我没有 no互联网接入.
我尝试了一些命令,sudo apt update 说 'Connection failed' 和 ping google.com 字面意义上的永远,正如您在这个屏幕截图中看到的那样:


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

那么您知道这里可能存在什么问题吗?

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

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

重启你的机器。

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

对我来说,当我从一个网络切换到另一个网络时,就会出现这个问题。比方说,我在办公室 wifi 工作,然后我回到家开始使用家庭 wifi。以上 答案对我有用。这似乎是一个实际问题,所以在 Windows 提出解决方案之前,我每次都必须找到一种更简单的方法来完成它。我复制了命令并创建了一个 bat 文件,并将其保存在桌面上。所以,每次我切换 wifi connection/network 我 运行 以管理员身份打开 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 工作。

我在带有 debian 10 的 WSL2 上安装了 ufw,删除它并重新启动后 Windows 它起作用了。

复制对我有用的食谱。
在 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
    回车。

    你应该看到这个 window。
    点击“立即重置”。


  3. 重启Windows

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


奇怪的边缘情况

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

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

不过curl --location whosebug.com -i
导致成功响应。

并且 sudo apt-get update && sudo apt-get upgrade 现在可以使用了。


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

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

花了一个小时配置我的 WSL 的 /etc/resolv.conf 和 /etc/wsl.conf 并解决 auto-config 错误 (https://github.com/microsoft/WSL/issues/3928)。还是不行。

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

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


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

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

停止服务

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

-> sudo systemctl restart NetworkManager

上面的方法无效。 但是切换到 WSL 1 成功了!

所以在 PowerShell 中以管理员身份:

wsl --set-default-version 1

然后重新安装 Ubuntu

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

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

这是 Win10 V1909(OS 内部版本 18363.1379)。我已经尝试了这篇文章和其他 Whosebug 文章中的所有内容,但没有成功。

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

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

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

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

在包括该主题在内的各种论坛和指南中进行了大量探索之后,以下是最终对我有用的方法:

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

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

NAME STATE VERSION
Ubuntu-20.04 Running 1
docker-desktop-data Running 2
docker-desktop Running 2

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

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

结果

  1. 此时我在 WSL 中有一个完全可用的 Ubuntu 发行版,可以完全访问互联网并且 none 无法访问更新档案等烦恼。但是,没有Ubuntu 发行版和我的 Docker 桌面之间的连接。
  2. 为了解决最后一块拼图 - 我使用了 this link 上提供的指导。直接按照那里的说明进行操作 - 在这里重现太长了。

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

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

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

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

终于找到解决方法了

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

对我来说,发行版在那之后仍然是版本 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

You will see the following in the file:

# 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 并保存文件。您现在应该可以连接到互联网了。

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

%TEMP%\swap.vhdx

(即,normally {2,3,4}:C:\Users\%USERNAME%\AppData\Local\Temp\swap.vhdx

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

参考文献:

我安装了 wsl 和 Ubuntu 20.04.

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

我想相信和我一样遇到这个问题的人是运行 wsl version 2.

我一切换回 wsl 版本 1 就解决了这个问题,无需进一步配置。

要查看如何影响此更改,请关注此 link Change wsl version

在我的情况下,如果不在 VPN 上,我的 WSL 上的互联网可以正常工作。当我连接到 VPN 时,它突然停止工作。 在 VPN here.

上有一个关于 WSL 网络丢失的相关讨论(在我发布的那天仍然开放)

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

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 上

解决它的方法是将第二种解决方案和所提出的讨论结合起来 above:

第 1 步:

在 Powershell 中使用 VPN 时:

ipconfig /all

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

这样的东西

"CISCO Anyconnect ..."

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

第 2 步: 摘自同一讨论 here,在 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

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

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

我还必须编写一个 PowerShell 脚本,将实际 DNS 服务器地址从 Windows 写入 WSL2 文件夹。我不知道是不是因为我的工作 PC 被锁定的程度或其他原因,但我只能使用我的 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\ 下,您需要将其更改为实际所在的位置。我知道这不是很好,并且从互联网上发布的许多不同的解决方案中提取出来,但它是唯一适用于我的公司管理的 PC 和组策略的解决方案。希望这可以在公司管理的 PC 上为某人省去很多麻烦。请注意,如果您通过 VPN 连接,我认为这不会起作用——我也没有在办公室测试冠状病毒,它在家庭 WiFi 上 运行ning。如果您直接在公司网络上,可能需要进行一些调整。

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

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

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

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

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

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

  • 在 windows 提示中输入“打开或关闭 Windows 功能”,打开应用程序
  • 禁用 Windows 功能中的 Linux 子系统
  • 禁用 hyper-v(所有子组件)
  • 单击“确定”并按照以下步骤重新启动
  • 在 Windows 功能中启用 Linux 子系统
  • 启用 hyper-v
  • 单击“确定”并按照以下步骤重新启动

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

但是上面的方法对我有用而且没有任何损失。

如果您修复了更改 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. 为防止 WSL 2 覆盖此值 运行 以下 commands:
# 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