我最近又更换了我的 DNS 托管商,因为我需要一些以前的 DNS 托管商不提供的功能。每次我更换 DNS 托管商时,我的服务器都会不可用几个小时,直到 DNS 再次恢复正常。我知道 DNS 是一个分布式系统,会缓存几个小时的条目,但一定有一种方法可以在不中断服务的情况下更换提供商。
以下是我采取的主要步骤:
- 将所有 DNS 记录从之前的 DNS 托管商复制到新的 DNS 托管商。
- 通过明确查询两个托管商的主 DNS 服务器,
dig @<...>
以确保两者的配置相同 - 将新的 DNS 名称服务器告知我的注册商,并向他们提供新的 NS、DNSKEY 和 DS 设置;我的注册商将这些信息转发给 TLD 注册中心(在我的情况下
.de
是 -zone,即 DENIC)
在我执行第 3 步后大约一小时,我的服务器无法通过 DNS 访问。我的域名的 DNS 解析停止。大约又过了六个小时,一切才恢复正常。
如果我没记错的话,在这个特定案例中,中断是由于 NS 和 DNSKEY 记录与 DS 记录在那六个小时内不匹配造成的。NS 和 DNSKEY 记录已经更新并指向新的 DNS 托管商,而 DS 记录在接下来的六个小时内仍保持旧记录。
避免此类问题的正确方法是什么?
附录(2024-07-30)
今天,我想将我的第二个域名从以前的 DNS 托管商迁移到新的 DNS 托管商,我认为我很聪明。
我提前 48 小时禁用了 DNSSEC,以避免任何签名错误。(最好根本没有 DNSSEC,而不是 DNSSEC 失败。)但后来我又陷入了另一个陷阱。
我首先在新的 DNS 托管商处配置了 DNS 区域信息,然后告诉我的注册商将记录NS
从旧 DNS 托管商更改为新 DNS 托管商。但是,更改不是原子性的。他们没有将记录NS
从旧更改为新,而是将NS
记录从旧值更改为“占位符” f.nic.de.
,然后从更改f.nic.de.
为实际的新值。这两个步骤相隔 5 分钟。不幸的是,这 5 分钟的时间窗口足以让 Google DNS (8.8.8.8) 拾取错误的中间值,f.nic.de.
并且它的 TTL 为 14400,即 4 小时。
当然,f.nic.de.
没有关于我实际域名的信息。因此,虽然错误只存在了 5 分钟,但它导致我的域名上某些用户的 DNS 解析中断了另外 4 小时,具体取决于他们查询的 DNS 服务器。
到目前为止,我认为我的虚拟专用服务器的托管商(它还“拥有”我的 IP 地址,也是我的域名的注册商(但不是我的 DNS 托管商))简直是愚蠢的。他们只提供了一个允许输入NS
和DNSKEY
记录的 Web 表单。(DS
记录是从隐式计算的DNSKEY
)。但是,没有添加(或删除)记录的选项。只能替换现有记录(每种类型一个)。但是,即使正确且一致地更改这两个值,然后提交 Web 表单,上游更改(在我的注册商和注册表之间)也是不可预测且无序的。鉴于以下答案,我想我除了与我的注册商讨论他们必须让他们的流程井然有序之外别无他法。