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


239

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

有没有办法让他们倾向于偏爱IPv4或完全忽略IPv6?


3
那不应该因为路由故障而立即返回吗?
pjc50 2011年

7
不,它们的内部网络完全有可能在多个子网之间路由(主机具有IPv6默认网关),但没有与外界的IPv6连接。
Andrew Medico'Mar

5
可能有一种设置方法,/etc/gai.conf使security.debian.orgA记录在AAA记录之前返回,但我不知道确切要在该文件中放入什么。
Gilles

3
@AndrewMedico-但其网络的默认网关是否不应该知道没有外部ipV6连接,并很快拒绝边缘的出站尝试?我认为这里既有网络问题,也有提出的问题。
迈克尔·科恩

7
解决边缘路由器/防火墙/任何导致问题的方法是解决此问题的“最佳”方法。它应该返回一个ICMP目标不可达数据包。这要么没有发生,要么有什么阻止了它。无论哪种方式,都应将问题报告给您的网络人员。
迈克尔·汉普顿

Answers:


319

-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

Config选项Acquire::ForceIPv4Acquire::ForceIPv6已添加到0.9.7.9〜exp1版本(请参见bug 611891),该版本自Ubuntu Saucy(于2013年10月发布)和Debian Jessie(于2015年4月发布)之后可用。


7
将“已接受”移至该位置;虽然最初的30点答案是完全正确的,但它的适用范围更广,同时提供了限制apt-get 的选项。
Shadur

请正确描述您的答案。-o收购:: ForceIPv4 =真正的是除了命令允许用户使用IPv4
肯德里克

肯德里克(Kendrick)的建议之后,答案得到了更新
mmoya

1
从我的其余部分来看,apt.conf您需要这样写:(Acquire::ForceIPv4 "true";双引号)
mirabilos 2014年

6
@ZAB,因为如果您没有对该文件的写访问权,sudo echo 'test' > file将无法正常工作,因为重定向是通过用户权限执行的
LeartS

81

Gilles所说,使用gai.conf。笔记:

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

但是,如果这是您想要的(可能是),那就继续吧。假设我们有两个主持人,www.he.net并且www.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

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

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

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

如果我们只想为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

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


也可以看看:


如果上述链接消失了,也许总结一下内容?
Faheem Mitha

那么,针对特定名称或至少针对特定地址(范围)禁用IPv6的语法是什么?如果您将其添加到帖子中,这将是此处的最佳答案。
吉尔斯

谢谢。我#security.debian.org has IPv6 address 2610:148:1f10:3::73 \n #security.debian.org has IPv6 address 2001:4f8:8:36::6 \n precedence 2001:4f8::/96 100 \n precedence 2610:148::/96 100 在/etc/gai.conf中添加了2行,并且apt-get update现在可以正常工作了。
唐明亮

10

您可以在备用计算机上设置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查找的方法。


仍然不是一个完美的解决方案,但可能会达到最佳。谢谢。
Shadur 2011年

5

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


您的本地解析器是否仍会尝试获取AAAA记录?又超时了?
Mikel

4

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

130.89.149.226  ftp.debian.org      
195.20.242.89   security.debian.org 

13
如果事实证明绝对没有其他办法,我将把这个解决方案留到最后。我真的不喜欢/etc/hosts自己不拥有的IP地址混乱。
Shadur

@Shadur是的,我完全明白您的意思了:)
badp 2011年

注意:这些需要翻转,因此是IP,然后是主机名
Mike T

1

劫持旧话题,但最近也面临同样的问题。因此,基于上面给出的建议以及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

在稍微不同的方式解决的问题-降低其含有IPv6网络的优先级security.debian.org的/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

截至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

现在,apt-get update ; apt-get upgrade以root身份运行很好。

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

例:

$ host ftp.debian.org
ftp.debian.org has address 130.89.148.12

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


再次,修改所述hosts文件是一个高度次优的解决方案。
Shadur

0

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

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


2
实际上,由于您已经描述的原因,这是一个非常糟糕的解决方案。
Shadur

-4

如果适合您,可以尝试一下

user@ubuntuvm:~$ sudo bash
root@ubuntuvm:~# echo 1 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6 

->替换您的接口名称


这是与我提出的问题不同的解决方案。
沙杜尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.