apt-get update卡住了:正在连接到security.ubuntu.com

当我在我的机器上运行apt-get update时,它卡在这里:
100% [Connecting to security.ubuntu.com (2001:67c:1562::15)] [Connecting to archive.canonical.com (2001:67c:1360:8c01::16)]

我最近没有对系统进行任何更改,并且使用的是之前正常工作的家庭网络。

我无法解释为什么它切换到使用IPv6。
我已将无线网络的IPv6设置为忽略

enter image description here

ip addr的输出结果为:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
   valid_lft forever preferred_lft forever
inet6 ::1/128 scope host 
   valid_lft forever preferred_lft forever
2: mlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 4c:0b:be:22:0a:b4 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.106/24 brd 192.168.2.255 scope global dynamic mlan0
   valid_lft 1814086sec preferred_lft 1814086sec
inet6 ::d5:b551:28db:2789:225/64 scope global temporary dynamic 
   valid_lft 604483sec preferred_lft 85483sec
inet6 ::d5:4e0b:beff:fe22:ab4/64 scope global mngtmpaddr dynamic 
   valid_lft 604779sec preferred_lft 86379sec
inet6 fe80::4e0b:beff:fe22:ab4/64 scope link 
   valid_lft forever preferred_lft forever

将IP地址更改为IPv4,然后再试一次。 - heemayl
为什么你在使用IPv6?就像heemayl所说的,改用IPv4,在网络设置>[适配器]>高级中进行更改。 - TheWanderer
我不知道为什么它切换到IPv6。我添加了额外的信息。 - Pabi
可能是重复的问题,可以参考get apt-get stop using ipv6 - muru
1看起来你可能有一个主机发送路由广告,使用的前缀是0:0:0:d5::/64。这个范围被IETF列为保留,所以绝对不是一个有效的前缀来进行广告宣传。如果那些路由广告已经停止了,可能无法找出它们的来源。在这种情况下,你唯一能做的就是重新启动网络接口,问题就会消失。如果路由广告仍在发送,你可以查看数据包捕获来确定它们来自哪个MAC地址。 - kasperd
1除了IPv6连接配置错误之外,造成你问题的另一个原因是apt-get不支持RFC 6555。如果apt-get遵循RFC 6555,你就不会注意到任何问题。 - kasperd
1你的本地路由器出了一些问题,给你提供了无效的IPv6地址。请检查并修复路由器的配置。 - Michael Hampton
在这里找到的问题的最佳解决方案:http://askubuntu.com/questions/574569/apt-get-stuck-at-0-connecting-to-us-archive-ubuntu-com - MQ87
为了后代...思考着“我还没有使用IPV6的理由”,我删除了一个防火墙安全定义(openstack),以允许IPV6出口。糟糕。重新创建该规则(然后取消并重新启动更新)使得更新可以正常进行,而且本地配置文件没有任何更改。注意:在这个例子中,apt或v4/v6偏好没有问题。我怀疑随着时间的推移和v6的更多使用,我们会看到更多类似情况。 - TonyG
5个回答

这对我有用,感谢Zach Adams(https://zach-adams.com/2015/01/apt-get-cant-connect-to-security-ubuntu-fix/):

原来这是一个问题,在某些服务器上通过IPv6连接会导致它们在这一点上卡住。修复方法非常简单。

打开/etc/gai.conf

在这行下面

# For sites which prefer IPv4 connections change the last line to
取消注释以下行,删除#
# precedence ::ffff:0:0/96 100

This will allow you to still use IPv6 but sets IPv4 as the precedence so that apt-get won’t get stuck.


23谢谢!这个答案比仅仅盲目禁用IPv6要好得多。 - Cyrusmith
2如果你在这方面没有运气,可以试试这个:http://askubuntu.com/a/759540/4246 - Gauthier
2哇!那真是太有帮助了! - GaTechThomas
4注意:此信息仍然适用于14.04和16.04 LTS版本。 - Elder Geek
2在Linux Mint 18.1和18.2上适用。这应该是默认设置。 - mat
Ubuntu 17.04在这里,等了好几分钟才超时。谢谢! - ferdy
这在我的Ubuntu 16.04上有效。 - Pratik Singhal
不得不在Kubuntu 17.10中这样做... 这个默认设置可以改成上面的解决方案。 - Pafnucy
你的回复真是一份不断给予的礼物:谢谢 :) - paulsm4
哇,这将我的apt-get update时间从12分钟减少到不到一秒。令人印象深刻。 - luckydonald
1对我来说效果很好——别忘了注销然后重新登录以应用更改... - RBV
在Linux Mint 18.3上运行得非常好。您无需注销即可应用更改。 - Thomas Praxl
1太棒了!这在我使用的Ubuntu 20.04上有效。 - Renato Francia
在Ubuntu 18.04.4 LTS上对我有效!谢谢! - ZeZNiQ

网络的IPv6设置被忽略了,但是通过/etc/sysctl.conf禁用IPv6是有效的:
/etc/sysctl.conf的末尾添加以下行:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

运行sudo sysctl -p命令以重新加载/etc/sysctl.conf的设置。

7这不是你应该做的方式。这些行表示一旦连接到实际具有IPv6的网络,你将获得比预期更不可靠的连接。此外,这些行无法解决你问题的根本原因,而你甚至还没有确定出来。 - kasperd
2我不需要IPv6,所以这个工作很好。 - Pabi
这是一个常见的误解。事实是,在几个月内,非洲将成为世界上唯一一个没有耗尽IPv4地址的地区。 - kasperd
是的,对于非私有IP地址来说是可以的。但在像我家网络这样的小型网络中,我仍然会始终使用IPv4。 - Pabi
4这只是愚蠢的,因为与IPv4相比,对于连接同一网络段上的主机来说,IPv6链路本地地址有多个优势。 - kasperd
这可能是真的,但是这些优势中没有一个足够大,让我记得IPv6地址。 - Pabi
那是另一个谬论。唯一真正需要记住的IPv6地址是::1ff02::1。其他所有地址都通过DNS获取。 - kasperd
如果你设置了DNS,对于我的家用电脑、路由器和其他设备来说,就没有DNS。而且我认为99%的人在私有网络中使用IPx4。 - Pabi
如果你记不住设备的IP地址,你可以直接ping ff02::1,然后从响应列表中选择它。这比记住每个设备的IPv4地址还要简单。 - kasperd
2不能从我的手机上做那个 ;) 我们就同意各自有不同的看法吧。 - Pabi
4你想做什么就去做吧。我只是评论一下,确保其他可能遇到同样问题的人知道,在sysctl.conf中进行建议的更改最终会导致问题。 - kasperd

一个更好的方法是使用apt-get,而不是编辑gai.conf文件。
sudo apt-get -o Acquire::ForceIPv4=true update

如果你想让这个持久化,只需在你的bash文件中为'apt-get'添加一个别名即可。

但这样不会使得所有IPv4连接都变成IPv6吗? - metame
@metame 这就是重点。楼主说他的IPv6被禁用了,而且尝试使用它会导致问题。 - Francesco Dondi

其他解决方案对我的情况没有帮助...在我的情况下,我创建了一个使用AWS EC2实例Ubuntu 18.04。
Auto-assign Public IP -> no pick disable

尝试了所有建议的解决方案后,我放弃了并创建了一个新的EC2实例。
Auto-assign Public IP -> yes  Use subnet setting (Enable) 

一切都运行正常... apt-get update && apt-get upgrade 现在很顺利


对我来说,问题出在防火墙上。允许出站连接对我起了作用。 - Akhil

在WSL(Ubuntu)上,这可能是由于与WSL相关的某些防病毒规则导致的,这些规则阻止了对外部纯HTTP的访问。