it-swarm.cn

说服apt-get * not *使用IPv6方法

我工作的ISP正在建立内部IPv6网络,以准备最终连接到IPv6 Internet。结果,此网络中的多个服务器现在在运行apt-get update时默认尝试通过其IPv6地址连接到security.debian.org,这导致我每次都要等待较长的超时时间下载任何形式的更新。

有没有办法告诉他们更喜欢IPv4还是完全忽略IPv6?

245
Shadur

-o Acquire::ForceIPv4=true时运行apt-get

如果要使设置持久化,只需创建/ etc/apt/apt.conf.d/99force-ipv4并放在Acquire::ForceIPv4 "true"; 在里面:

echo 'Acquire::ForceIPv4 "true";' | Sudo tee /etc/apt/apt.conf.d/99force-ipv4

配置选项Acquire::ForceIPv4Acquire::ForceIPv6已添加到版本0.9.7.9〜exp1(请参阅 bug 611891 ),自Ubuntu Saucy(自2013年10月)和Debian Jessie(2015年4月发行)。

324
mmoya

就像 吉尔斯说的 ,请使用gai.conf。笔记:

  1. 这在比APT更低的层次上(DNS和IP网络)起作用,因此它将改变所有应用网络的方式-至少,所有这些使用getaddrinfo
  2. 在编辑gai.conf之前,您应该备份它并阅读它(不用担心,这很简短)。您当前的文件中可能已经提到了下面的编辑;如果当前文件指示的内容与下面提到的内容有所不同,则您可能应该选择当前文件中的内容。

但是,如果这是您想要的(可能是),那就继续吧。假设我们有两个主机www.he.netwww.ripe.net

$ Host www.he.net
www.he.net is an alias for he.net.
he.net has address 216.218.186.2
he.net has IPv6 address 2001:470:0:76::2

$ Host www.ripe.net
www.ripe.net has address 193.0.6.139
www.ripe.net has IPv6 address 2001:67c:2e8:22::c100:68b

情况1:所有主机都首选IPV4

/etc/gai.conf后面添加以下行:

precedence ::ffff:0:0/96  100

保存已编辑的文件(无需重新启动)后,您应该会看到使用IPV4的联网应用(例如telnet):

$ telnet www.ripe.net 81
Trying 193.0.6.139...
^C
$ telnet www.he.net 81
Trying 216.218.186.2...

情况2:对于特定主机更喜欢IPV6

如果我们只希望对www.he.net或其网络使用IPV6,则可以为全部或部分IPV6地址附加 掩码/前缀/etc/gai.conf。例如,以下行:

precedence 2001:470::/32 100

(保存编辑的文件后)产生

$ telnet www.ripe.net 81
Trying 193.0.6.139...
^C
$ telnet www.he.net 81
Trying 2001:470:0:76::2...
^C

情况3:特定主机首选IPV4

如果我们颠倒了面具,反面会成立吗?根据@GrueMaster,附加

precedence 2001:470::/96 100

在为security.ubuntu.com禁用IPV6后为他工作(否则它将永远停止)。


也可以看看:

84
Lmwangi

您可以在备用计算机上设置apt-cacher-ng以充当所有主机的代理/缓存。您可以强制配置仅使用特定主机,或在该计算机上使用@badp建议的/ etc/hosts技巧。

apt-get install apt-cacher-ng

设置apt-cache-ng后,只需在/ etc/apt/apt.conf.d/90httpproxy中删除以下行(更改IP地址/主机名以指向您的缓存机) =

Acquire::http { Proxy "http://[192.168.1.254]:3142"; };

我使用该设置来减少带宽使用,但是它可以解决您的问题。不幸的是,我不知道一种直接禁用apt-get本身的ipv6查找的方法。

10
Richm

您可以通过设置丢弃ip6响应的DNS代理服务器来解决此问题。

5
pjc50

如何在/etc/hosts中添加一行以覆盖相关地址?例如。,

130.89.149.226  ftp.debian.org      
195.20.242.89   security.debian.org 
4
badp

劫持旧话题,但最近也面临同样的问题。因此,基于上面给出的建议以及Hostwhois的输出:

# Host security.debian.org
security.debian.org has address 212.211.132.250
security.debian.org has address 195.20.242.89
security.debian.org has address 212.211.132.32
security.debian.org has IPv6 address 2001:8d8:580:400:6564:a62:0:2
security.debian.org has IPv6 address 2001:a78:5:0:216:35ff:fe7f:be4f
security.debian.org has IPv6 address 2001:a78:5:1:216:35ff:fe7f:6ceb

以稍微不同的方式解决了问题-降低了包含security.debian.org的IPv6网络的优先级/etc/gai.conf

# Make IPv6 for security.debian.org undesirable
precedence 2001:8d8:580::/48    5
precedence 2001:a78:5::/48      5

因此,除了security.debian.org之外,IPv6仍然是首选。

1
Timur Bakeyev

截至2014年10月8日,我遇到了同样的问题,试图在本地网络上的代理后面更新debian。希望对其他人有帮助,我在这里发表回应。正如其他人提到的那样,编辑_/etc/hosts_是应该注意的事情。

但是我个人只是想完成更新。

更新时/etc/apt/sources.list的内容(更新之前有所不同..):

_deb http://http.debian.net/debian/ testing main
deb-src http://http.debian.net/debian/ testing main

deb http://mirrors.kernel.org/debian/ wheezy main
deb-src http://mirrors.kernel.org/debian/ wheezy main

deb http://security.debian.org/ wheezy/updates main
deb-src http://security.debian.org/ wheezy/updates main
_

/etc/apt/apt.conf的内容:

_Acquire::http::proxy "http://192.168.1.10:7777/";
Acquire::http::Timeout "10";
Acquire::ftp::Timeout "10";
_

除了/ etc/hosts:

_#Workaround for making apt-get work (08-10-2014)
195.20.242.89 security.debian.org
130.89.148.12 ftp.debian.org
_

现在,以root身份运行_apt-get update ; apt-get upgrade_效果很好。

如其他答案中所述,请在域上使用“运行Host”命令来获取要插入到hosts文件中的正确IP。

例:

_$ Host ftp.debian.org
ftp.debian.org has address 130.89.148.12
_

这样就成功地将系统更新为Debian GNU/Linux testing (jessie)。您可能不想使用测试存储库,而只是从源中删除它。测试存储库为您提供了多个软件包的最新更新,但不稳定。

1
NordicViking

我发现了一种更好的方法。打开您的sources.list文件,记下存储库的主机名。获取其IPv4地址,然后编辑sources.list加上IPv4地址而不是主机名。现在,Apt-get应该绕过IPv6,通过您指定的IPv4地址与存储库联系。

存在一个缺点,就是回购协议通常会设置某种负载平衡和/或IP地理位置,而这种方法当然会绕开。但是,只有几个人在执行此操作并不重要。如果您确实发现一个镜像很慢,请尝试获取另一个回购IP地址(例如,通过使用联机ping服务),然后使用该IP地址。

0
D. Strout