Windows10 WSL2 Ubuntu / Debian # 无网络

Posted

技术标签:

【中文标题】Windows10 WSL2 Ubuntu / Debian # 无网络【英文标题】:Windows10 WSL2 Ubuntu / Debian # no network 【发布时间】:2020-06-01 19:07:40 【问题描述】:

从 WSL 升级到 WSL2 之后

sudo apt-get update

不再有效。之后:

wsl --set-version Ubuntu-18.04 2

输出是:

> sudo apt-get update
Err:1 http://security.ubuntu.com/ubuntu bionic-security InRelease
  Temporary failure resolving 'security.ubuntu.com'
Err:2 http://archive.ubuntu.com/ubuntu bionic InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu bionic-updates InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:4 http://archive.ubuntu.com/ubuntu bionic-backports InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Reading package lists... Done
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/bionic/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/bionic-updates/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/bionic-backports/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/bionic-security/InRelease  Temporary failure resolving 'security.ubuntu.com'
W: Some index files failed to download. They have been ignored, or old ones used instead.

返回 WSL1 后,问题再次消失。在 Debian 上也是如此,在 CentOS 上也是如此。所以 WSL2 肯定有一个错误。

Windows10 build 版本为 19041,今天安装。

WSL2 有什么解决方法吗? 问候

【问题讨论】:

删除/etc/resolv.conf 文件。关闭 WSL2 虚拟机。重新启动 WSL。检查您是否可以 ping 远程 IP 和网站。否则检查任何网络防火墙。 thx,/etc/resolv.conf 是正确的文件,但如果它被删除,它会在下一次 wsl 启动时重新生成 github.com/microsoft/WSL/issues/5256 【参考方案1】:

生成的文件/etc/resolv.conf是:

域名服务器 172.24.0.1

..必须将其更改为

域名服务器 8.8.8.8

解决问题

【讨论】:

谢谢。它是如此简单,但它就像一个魅力一样帮助) 如果您使用的是 ***,您可能希望避免使用答案提到的 Google 的 DNS 服务器。例如,Mullvad *** suggests 使用 10.8.0.1。 这应该是公认的答案。就像一个魅力,谢谢! 唯一的事情是,你必须在每次 wsl2 启动时重复它;) 如果你想永久使用外部DNS服务器,添加[network] generateResolvConf = false到/etc/wsl.conf :)【参考方案2】:

原答案:

在我的情况下,我在 Windows 中使用 ***,当断开与​​ *** 的连接时,问题得到了解决。

编辑:

然而,这正在成为一个更广泛的问题,它再次发生在我身上,我通过删除 Hyper-V 虚拟交换机扩展适配器解决了它。

目前针对此问题最广泛使用的两种解决方案是:

1 防止 /etc/resolfv.conf 被“损坏”

    创建文件:/etc/wsl.conf。 将以下行放入文件中
[network]
generateResolvConf = false
    cmd 窗口中,运行wsl --shutdown 重启 WSL2 创建文件:/etc/resolv.conf。如果存在,请将现有文件替换为这个新文件。 将以下行放入文件中
nameserver 8.8.8.8
    重复第 3 步和第 4 步。您会看到 git 现在可以正常工作了。

感谢NonStatic 在github 上分享它

2 删除损坏的网络接口驱动程序(可能是永久性的)

    首先进入设备管理器

    显示隐藏的设备

    删除所有 Hyper-V 虚拟交换机扩展适配器

感谢Jaysonsantos 在GitHub 上分享它

【讨论】:

请注意,如果您使用 ***,8.8.8.8 可能会被阻止。在这种情况下,您需要发现网络的 DNS 服务器并将它们作为 nameserver 条目放入 /etc/resolve.conf 文件中。这些可以在 Windows 中查看netsh interface ip show dnsservers @Jon,+1,这对我有用。 这个工作完美。谢谢。【参考方案3】:

我遇到了同样的问题。

cat /etc/resolv.conf,看看输出有没有这样的:

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.X.X.X

您需要将名称服务器更改为8.8.8.8,因此运行sudo nano /etc/resolv.conf,编辑并保存文件。

但是,这或多或少是一种临时解决方案,因为每次 WSL 启动时您都需要这样做。 您可能想运行一个脚本来检查名称服务器,并在每次重新启动 wsl 时将其更新为 8.8.8.8。 此更改适用于我的 WSL2-Debian。但我不需要重新启动 WSL。

【讨论】:

【参考方案4】:

很可能,Distribution 有自己的虚拟适配器,首先您可以尝试一些步骤:

    需要检查数据包是否真的通过了 Windows 防火墙 然后查看%systemroot%\system32\LogFiles\Firewall\pfirewall.log

    如果数据包没有通过防火墙,很可能分发包拥有自己的虚拟适配器,请检查哪些 IP 从 Debian 内部获取分发包:

    ifconfig

或者如果你没有ifconfig:

perl -MSocket -le 'socket(S, PF_INET, SOCK_DGRAM, getprotobyname("udp"));
connect(S, sockaddr_in(1, inet_aton("8.8.8.8")));
print inet_ntoa((sockaddr_in(getsockname(S)))[1]);'

ipconfig 在 Windows WSL2 主机上,查看 WSL 适配器下机器使用的 IP

    如果您需要通过 Windows IP 访问 Internet,请检查此问题:https://github.com/microsoft/WSL/issues/4150

解决方法是使用以下脚本:

一个。获取 WSL 2 机器的 IP 地址

b.移除之前的端口转发规则

c。添加端口转发规则

d。删除之前添加的防火墙规则

e。添加新的防火墙规则

$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\d1,3\.\d1,3\.\d1,3\.\d1,3';

if( $found )
  $remoteport = $matches[0];
 else
  echo "The Script Exited, the ip address of WSL 2 cannot be found";
  exit;


#[Ports]

#All the ports you want to forward separated by coma
$ports=@(80,443,10000,3000,5000);


#[Static ip]
#You can change the addr to your ip config to listen to a specific address
$addr='0.0.0.0';
$ports_a = $ports -join ",";


#Remove Firewall Exception Rules
iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";

#adding Exception Rules for inbound and outbound Rules
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";

for( $i = 0; $i -lt $ports.length; $i++ )
  $port = $ports[$i];
  iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
  iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectpor t=$port connectaddress=$remoteport";
  

另一种解决方案是转到 Hyper-V 管理器并更改绑定到物理 NIC 的虚拟交换机

【讨论】:

thx,自定义防火墙设置似乎是一个可行的解决方案,但不幸的是访问受到管理员的限制。 WSL2 无需启用 hyper-v 即可使用,因此替代解决方案不适用于我的情况。 无论如何,ms 应该找到一个开箱即用的解决方案:) 您好,关于脚本,是否需要将其存储到 .sh 扩展名中。例如,wsl.sh? 投票第二多的答案对我不起作用。但是,您参考答案的问题与我的问题有关。似乎很多开发人员都遇到了同样的问题,而且问题仍然存在。我在 WSL 上打开一个问题。你可能知道这个问题,如果你有时间可以帮助我。 github.com/microsoft/WSL/issues/6660 我回到 WSL 1。但我在这里发现了一个非常有帮助的问题,他们现在正在努力解决这个问题,github.com/microsoft/WSL/issues/5256【参考方案5】:

对我来说,在安装 apache 并使用此命令允许 apache 配置文件之后,我有一个全新的 Ubuntu 20.04 WSL 实例

sudo ufw allow in "Apache"

那么,

sudo service ufw start && sudo ufw enable

我注意到此问题已触发,并且在再次使用禁用防火墙后

sudo ufw disable && sudo service ufw stop

一切正常。

【讨论】:

感谢以上所有解决方案,这个解决方案完美无缺,现在我可以再次 sudo apt update 了。再次感谢....【参考方案6】:

它对我有用,我正在使用 CiscoAnyConnect for ***

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

Get-NetIPInterface -InterfaceAlias "vEthernet (WSL)" | Set-NetIPInterface -InterfaceMetric 1

致谢:Cisco AnyConnect

【讨论】:

感谢您提及这一点。我只是禁用了 ***,它 apt-get 完美运行。【参考方案7】:

检查您使用的防病毒软件。我启用了 McAfee 和端点安全。如果断开端点安全防火墙连接将立即工作(无需重新启动)。

https://kc.mcafee.com/corporate/index?page=content&id=KB91411

【讨论】:

【参考方案8】:

在 cmd 上运行这些命令:

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

【讨论】:

【参考方案9】:

当我在磁盘 C: 上应用 Windows NTFS 驱动器压缩时,我遇到了同样的错误。进一步调查表明,仅压缩两个文件夹会导致该错误:

    WSL 文件夹 (%LocalAppData%\Packages\CanonicalGroupLimited*) %TEMP%(即C:\Users\<Username>\AppData\Local\Temp

因此,如果您在 WSL 上遇到sudo apt-get updateTemporary failure resolving... 错误,我建议您根本不要对系统驱动器应用 NTFS 磁盘压缩,或者至少保持这两个目录未压缩。

也不要忘记在使用wsl --shutdown解压缩后在 CMD 或 PowerShell 终端中重新启动 WSL

【讨论】:

【参考方案10】:

我解决了将/etc/resolv.conf 更改为:

nameserver 8.8.8.8

然后

$ sudo chattr -f +i /etc/resolv.conf

实际上用+i==immutable 属性“锁定”了文件,因此操作系统无法重新生成。 这样用户修改的/etc/resolv.conf 将保持不变。

我发现创建 /etc/wsl.conf 不起作用,但还是留下了它:

[network]
generateResolvConf = false

【讨论】:

这工作了一次。但是当我重新启动 Ubuntu 应用程序并尝试 sudo apt-get update 它给了我同样的错误。 这就是为什么你必须用chattr“锁定”文件,如上所述。【参考方案11】:

Maybe it was a coincidence,但通过在 Powershell 中以管理员身份运行 Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All 并重新启动出现来激活 Hyper-V,以便在没有其他方法的情况下为我解决问题。除了涉及 Hyper-V 管理器的解决方案外,我尝试了大多数解决方案。我正在激活 Hyper-V 来尝试那个,但最终我不需要做任何其他事情。

如果巧合,则可能是archive.ubuntu.com 服务器暂时不可用。我从未失去 ping 其他地址的能力这一事实支持了这一点。评论on this AskUbuntu question 指出:

有时您会发现服务器不可用或已关闭。 . .通常问题会在一段时间后自行解决。

换句话说,有时这个问题是服务器端的。我认为这里没有人提到过这种可能性。

【讨论】:

以上是关于Windows10 WSL2 Ubuntu / Debian # 无网络的主要内容,如果未能解决你的问题,请参考以下文章

Windows10安装WSL2和Ubuntu的过程

Windows 10专业版安装 WSL2 (Ubuntu 20.04)

Windows 10专业版安装 WSL2 (Ubuntu 20.04)

Windows10/Windows11 子系统(WSL2)安装Ubuntu20.04

Windows学习总结(23)——在 Windows 10 子系统 ubuntu 上利用 WSL2 安装 docker 的 2 种方式

Windows学习总结(23)——在 Windows 10 子系统 ubuntu 上利用 WSL2 安装 docker 的 2 种方式