WSL Ubuntu(Windows子系统Linux)无法连接互联网

226

最近我在Windows机器上安装了WSL Ubuntu 18.04,但似乎什么都不正常工作,因为我无法访问互联网
我尝试了一些命令,sudo apt update显示“连接失败”,ping google.com会花费很长时间,就像你在这个截图中看到的那样:


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

那么你有什么想法,这里可能出了什么问题吗?


15
这个问题能否被迁移到正确的网站,而不是在这里关闭? - leftjoin
2
"sudo nano /etc/resolv.conf" 添加 1.1.1.1,然后 ping Google。 - scott
3
TL;DR (以下也有不完整的信息): sudo nano /etc/resolv.conf,在现有条目前加上#,在新行上添加nameserver 8.8.8.8,保存(Ctrl+X; Y; Enter),ping google.com以确保它起作用,然后为了确保它不会被覆盖:sudo nano /etc/wsl.conf,在新行上添加[network],然后在下一行上添加generateResolvConf = false,保存,完成。 - Andrew
21个回答

462
这个错误发生的原因是因为Windows自动生成了一个带有错误nameserver的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

将名称服务器的值更改为8.8.8.8并保存文件。现在您应该能够连接到互联网。
如果您现在能够连接到互联网,那么在打开未来的终端时,您可能还需要阻止WSL重置此文件。您可以通过运行以下命令来实现:
sudo rm /etc/resolv.conf sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf' sudo bash -c 'echo "[network]" > /etc/wsl.conf' sudo bash -c 'echo "generateResolvConf = false" >> /etc/wsl.conf' sudo chattr +i /etc/resolv.conf
(特别感谢@kanekotic和@Echo9k的评论提供了最后一步的解决方案。)

8
这是我唯一正确的解决方案。只需将其与主操作系统上的DNS IP配置匹配即可。 - Meigyoku Thmn
17
这是一个很好的答案,唯一需要补充的是您需要编辑/etc/wsl.conf文件并添加以下文本以使更改永久化: [network] generateResolvConf = False - Kanekotic
12
以下是防止WSL 2每次覆盖它的步骤:https://github.com/microsoft/WSL/issues/5420#issuecomment-646479747 - Echo9k
5
这对我有用,我还必须在管理员命令提示符中运行wsl --shutdown,然后再次启动Ubuntu才能使其正常工作。 - KillerKode
7
不确定为什么这个正在流行,但这对我没有用,而且问题的发布者提到他已经检查了 DNS,它不是问题的原因。 这个答案 是正确的。 - Erfan Azary
显示剩余6条评论

238

1
是的,它正在工作。我曾经遇到过同样的问题,这帮助了我很多,解决了问题。 - Yash Chitroda
7
重启后可以正常运行,但是如果网络重新连接或者断开并重新连接 VPN,问题就会再次出现。 - Kiran
4
第五步是重新启动 WSL 还是整个计算机? - Alex
9
我尝试了上述提到的命令,但对我来说没有解决问题。 - Slim
1
@Alex 我需要完全重启。 - tejasvi88
显示剩余12条评论

62

这是我使用的成功配方(WSL2 + Cisco 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都需要执行此操作。请参考这里,了解如何自动化此任务。

  1. 在同一个以管理员身份运行的 PowerShell 中重启 wsl2,然后您就可以打开 wsl2 并连接到互联网。
Restart-Service LxssManager

参考链接:https://jamespotz.github.io/blog/how-to-fix-wsl2-and-cisco-vpn


3
这是唯一对我有效的方法。尤其是第四步似乎很必要,我想知道它是做什么用的。谢谢。 - Archimondain
1
真是救命稻草,我终于在我的工作笔记本电脑上让它正常工作了。 - Daniel
1
这是唯一一个对我有用的提示,即使没有使用思科VPN。所以我跳过了第四步。似乎需要添加公司和外部ns才能使其正常工作。 - macbert
2
这非常有用,它帮助我修复了WSL对互联网的访问权限,即使我不再设置VPN。 - unJordi

40

复制对我有效的配方。
在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
  • 按下Windows键,
    输入Network Reset
    按回车键。

    您应该会看到这个窗口。
    点击"现在重置"。

    Network Reset magic WSL fix

  • 重新启动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,正在尝试从Debian发行版的终端sudo apt update时,发现我的互联网无法工作。

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

    然后我找到了这个页面。尝试了发布的指示,但还是没用。

    最后找到了这篇文章发布的解决方案,WSL 2突然就正常工作了。


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


    1
    我可以确认我的Linux子系统已连接到互联网,但DNS出现了问题。您提供的更改/etc/resolve的解决方案对我很有帮助。这个WLS2位于第三方防火墙后面。 - CesareoAguirre
    2
    我按照这个方法操作,结果我的WiFi变成了砖头。 - WillB3
    1
    @WillB3:哎呀。非常抱歉听到这个消息。以防将来我(或其他人)遇到同样的问题,你能否详细说明一下?有多严重,发生在哪里? - Gamepad.Coder
    2
    最终发现我需要将 WLAN AutoConfig 在服务中的“启动类型”改回“自动”。不确定有多少人会遇到相同的问题,但如果你遇到了,可以试试这个方法。 - WillB3
    1
    你的回答让我进入了一个兔子洞,最终我找到了成功的解决方案。 对我有用的是:https://github.com/Microsoft/WSL/issues/1908#issuecomment-654349473 - biplobmanna
    显示剩余4条评论

    27

    如果您通过更改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'
    

    如果您遇到了Operation not permitted的问题。可以使用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
    

    5
    首先,创建 /etc/wsl.conf,然后重新启动 WSL WSL --shutdown - WSL 将在此操作后删除 resolve.conf,然后创建一个新的 resolve.conf。不需要使用 chattr - t7e

    19

    对我来说,当我从一个网络切换到另一个网络时,就会出现这个问题。比如说我在办公室用wifi工作,然后回家使用家庭wifi。上面的https://dev59.com/xFIG5IYBdhLWcg3w6mJ8#63578387答案对我很有用。看起来这是一个真正的问题,所以在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上的Internet将在连接的网络上运行。


    2
    有趣...你在脚本中列出了两次 netsh winsock reset。这是故意的吗?我们应该在开头和结尾都运行它吗? - TLS
    1
    你找到了任何永久的解决方案吗?我尝试了一切,但仍然没有用。 - Shamim Hossain

    16
    在我的情况下,如果没有使用VPN,我的WSL上的互联网是可以正常工作的。当我连接到VPN时,它突然停止工作。 关于在VPN上使用WSL时出现互联网丢失的问题,有一个相关的讨论(截至我发布这篇文章的当天仍在进行)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:

    在VPN上使用PowerShell:

    ipconfig /all
    

    搜索与您的VPN连接相关联的适配器。通常您可以在描述中找到类似以下内容的内容:

    "CISCO Anyconnect ..."

    在该块中搜索您的DNS服务器地址(对我来说第一个DNS服务器无法使用,因此我选择了第二个)

    步骤2:从这里获取,在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
    

    下次出现这个问题时,您只需重复第2步并:
    $sudo restore_internet_connection.sh
    

    1
    VPN必须仔细审查。 - 89n3ur0n
    1
    是的!VPN确实会引起问题。 在我的情况下,当VPN连接时我遇到了错误。一旦关闭VPN,它就可以正常工作了。 - abdadeel

    14

    我发现我的名称服务器无法ping通,所以我按照以下步骤进行操作,对我很有效:

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

    遗憾的是,由于我的工作在里面,我不能删除Ubuntu。我尝试了此及其他stackoverflow帖子中的所有方法,但都没有成功。

    但以上步骤对我很有效,而且没有导致任何工作丢失。


    这是唯一对我有效的方法! - kuldeep
    在这个问题上浪费了我一半的工作日后,这是解决它的方法。 - uhetz
    对我来说也是一样,这就是解决方案!谢谢。 - David Corral

    6
    所以我不知道这是否有助于任何人,但我在Windows上安装了Docker,并按照Docker建议的Microsoft说明安装了WSL2引擎。
    然后使用WSL2安装了Ubuntu 18.04 LTS,遇到了完全相同的问题 - 没有网络。我真正想做的只是在我的工作笔记本电脑上构建一些Docker镜像,因此没有互联网的WSL2对我来说完全行不通。
    经过在各种论坛和指南中探索(包括本主题),以下是最终为我工作的内容:
    • 我重新安装了带有WSL2的Docker • 我从Microsoft Store安装了Ubuntu 20.04 LTS,但使用命令提示符将WSL版本设置为1
    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发行版。但是,Ubuntu发行版与我的Docker桌面之间没有连接。
    2. 为解决最后一部分难题-我使用this link提供的指南。只需直接按照那里的说明操作-这太长了,无法在此处重现。

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


    6

    注意:此修复程序解决WSL中的DNS解析问题。不合理的设置可能会导致WSL分发根本没有任何互联网连接。

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

    正如在这个图像中所看到的,DNS值为空。 它是从主机机器的DNS推断出来的。

    wsl_adapter_settings

    下面是主机机器的适配器属性图像,其中手动提供了DNS。 如果您选择主机的自动DNS选项,则某些内容可能无法在由ISP提供的DNS上运行。

    host_adapter_settings

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


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接