为什么 yum 将 dl.google.com 解析为 IPv6 地址?

为什么 yum 将 dl.google.com 解析为 IPv6 地址?

我在 Fedora 18 上安装了 Google chrome 浏览器。现在,当我尝试使用 更新软件时yum upgrade,它报告以下错误,并且我无法更新 chrome。

http://dl.google.com/linux/chrome/rpm/stable/x86_64/repodata/repomd.xml: [Errno 14] curl#7 - "Failed to connect to 2404:6800:4005:c00::88: Network is unreachable"

看起来 dl.google.com 已解析为 IPv6 地址,但我不使用 IPv6,并按ping dl.google.com预期返回 IPv4 地址。

# ping dl.google.com
PING dl.l.google.com (74.125.128.93) 56(84) bytes of data.

可能的原因是什么?我该如何解决这个问题?

答案1

默认情况下,yum 将解析主机/域名的 IPv4 和 IPv6 地址,请参见下面的wireshark屏幕截图(我不懂python程序,因此网络流量捕获是找出yum如何解析主机名的唯一方法)。

yum 解析 IP 地址,捕获

要仅解析 IPv4 地址,只需添加ip_resolve=4ip_resolve=ipv4配置yum.conf(请参阅 参考资料man yum.conf以获取更多帮助)。对于 Fedora,使用 root 帐户从终端执行以下命令:

echo "ip_resolve=4" >> /etc/yum.conf

要仅解析 IPv6 地址,请将ip_resolve=4上面更改为ip_resolve=6

其他节目

wgetcurl

# To resolve IPv4 address only
wget -4
curl -4

# To resolve IPv6 address only
wget -6
curl -6

host

host还有-4-6选项,但它们的含义不同 wget 和 curl,它们强制host使用 IPv4/IPv6 传输来查询主机名。

# To resolve IPv4 address only
host -t A

# To resolve IPv6 address only
host -t AAAA

答案2

= 编辑 =

事实证明yum 曾是正确尝试 ipv4 和 ipv6。 glibc 中的 dns 解析器正确检测到您的计算机没有可路由的 ipv6 地址,因此它首选 ipv4 地址。然而 glibc 仍然返回 ipv6 地址。它只是将 ipv6 地址放在首选项列表的底部。

所以yum最后尝试了ipv6地址。不幸的是,似乎yum只显示了最后一个错误。所以yum只显示了 ipv6 的错误 - 你已经预料到会失败! - 并且没有显示 ipv4 的错误是什么。

= 之前的答案 - 关于这个问题是完全错误的 =

我不知道嗯。该错误听起来像是缺少 Happy Eyeballs 的实现,即回退到 ipv4。那里一个 IPv6 地址...

$ 主机 dl.google.com
dl.google.com 是 dl.l.google.com 的别名。
dl.l.google.com 的地址为 173.194.34.132
...许多随机排列的地址...
dl.l.google.com 的地址为 173.194.34.137
dl.l.google.com 的 IPv6 地址为 2a00:1450:400c:c06::5d

显然,出现问题时有一个解决方法,即编辑 /etc/gai.conf 并取消注释该行precedence ::ffff:0:0/96 100。这会优先考虑 ipv4 地址。

我认为正常情况下它应该可以工作。您将拥有一个链接本地 ipv6 地址,以及一个站点本地 ipv4 地址(或没有 NAT 的公共地址)。 libc DNS 解析器应该优先选择 ipv4 目的地。 RFC 3484 中对此进行了规定。

我想知道这是否是一个 Teredo 风格的问题。您的路由器(例如 Apple Airport)是否通过不可靠的隧道为您分配了全球 IPV6 地址?我的电脑(没有全局 ipv6)如下所示:

$ ip 地址 |grep inet6
    inet6 ::1/128 范围主机
    inet6 fe80::215:afff:fe9f:fcd2/64 范围链接

答案3

您可以通过添加来完全禁用 IPv6

net.ipv6.conf.all.disable_ipv6 = 1

/etc/sysctl.d例如中的文件/etc/sysctl.d/disable-ipv6.conf

相关内容