我有一些问题可以更好地理解DNS机制:
1)我知道客户端和权威DNS服务器之间有一些中间DNS服务器,例如ISP的。其他类型又在哪里?
2)在中间DNS服务器中,NS记录的TTL过期后,它们何时刷新名称地址?客户要求?还是在到期后立即刷新记录?
谢谢。
答案 0 :(得分:1)
您的问题与编程无关,因此不在这里。
但是:
我知道客户端和权威DNS服务器之间有一些中间DNS服务器,例如ISP的。其他类型又在哪里?
只有两种类型的DNS服务器(我们暂时将它放在存根的情况下):它是权威名称服务器(保存有关某些域的信息并作为其信任源)或附加到缓存的递归缓存,它基本上从没有数据开始,然后根据获取的查询逐步进行各种查询以获取信息。
从技术上讲,一台服务器可以同时完成这一切,但这至少是出于缓存原因以及客户端数量不同的考虑,这是一个坏主意:权威的名称服务器通常对任何客户端开放,因为它需要“扩散”它的数据无处不在,而递归名称服务器通常仅适用于选定的客户端列表(例如ISP客户端)。
当今,大型组织(CloudFlare,Google,Quad9等)已经存在开放的公共递归名称服务器。但是,它们都有硬件,链接和人力来处理来自公共递归名称服务器(例如具有放大功能的DDOS)带来的所有困难。
您可以拥有一个递归名称服务器场,就像大型ISP(或大型公共ISP)一样,因为任何单个实例都不能支持所有客户端查询,并且它们可以共享单个缓存或在其中工作一个层次结构,最底层的将其数据发送到另一个上游递归名称服务器等。
在中间DNS服务器中,NS记录的TTL过期后,它们何时刷新名称的地址?客户要求?还是在到期后立即刷新记录?
这种历史悠久的天真方式可以概括为:请求到达,我是否将其保存在缓存中?如果否,则在外面查询并缓存它。如果是,它在我的缓存中过期了吗?如果不是,则将其发送给客户端,但是如果是,我们需要将其从缓存中删除,然后从一开始就认为它不在缓存中。
然后您会有各种变化:
我建议您将unbound
用作递归名称服务器,因为它在TTL处理方面具有多种设置,因此您可以学习内容,然后阅读代码本身(这使我们回到正题一种。
您还可以阅读以下文档:https://www.ietf.org/archive/id/draft-wkumari-dnsop-hammer-03.txt关于以下内容的IETF网络草案:
原理是获取缓存中流行的RRset,即 可以说在TTL过期并刷新之前已解决。通过获取 最终用户查询RRset之前,也就是说 预取,HAMMER有望改善体验质量 最终用户以及优化涉及的资源 大型DNSSEC解决平台。
请务必阅读附录A,其中包含许多有用的示例,
Unbound已经这样做(它们使用TTL的百分比而不是数字 秒)。
他们也实施了类似的OpenDNS。
截至2月9.10日的BIND 2014现在实现了这样的事情 (https://deepthought.isc.org/article/AA-01122/0/Early-refresh-of-cache-records-cache-prefetch-in-BIND-9.10.html),并通过以下方式启用它 默认。
许多递归解析器实现的技术类似于 本文档中介绍的技术。本节记录了一些 这些以及他们在选择技术时所要进行的权衡。
以绑定为例,您可以阅读:
BIND 9.10预取的工作方式如下。有两个数字控制它。第一个数字是“资格”。只有TTL值大于配置的可识别性的到达记录才被考虑进行预取。第二个数字是“触发器”。如果查询到达要求缓存的数据过期之前还剩下少于“触发”秒的时间,则除了返回该数据作为对查询的答复之外,BIND还将向权威服务器请求新的副本。目的是使新副本在现有副本到期之前到达,从而确保统一的响应时间。
BIND 9.10预取值是全局选项。您不能在不同的域中要求不同的预取行为。默认情况下启用预取。若要将其关闭,请将触发值指定为0。以下命令将触发值指定为2秒,而合格值为9秒,这是默认设置。