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

LPT*_*PT0 43 connection ubuntu windows-subsystem-for-linux failed-to-connect

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


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

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

Sam*_*Sam 68

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

netsh winsock reset 
netsh int ip reset all
netsh winhttp reset proxy
ipconfig /flushdns
Run Code Online (Sandbox Code Playgroud)

重新启动您的机器。

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

  • 重新启动后可以工作,但如果网络重新连接(或者断开并重新连接 VPN),问题就会再次出现。 (4认同)
  • 第 5 步是重新启动 wsl 还是整个计算机? (4认同)
  • 我尝试了上面提到的命令,但没有解决我的问题 (4认同)
  • @Alex 我需要完全重启。 (2认同)

lef*_*oin 63

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

  1. 连接 VPN 并获取 DNS 服务器列表,我们稍后会需要它(在提升的 PowerShell 中执行)
Get-DnsClientServerAddress -AddressFamily IPv4 | Select-Object -ExpandProperty ServerAddresses
Run Code Online (Sandbox Code Playgroud)
  1. 获取搜索域(在PowerShell中执行)
Get-DnsClientGlobalSetting | Select-Object -ExpandProperty SuffixSearchList
Run Code Online (Sandbox Code Playgroud)
  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 
Run Code Online (Sandbox Code Playgroud)
  1. 在 powershell 内将 Cisco Anyconnect 指标从默认值 1 更改为 6000
Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 6000
Run Code Online (Sandbox Code Playgroud)

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

  1. 在同一提升的 powershell 上重新启动 wsl2,然后您可以打开 wsl2 并且它应该连接到互联网。
Restart-Service LxssManager
Run Code Online (Sandbox Code Playgroud)

取自此处:https ://jamespotz.github.io/blog/how-to-fix-wsl2-and-cisco-vpn

  • 这是唯一对我有用的事情。尤其是第4步似乎是必要的,我想知道它是做什么的。谢谢。 (3认同)
  • 这非常有用,它帮助我修复了 WSL 对互联网的访问,即使我没有设置 VPN(不再) (2认同)

Jef*_*elo 36

发生此错误的原因是 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
Run Code Online (Sandbox Code Playgroud)
  1. 将名称服务器值更改为8.8.8.8并保存文件。您现在应该可以连接到 Internet。

  • 这是一个很好的答案,我唯一要添加的是您必须编辑 /etc/wsl.conf 并添加下一个文本以使更改持久 [network]generateResolvConf = False (17认同)
  • 以下是防止 WSL 2 每次都覆盖它的步骤。https://github.com/microsoft/WSL/issues/5420#issuecomment-646479747 (12认同)
  • 这对我来说是唯一正确的解决方案。只需将其与主操作系统上的 dns ip 配置相匹配即可。 (8认同)
  • 不知道为什么这会成为趋势,但这对我不起作用,而且问题发布者提到他已经检查了 dns,这不是问题的原因。[这个答案](/sf/answers/4450487121/)是正确的 (8认同)
  • 这对我有用,我还必须在管理命令提示符中运行“wsl --shutdown”,然后再次启动 Ubuntu 才能正常工作。 (6认同)

Ech*_*o9k 28

如果您修复了该问题并更改了 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'
Run Code Online (Sandbox Code Playgroud)

如果您收到“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
Run Code Online (Sandbox Code Playgroud)

  • 首先,创建 `/etc/wsl.conf`,然后重新启动 WSL `WSL --shutdown` - WSL 将在此操作后删除 `resolve.conf`,然后创建一个新的resolve.conf。不需要“chattr”。 (5认同)

小智 18

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

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

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

但上述方法对我有用,并且没有任何工作损失。


小智 16

复制对我有用的食谱。
在 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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 按 Windows 键,
    键入Network Reset,按
    Enter。

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

    网络重置魔法 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突然完美运行。


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

  • 我遵循了这一点,最终把我的 WiFi 变砖了。 (2认同)
  • 最终我需要将服务中的 WLAN 自动配置重新设置为“自动”启动类型。不确定有多少人会遇到同样的问题,但如果你遇到了,请尝试一下。 (2认同)

CVn*_*ame 16

就我而言,如果不使用 VPN,我的 WSL 上的互联网就可以工作。当我连接到 VPN 时,它突然停止工作。这里有一个关于使用 VPN 时 WSL 上的互联网丢失的相关讨论(在我发帖当天仍然开放)。

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

netsh winsock reset 
netsh int ip reset all
netsh winhttp reset proxy
ipconfig /flushdns
Run Code Online (Sandbox Code Playgroud)

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

sudo nano /etc/resolv.conf
Run Code Online (Sandbox Code Playgroud)

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

解决这个问题的方法是第二种解决方案和上面讨论的混合:

步骤1:

在 Powershell 中使用 VPN 时

ipconfig /all
Run Code Online (Sandbox Code Playgroud)

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

“思科 Anyconnect ...”

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

步骤 2:取自此处的相同讨论,在 PowerShell 中:

Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 6000
Run Code Online (Sandbox Code Playgroud)

步骤3:

在我的 WSL 上使用 VPN 时:

$ sudo echo "nameserver <the DNS server address from point 1>" > /etc/resolv.conf
Run Code Online (Sandbox Code Playgroud)

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

$touch restore_internet_connection.sh
$nano restore_internet_connection.sh
Run Code Online (Sandbox Code Playgroud)

将以下文本放入其中:

echo "nameserver <the output from point 1>" > /etc/resolv.conf
Run Code Online (Sandbox Code Playgroud)

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

$sudo restore_internet_connection.sh
Run Code Online (Sandbox Code Playgroud)


aim*_*mme 6

对我来说,当我从一个网络切换到另一个网络时会出现这个问题。比方说,例如我在办公室 wifi 工作,然后我回家并开始使用家庭 wifi。上面的/sf/answers/4450487121/答案对我有用。这似乎是一个实际问题,因此在 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 
Run Code Online (Sandbox Code Playgroud)

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

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

  • 有趣......你在脚本中列出了两次“netsh Winsock Reset”。这是故意的吗?我们应该在开始和结束时运行它吗? (2认同)

MSM*_*MSM 6

所以我不知道这是否对任何人有帮助,但我在 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
docker-桌面-数据 跑步 2
docker-桌面 跑步 2

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

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

结果

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

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


Adi*_*agh 6

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

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

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

wsl_适配器_设置

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

主机适配器设置

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