DNS-3 存根解析器和请求和权威域服务器
#网络/DNS#
存根解析器(stub servers)
作为DNS客户端,生活相对轻松。您可以使用像gethostbyname()或getaddrinfo()这样的操作系统函数,这些函数将为您处理所有事情,包括应用本地覆盖和策略。
**“存根解析器”**是一个非常简单的DNS客户端,它发送DNS查询并接收使用响应中的应答。并且只做这两件事。它特别不应该处理任何NS记录,甚至不应该跟踪cname。
有几件事确实很重要。出于安全目的,存根解析器必须小心地完全随机化源端口和ID字段。它还必须防止在同一时间发送多个等价的查询,因为这将允许一个“生日攻击”,可能在有害的答案中欺骗。
实际测试TC=1响应路径也很重要,这可能在发送导致大量应答的查询时触发。
如果解析器同时发送两个不同的问题,比如一个名字的A和AAAA,它应该准备好接收无序的响应——即使是通过TCP。
权威域服务器
在这个文件中,我们深入研究了区域传输和通知。
传入的查询
权威服务器忽略DNS头中的递归所需(RD)位的值。对于它生成的任何响应,递归可用位都设置为零。
请特别注意不要向已经是DNS响应的内容发送响应。这将导致紧循环和拒绝服务攻击。换句话说,传入数据包上的QR必须为0。
代理/委托(delegation)
查找一个请求的应答可能意味着查询多个区域:例如,根区域、org区域、ietf.org区域。(这里指的是之前文中举的查询www.ietf.org的例子)
遍历这样的区域切割的过程称为委托。委托由区域顶点(即区域名称)之外的NS记录的存在表示。
发送应答
从根本上说,以下答案是可能的(这忽略了CNAME和通配符处理,下面将详细介绍)。
- 没有适用的区域加载,则发送拒绝应答
- 在最佳区域(best zone), 当qname和qtype完全匹配时,发送RRSET,设置NO ERROR
- 在best zone中,请求的名称存在,但没有匹配的qtype和NS类型(发送NO DATA)
- 在best zone,名称可能存在,但存在一个节点或父节点有NS记录。发送代理/委托
算法
查询名称为www.ietf.org时,请查看存储是否为www.ietf.org分区。如果没有找到,请尝试ietf.org,如果没有找到,请尝试org,否则请尝试根区域。如果没有发现区域,则发送拒绝。
在第一个匹配的区域(比如,org)中,搜索www.ietf。如果没有找到,搜索ietf等等
通配符
4592试图澄清与通配符有关的每个可能的误解(包括与DNSSEC的交互),但由于其压倒性的细节可能本身就是一个令人困惑的文档。建议参考4592来解决困难的通配符问题,但如果可能的话,首先要远离困难的通配符情况。
重复
授权服务器可以通过TCP提供区域的全部内容,这称为区域传输(zone transfer)或AXFR。“奴隶server"可以请求这样的AXFR,然后也服务的内容的区域。
主服务器通常限制AXFR访问特定的IP地址。从机不一定要被主机知道为从机——只要它有AXFR访问,它就可以检索区域。
区域传输通过TCP进行,每个区域传输由一个或多个DNS消息组成。就像TCP没有数据报功能来表示消息的开始和结束一样,DNS也没有通过TCP。因此,每个消息都以16位网络端长度字段作为前缀。在接收到区域的SOA记录的第二份副本时,依次终止包含区域传输的消息流。
请注意,RFC 1982详尽地描述了应该如何比较序列号。SOA序列号用于指示一个区域是否比另一个区域更新。RFC 1982描述了如何处理32位换位。
通知
如上面的SOA记录描述中所述,从服务器定期检查主服务器,以确定是否有需要检索的更新。
由于这种定期检查可能是遥远的未来,主服务器可以在加载新区域数据时发送通知。
简而言之,通知是一个常规的DNS消息,作为查询发送出去,但随后使用OPCODE=5。通知会一直重复,直到被从服务器确认。