我拥有一个域名econemon.com
。以下是 DNS 条目的摘录(为简洁起见,省略了一些记录):
econemon.com. 1800 IN NS ns.stratoserver.net.
econemon.com. 1800 IN NS ns2.stratoserver.net.
econemon.com. 1800 IN A 85.214.92.48
这些名称服务器来自我的提供商,据我所知,它们是我的域名的权威服务器。
现在,当我去向其中一个服务器询问不存在的子域的地址记录时,它会响应我的服务器的地址,如下所示:
$ host -t A nosuchdomain.econemon.com ns.stratoserver.net
Using domain server:
Name: ns.stratoserver.net
Address: 81.169.163.40#53
Aliases:
nosuchdomain.econemon.com has address 85.214.92.48
当然,这正是我想要的虚拟主机等。现在,假设我添加了一个条目
econemon.com. IN NS ns.econemon.com
并将正确的 A 记录添加ns.econemon.com
到列表中,并且该名称服务器实际上对某些子域名有不同的 A 记录,会发生什么情况?
- 请求是否会
subdomain.econemon.com
根据您询问的名称服务器产生不同的地址?(我想会的。) - 如果是这样,那么当我的 DNS 关闭时,这可能实际上有助于返回到“主服务器”,但是如何让客户端在我的名称服务器启动时使用它呢?
- 这是否会扰乱客户端的缓存?(有可能。)
答案1
DNS 查找是按顺序进行的,从末尾开始。假设缓存为空,则查找 MISSING.DOMAIN.COM 将会类似这样的...
- DNS 客户端将向 DNS 服务器请求 MISSING.DOMAIN.COM。
- DNS 服务器向“根”DNS 询问MISSING.DOMAIN.COM 域,并返回COM 域的名称服务器。
- DNS 服务器向 COM 名称服务器询问 MISSING.DOMAIN.COM,并返回 DOMAIN.COM 域的名称服务器。
- DNS 服务器向 DOMAIN.COM 名称服务器询问 MISSING.DOMAIN.COM。DOMAIN.COM 名称服务器没有答案,因此它根据其配置报告 DOMAIN.COM 的地址。
- 如果有 MISSING.DOMAIN.COM 的 NS 记录,则会返回该记录,然后原始 DNS 服务器会继续查询该记录。如果有 MISSING 的 A 记录,则会报告其上的 IP。
这就是要点。实际上,由于缓存、负载平衡以及名称服务器可以通过名称指定并因此也必须查找的事实,它要复杂得多。
总结一下你的问题..你可以为一个域指定多个名称服务器,并使用它们进行设置不同的信息。答案是是的,但你必须小心,知道自己在做什么。你可以使用 DNS 来支持负载均衡并可以用它来支持轻量级故障转移。但你要小心!
编辑:在评论中,Bortzmeyer 指出了一些简化,在他看来,这些简化已经越界,成为错误。我做了一些调整,希望能解决这些问题。
答案2
这是一种“我不认为这个词的意思和你想象的一样”的情况。你把给定域内的主机记录称为“子域”。但事实并非如此。
回答您的要点问题:
对给定名称服务器的请求将返回它认为合适的答案。听起来您建议您可以添加另一个 DNS 服务器作为“econemon.com”域的权威服务器,该服务器将包含其他服务器没有的一些“A”记录。这不是 DNS 的常见或推荐配置。您通常希望给定域的所有权威 DNS 服务器都具有相同的记录(除非您知道为什么要这样做……又称“水平分割”DNS。)
按照您描述的方式做通常没有什么用。您无法影响客户端计算机解析器对 DNS 服务器的选择。它不会“搞乱”缓存——缓存会按预期工作。它会根据客户端与哪个 DNS 服务器通信而产生不一致的结果,这通常是不好的。
子域名类似于“subdomain.example.com”域名,其中包含“www.subdomain.example.com”之类的主机记录。您所说的只是域中的主机。
答案3
看起来您有一个针对您的域名的 DNS 通配符记录。
*.econemon.com. IN A 81.169.163.40
这意味着如果查询没有记录,您将获得 81.169.163.40 的 A 记录。实际上情况比这更复杂。如果“标签”(完全限定域名或 FQDN)有任何记录,那么这将禁用该标签的通配符记录。因此,如果您有 foo.econemon.com 的 MX 记录,则查询 foo.econemon.com 的 A 记录将不会得到任何结果。
通配符记录比较少见,可能会使某些软件系统感到困惑。我不建议使用它们。但是,您的 ISP 正在使用它们,这样您就不必在每次添加子域时都麻烦他们更新 DNS 记录。这是有道理的。
现在来回答你的问题...
您似乎想问的是:“如果我的一个名称服务器的数据与其他名称服务器不同,会发生什么?”
好吧,如果您的 ISP 使用特定数据运行 2 个域名服务器,而您使用不同的数据运行 1 个域名服务器,那么从 ISP 服务器获取数据的几率为 2:1。如果 DNS 系统在第一个域名服务器中找不到所需的数据,它就不会继续查找其他域名服务器。换句话说,如果妈妈说“不”,您就不能问爸爸。
这是 DNS 中的一个重要概念。DNS 需要快速。因此,如果 1 个查询即可,切勿执行 2 个查询。
这就是为什么您应该在域的每个名称服务器中为域拥有完全相同的区域数据的原因。(除非您有一些有趣的负载平衡方案。)
- 对 subdomain.econemon.com 的请求是否会根据您询问的名称服务器产生不同的地址?(我想会的。)
是的
- 如果是这样,那么当我的 DNS 关闭时,这可能实际上有助于返回到“主服务器”,但是如何让客户端在我的名称服务器启动时使用它呢?
名称服务器的尝试顺序是随机的。如果第一个名称服务器没有响应,DNS 客户端将尝试下一个。当所有名称服务器都尝试过后,客户端会收到 DNS 错误。由于每个 DNS 服务器都会发送 1 个查询,但通常我们会等待 30 秒(我认为)才能收到回复,如果您有 100 个名称服务器,您将等待 50 分钟才会收到客户端错误。这就是为什么我通常不会为一个域名设置超过 3 个名称服务器的原因。更多并不一定更好。
- 这是否会扰乱客户端的缓存?(有可能。)
不是。该软件非常强大。Postel 的强大原则(“发送内容要保守,接受内容要宽容”)在这里发挥作用。它有好处。查询 www.yahoo.com、www.microsoft.com 和 www.google.com。您会发现每个名称服务器都会根据您所在的位置(和其他因素)提供不同的 IP 地址。如果这让客户感到困惑,这些网站将无法生存!