我目前在 Linode 上管理两台服务器。第一个“server-a”正在运行 12.04,第二个“server-b”是 14.04 的全新安装。
不久前,我在 server-a 上的 spf 记录遇到了一些问题,并意识到我需要显式添加(或创建 A 记录)ipv6 地址,因为 postfix 服务使用 ipv6 连接到 gmail。这让我感到惊讶,因为我只是假设它默认使用 ipv4。经过更多的跟进,我发现几乎所有服务在某些情况下都使用 ipv6,但在其他情况下则不然。
例如,如果 postfix 传递邮件,或者如果我 telnet 或 ssh 到 Linode 上的另一个主机,我的 ipv6 地址会显示在日志中。另一方面,如果我连接到家中的本地服务器或 Digital Ocean 网络上的一个,则使用 ipv4。
谁能解释在建立连接时何时以及如何确定应使用 ipv4 或 ipv6?它是否因服务而异,或者这是中央配置的一部分?
服务通常使用主机名访问,这通常意味着 DNS 用于查找链接到该主机名的 IP 地址。对于 IPv4 将有 A 记录,对于 IPv6 将有 AAAA 记录。所有这些地址都应该提供相同的服务,而与使用的协议无关。
因此,如果您向 Gmail 发送电子邮件,您的邮件服务器将查找 MX(邮件交换)记录
gmail.com
。在我看来,这些是:最高优先级的 MX 是
gmail-smtp-in.l.google.com
,所以我们来看看它的地址:所以现在你的邮件服务器有三个可以使用的地址。DNS 不会告诉您首选哪一个。该选择取决于您的本地软件。关于要使用的算法有一个完整的 RFC(RFC 6724),但通常归结为:在可用时使用 IPv6,否则使用 IPv4。
除非另有明确配置,Postfix (≥ 2.9) 将在可用时同时使用 IPv4 和 IPv6。它将首先尝试 IPv6,如果无法使用 IPv6 连接,它将使用 IPv4 连接。
自从Happy Eyeballs/RFC 6555发明以来,Web 浏览器如今以不同的方式工作。因为 IPv6 上的连接问题会导致烦人甚至无法使用的超时,所以浏览器会尝试使用 IPv6,但如果在 ±200 毫秒后没有听到任何消息,它会尝试并行使用 IPv4 进行连接。将使用第一个成功的连接。
当然:如果您使用的服务没有在 DNS 中通告任何 IPv6 地址,那么只会使用 IPv4。反之亦然。