Windows10 WSL2 Ubuntu / Debian # 没有网络

Windows10 WSL2 Ubuntu / Debian # no network

从 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 构建版本为 19041,今天安装。

WSL2 有解决办法吗? 问候

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

nameserver 172.24.0.1

..必须将其更改为

nameserver 8.8.8.8

解决了问题

最有可能的是,发行版获得了自己的虚拟适配器,首先您可以尝试一些步骤:

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

  2. 如果数据包没有通过防火墙,很可能是分发版获得了它自己的虚拟适配器,检查从 Debian 内部分发的 IP 是什么:

    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]);'
在 Windows WSL2 主机上

ipconfig 并查看 WSL 适配器下机器的 IP 地址

  1. 如果您需要通过 Windows IP 访问互联网,请检查此问题: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 '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,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 的虚拟交换机

原答案:

就我而言,我在 Windows 中使用 VPN,当断开与​​ VPN 的连接时,问题已解决。

编辑:

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

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

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

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

Credits to NonStatic who shared it on github

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

  1. 首先进入设备管理器

  2. 显示隐藏的设备

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

Credits to Jaysonsantos who shared it on GitHub

我遇到了同样的问题。

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。

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

sudo ufw allow in "Apache"

然后,

sudo service ufw start && sudo ufw enable

我注意到这个问题已经触发,并且在使用

再次禁用防火墙后
sudo ufw disable && sudo service ufw stop

一切正常。

它对我有用,我正在使用 CiscoAnyConnect 进行 VPN

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

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

学分:Cisco AnyConnect

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

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

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

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

Sometimes you find the servers unavailable or being down . . . Usually the problem solves itself after a while.

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

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

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

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

另外不要忘记在使用 wsl --shutdown

解压缩后在 CMD 或 PowerShell 终端中重启 WSL

运行 cmd 上的这些命令:

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

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

的问题
nameserver 8.8.8.8

然后

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

实际上 'locks' 具有 +i==immutable 属性的文件因此无法由 OS 重新生成。 这样用户修改的 /etc/resolv.conf 将被持久化。

我发现创建 /etc/wsl.conf 没有用,但还是保留了它:

[network]
generateResolvConf = false