名称解析和域名系统DNS
时间:2023-02-06 07:32:01 | 来源:建站知识
时间:2023-02-06 07:32:01 来源:建站知识
- 为了使用如TCP和IP等协议, 主机名称通过称为名称解析(name reso山ion)的过程转换成IP地址。在互联网中存在不同形式的名称解析, 但是最普遍、最重要的一种是采用分布式数据库系统, 即人们熟知的域名系统(DNS) ,DNS作为互联网上的应用程序运行, 它使用IPv4或IPv6。
- 访问DNS是通过一个称为地址解析器(resoIver)的应用程序库来完成的。通常, 在请求TCP打开一个连接或使用UDP发送一个单播数据报之前, 应用程序必须将主机名称转换为IPv4与/或IPv6地址。
DNS名称空间
- DNS中使用的所有的名称集合构成了DNS名称空间(name space)。这个名称空间都是划分为层次且大小写不敏感的。当前的DNS名称空间是一棵域名树, 位于顶部的树根未命名。树的最高层是所谓的顶级域名(TLD), 包括:通用项级域名(gTLD)、国家代码项级域名(ccTLD)、国际化国家代码项级域名(IDN ccTLD), 以及由于历史原因而存在的一类特殊的称为ARPA的基础设施项级域名( infrastructure TLD)。
DNS命名语法
- 名称示例被称为完全限定域名(FQDN)。它们有时更正式地书写为带有后随点的形式(如mit.edu.)。后随点表示该名称是完整的, 当进行名称解析时, 没有额外的信息添加到该名称。与FQDN形成对照, 与系统配置中的默认域名或域名搜索列表集结合使用的非限定域名( unqualified domain name), 会有一个或多个字符串添加到尾部。
- 一个域名包含一系列的由点分开的标签(label)。名称代表名称层级中的一个位置, 句点是层次结构分隔符, 并且按名称中自右至左的顺序沿树下降。
名称服务器和区域
- 负责管理部分有效DNS名称空间(一个或多个域)的个人应该至少安置两台名称服务器(name server)或是DNS服务器(DNS server)来存储名称空间的相关信息。
- 管理授权的单位称为区域(zone),一台DNS服务器可以包含多个区域的信息。
- 在服务器之间, 一台主服务器( primary server)在磁盘文件中包含区域数据库, 一个或多个辅助服务器( secondary server)使用称为区域传输( zone transfer)的进程, 从主服务器完整地获取该数据库的副本。
缓存
- 大部分的名称服务器(除了一些根服务器和TLD服务器)也缓存(cache)它们学习的区域信息, 直到称为生存时间(TTL)的时间限制为止。
DNS协议
- DNS协议由两个主要部分组成:用于执行对DNS特定名称查询的查询/响应协议和名称服务器用于交换数据库记录的协议(区域传输)。
- A.HOME查询http://EXAMPLE.COM 的典型递归DNS查询过程涉及多达10条消息。本地递归服务器(此处为GW.HOME)使用由ISP提供的DNS服务器。该服务器依次使用互联网根域名服务器和gTLD服务器(用于COM和NET TLD)来查找http://EXAMPLE.COM域名的名称服务器。该名称服务器(此处为http://A.IANA-SERVERS.NET)提供主机http://EXAMPLE.COM对应的IP地址。所有的递归服务器缓存学习到的任何信息供以后使用。
DNS消息格式
- DNS消息格式有一个固定的12字节头部。整个消息通常在UDP/IPv4数据报中运载, 并且限于512字节。
- 除了第一个区段, 其他都包含一个或多个资源记录(Resource Record, RR)。
- 事务ID (TransactionID)字段由客户端设置, 由服务器返回。客户端使用它来匹配响应和查询。TC是1位的字段, 表示“可截断的(truncated)” 。使用UDP时, 它表示当应答的总长度超过512字节时, 只返回前512个字节,RD是1位字段, 表示“期望递归”(recursiondesired)” 。该字段可以在一个查询中设置, 并在响应中返回。它告诉服务器执行递归查询。如果该字段没有设置, 且被请求的名称服务器没有授权回答, 则被请求的名称服务器就返回一个可以联系获取回答的其他名称服务器的列表。此时, 全部的查询可能通过联系其他名称服务器来继续。这被称为迭代查询(iterative query), RA是1位字段, 表示“递归可用(recursion available)” 。如果服务器支持递归查询, 则在响应中设置该字段。根服务器一般不支持递归, 因此强制客户端执行迭代查询来完成名称解析。
名称和标签
- DNS消息末尾的可变长度区段包含问题、回答、授权信息(包含某些数据授权信息的名称服务器的名称)和可能减少必要查询次数的额外信息。每一个问题和RR以它所涉及的名称(称为域名或是拥有名称)开始。每个名称由一系列的标签(1abel)组成。标签类型有两种: 数据标签( data label)和压缩标签( compression label)。数据标签包含构成一个标签的字符; 压缩标签充当指向其他标签的指针。当相同字符串的多个副本在多个标签中出现时, 压缩标签有助于节省DNS信息的空间。
数据标签
- 每个数据标签以1字节的计数开始, 该计数指定了紧随其后的字节数目。名称以值为0的字节结束, 0也是一个标签, 其长度值为0 (根标签)。例如:
- 将名称 http://www.pearson.com编码, 共有4个标签。名称的最后通过未命名根的长度值为0的标签标示。
压缩标签
- 在许多情况下, DNS响应消息在回答、授权以及与相同域名相关的额外信息区段中携带信息。如果使用了数据标签, 当涉及相同的名称时, DNS消息中的相同字符就会重复。为了避免这种冗余和节省空间, 使用了一种压缩机制。
- http://usc.edu和http://ucla.edu 共享edu标签,标签edu可以复用http://usc.edu的编码。这可以通过将标签类型(共8位)字节的2个高位置1以及在剩余的14位中编码edu的偏移量来完成。因为edu第一次出现在偏移量为4的位置, 我们只需要设置第一个字节为192 (11000000), 随后字节为4。
UDP或TCP
- 对于TCP和UDP来说, DNS的知名端口号都是53。
- DNS消息通常封装在UDP/IPv4数据报中, 并且其长度限制为512字节, 除非不使用TCP和/或DNS扩展格式(EDNSO)。每一个区段(除了问题区段)包含一组资源记录。
- 当解析器发出一个查询消息, 而返回的响应消息中TC位字段被设置( “被截断”)时, 真实的响应消息的长度超过512字节, 因此服务器只返回前面的512个字节。该解析器可能会使用TCP再次发出请求消息。这样就允许返回超名称解析和域名系统超过512字节的消息, 因为TCP将更大的消息分割成多个报文段。
问题(查询)和区域区段格式
- 查询名称(QueryName)是要被查询的域名, 使用我们之前描述的标签的编码。每个问题都有查询类型(QueryType)和查询类(QueryClass)。类的值是1、 254或255, 分别表示互联网类、没有类,所有类。查询类型字段包含一个值, 该值使用表中的值指明正在执行的查询类型。最常见的查询类型是A (如果启用IPv6的DNS解析,则是AAAA), 这意味着需要一个与查询名称对应的IP地址。
回答、授权和额外信息区段格式
- 名称(Name)字段(有时也被称为“自已的名称”、“拥有者”或“记录拥有者名称”)是随后的资源数据对应的域名。对于互联网数据来说, 类(Class)字段是1, TTL字段是RR可以被缓存的秒数。资源数据长度(RDLENGTH)字段指定了资源数据(RDATA)字段中包含的字节数。
资源记录类型
- 资源记录用于多种用途, 但可以分为三大类: 数据类型、查询类型和元类型。数据类型用于传达在DNS中存储的信息, 如IP地址和授权名称服务器的名称。查询类型使用和数据名称解析和域名系统类型相同的值, 增加了几个额外的值(如, AXFR、 IXFR和*)。它们可以在我们前面描述的问题区段中使用。元类型指定了与一个特定单一DNS消息相关联的临时数据。
NS记录用于将DNS名称空间和
执行解析的服务器联系起来, 它们包含了一个区域授权名称服务器的名称。
A和AAAA记录分别用于提供给定
特定名称的IPv4或IPv6地址。 CNAME记录提供了一种获得另一个
域名的别名的方法。
SRV和
NAPTR记录帮助应用程序发现支持特定服务的
服务器的位置, 并使用替代的命名方案(不是DNS)来访问这些服务。
地址(A, AAAA)和名称服务器记录
- DNS中最重要的记录是地址(A, AAAA)和名称服务器(NS)记录。A记录包含32位的IPv4地址, AAAA (称为“四A”)记录包含IPv6地址。NS记录包含授权DNS服务器的名称, 该服务器包含一个特定区域的信息。因为单独的DNS服务器的名称不足以执行一个查询, 所以这些服务器的IP地址通常也作为DNS响应中额外信息区段中所谓的胶纪录(glue record)。
- 工具dig, 我们可以看到A、 AAAA和NS记录的结构。
- Windows和Linux/基于UNIX的系统中都可以使用的nsIookup程序提供了一种基本的方式来为特定数据查询DNS。
规范名称(CNAME)记录
- CNAME记录代表规范名称( canonical name)的记录, 并用于将单一域名的别名引入到DNS命名系统中。现在普遍的做法是使用CNAME记录来建立公共服务的别名。在一个CNAME RR中, RDATA区段包含与该域名相关的“规范名称” (别名)。
逆向DNS查询: PTR (指针)记录
- PTR RR类型用于响应逆向DNS查询, 当将一个IP地址转换为其名称时, 它通常是很必要的。它以一种特殊的方式使用了特殊的in-addr.arpa ( IPv6中为ip6.axpa)域。
- 通过逆转点分十进制IPv4地址, 将其看作是一个DNS名称, 我们可以使用DNS来执行从IP地址到名称的映射。因此名称81.131.229.169实际上是IPv4地址169.229.131.81的逆转。对于IPv6来说, 方案是相似的, 但是任何不显示的0被展开, 每个十六进制数字变成一个字符。例如, 2001:503:a83e::2:30的逆转是:0.3.0.0.2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.e.3.8.a.3.0.5.1.0.0.2。
- 特殊的 .in-addr.arpa域(适用于IPv4)和 .ip6.arpa (适用于IPv6)用于将支持这些类型名称和逆向DNS查找的PTR ( “指针” ) RR连接起来:81.131.229.169.in-addr.arpa.
权威(SOA)记录
- 在DNS中, 每个区域有一个授权记录, 使用称为授权启动(SOA)的RR类型。这些记录提供部分DNS名称空间和服务器之间的授权联系, 该服务器允许对地址和其他信息进行查询以提供区域信息。SOA RR用于识别主机的名称, 提供官方永久性数据库、负责方的e-mail地址( “.”用来代替@)、区域更新参数和默认TTL。
- 区域更新参数包括一个序列号、更新时间、重试时间和终止时间。每当要改变区域内容时, 序列号Serial通常由网络管理员增加(至少1 )。辅助服务器使用它来确定是否应该启动区域传输(当它们没有序列号最大的区域内容的副本时)。更新时间refresh告诉辅助服务器, 在从主服务器检查SOA记录之前需要等待的时间以及它的版本号, 以确定是否需要区域传输。重试时间和终止时间是在区域传输失败的情况下使用的。重试时间retry值给出辅助服务器重试前需要等待的时间(秒)。终止时间expire是辅助服务器在放弃之前保持重试区域传输的上限(秒)。
邮件交换(MX)记录
- MX记录提供了邮件交换器(mail exchanger)的名称, 邮件交换器为在简单邮件传输协议(SMTP) 中愿意代表与域名相关的用户接收传入电子邮件的主机。
- 即使真实目的地不可用, 也允许发送方主机将电子邮件交付给中介( “中继服务器”)。现在MX记录仍然在使用, 邮件代理更愿意将电子邮件交付给MC记录中列出的与特定域名相关的主机。MX记录包括优先级(preference)值, 因此对于一个特定的域名, 多个MX记录可以同时出现。优先级值允许发送代理按优先顺序(较小的是更可取的)排序主机, 以决定哪个主机用作电子邮件的目的地。例如, 我们可以再次使用host命令查询DNS中与域名http://cs.ucla.edu相关的MX记录:host -t MX http://cs.ucla.edu http://ns3.dns.ucla.edu
打击垃坡邮件: 发送方策略框架(SPF)和文本(TXT)记录
选项(OPT)伪记录
- 同EDNSO也定义了特殊的OPT伪RR。就某种意义而言, 它是“假的”, 它仅适用于单一DNS消息的内容, 而且不是常见的DNS RR数据。因此, OPT RR不被缓存、转发或持续存储, 它们可能在DNS消息中只出现一次(或不出现)。
动态更新(DNS UPDATE)
- 动态更新一个区域是可能的, 这被称为DNS UPDATE, 它支持指定先决条件(prerequisite)和更新请求。先决条件在服务器中评估; 如果它们不为真, 更新不执行, 并返回一个错误消息。
- 通过向一个区域的授权DNS服务器发送动态更新的DNS消息, DNS UPDATE就可以完成。此类消息的结构和传统的DNS信息是一样的, 只不过头部字段和区段有不同的名称。区段说明了正在更新的区域、需要不同的RR存在(或不存在)以便让更新发挥作用的先决条件, 以及更新信息。
- 头部字段ZOCOUNT、 PRCOUNT、 UPCOUNT和ADCOUNT包含以下计数:要被更新的区域(值将为1 ), 要考虑的先决条件, 要做出的更新和额外的信息记录。
- 更新消息的区域区段说明了该区域的名称、类型和类。类型值是6, 表明SOA记录的存在, 用于识别该区域。类值是1 (互联网), 表明我们关心的任意更新消息。正被更新的所有记录必须在相同的区域中。
- 更新消息的先决条件区段包含一个或多个先决条件, 它使用我们先前RR的格式来描述。
- 先决条件区段的后面是Update区段, 它包含要从区域区段中指定的区域中添加或删除的RR
- 更新区段包含被处理的RR的集合, 假如没有遇到由于先决条件或服务器问题造成的错误。每个RR编码增加或删除操作。修改可以通过先删除随后添加来执行。
区域传输和DNS通知
- 区域传输用于从一个服务器到另一个服务器复制一个区域的一组RR (通常是从主服务器向从服务器)。这样做的目的是保持多台服务器的区域内容同步。
- 区域传输在轮询(polling)后开启, 在轮询中, 从服务器周期性地联系主服务器, 通过比较区域的版本号以查看区域传输是否为必要的。如果需要开启区域传输, 当区域内容改变时使用异步更新机制。这被称为DNS NOTIFY。 一旦启动区域传输, 或是传输整个区域(使用DNS AXFR 消息) , 或是选择使用增量区域传输( incremental zone transfer) (使用DNS IXFR的消息) 。一般方案根据图所示进行:
完整区域传输(AXFR消息)
- 完整区域传输由区域的SOA记录中的区域传输参数控制: 主名称服务器, 序列号, 刷新间隔, 重试间隔和到期间隔。当配置后, 从服务器尝试联系主服务器以查看区域传输是否是必要的。根据刷新间隔, 周期性地尝试联系。
- 一个全区域传送(AXFR) DNS信息(在问题区段包含AXFR类型的标准查询)使用TCP请求一个完整的区域传输。
增量区域传输(IXFR消息)
- 为了执行增量区域传输, 客户端(例如,从服务器)必须提供它在该区域的当前序列号。在下面的例子中, 我们可以通过提供序列号和dig程序来模拟请求服务器:
Linux% dig +short @10.0.0.1 -t ixfr=1997022700 home. - 命令行中指出, 命令的输出应该是简短的, 10.0.0.1是要使用的DNS服务器的地址, 以序列号1997022700开始的增量区域传输应该被执行。
DNS NOTIFY
- 轮询通常用于确定区域传输的必要性, 也就是说, 从服务器会定期(刷新间隔)检查主服务器, 查看区域是否已经更新(通过不同的序列号说明), 在哪种情况下区域传输将启动。这个过程有点浪费, 因为许多无用的轮询在区域更新前可能发生。为了改善这种情况, DNS设计了DNS NOTIFY机制。
- DNS NOTIFY允许修改区域内容的服务器通知从服务器更新已经发生, 区域传输应该启动。更具体地说, 如果启用, 当区域SOA RR改变(例如,如果序列号增加)时, 通知消息被发送到一组感兴趣的服务器。这使得区域传输在需要时开启。
排序列表、循环和分离DNS
- 图所示。有一个私有网络和一个包括DNS服务器的公共网络。此外, 在DMZ上有一对主机(A和B), 在内部网络上有一个(C), 在互联网上有一个(R)。多宿主主机(M)跨越DMZ和内部网络。因此, M有来源于两个不同网络前缀的IP地址。
- 一台希望联系M的主机执行DNS查找, 返回两个地址, 一个与内部网络相关, 一个与DMZ相关。当然, 如果A、B和R通过DMZ到达M, C通过内部网络到达M, 这将更高效。
- 一种普遍会发生的情况是, DNS服务器基于请求的源IP地址排序它返回的地址。 (也可以使用目的IP地址, 尤其是如果M在相同的网络接口上使用来自不同子网的多个IP地址。)如果请求系统使用和返回地址记录的源具有相同的网络前缀的源IP地址, DNS服务器在返回的消息中早一些放置这样的匹配记录的集合。这种行为鼓励客户端找到它正尝试联系的特定的服务器的“最近的” IP地址, 因为大部分简单的应用程序尝试联系返回地址记录中发现的第一个地址。这种精确的行为可以通过使用所谓的sortlist或是rrset-order指令来控制(解析器和服务器的配置文件中使用的选项)。
- DNS可以配置返回为依赖于请求IP地址的不同的地址,当多台服务器提供一种服务时, 传入的连接就会是负载均衡的。
从IPv4向IPv6转换DNS
- DNS64将A记录转换为AAAA记录,并和IPv4/IPv6转换器一起工作,以允许只有IPv6的客户端访问IPv4网络中的服务。
- 如图所示,DNS64和IPv4/IPv6转换器结合使用,每个设备配置一个或多个通用IPv6前缀,这些前缀是在创建嵌入式IPv4地址中使用的,每个前缀可能是一个网络特定的前缀(例如:由运营商拥有)或是知名前缀(64:ff9b::/96) 。DNS64设备作为一个缓存DNS服务器。只有IPv6客广端使用它作为主DNS服务器,并可以请求域名的AAAA记录。DNS64将这样的请求转换为IPv4端的A和AAAA记录的请求,如果没有返回AAAA记录,基于配置的前缀和它检索的每个A正录的内容,DNS64通过形成嵌入式IPv4地址来提供合成( synthetic) AAAA记录一DNS64也响应它用于合咸AAAA RR的任意IPv6地址的PTR查询。
LLMNR和mDNS
- 在DNS服务器不可用的情况下,可以使用一个特殊的DNS本地版本,称为本地键路组播名称解析( Link-Local Multicast Name Resolution. LLMNR) ,在本地环境中使用以帮助发现局域网上的设备,如打印机和文件服务器。对于IPv4组播地址224.0.0.252和IPv6地址ff02::1:3,它使用UDP端口5355。如果来自它们响应的任何单播IP地址,服务器也可以使用TCP端口5355。
- 组播DNS (multicast DNS. mDNS) 是另一种形式的本地类DNS功能。DNS使用通过本地组播地址携带的DNS消息,使用UDP端口5353,规定特殊的TLD.local用特殊的语义处理。.localTLD在本地链路范围,在该TLD中的域名的任何DNS查询被发送到mDNS IPv4地此224.0.0.251,或IPv6地址ff02::fb。
资源记录用来保存大部分的DNS信息, 这样的类型有许多: 地址, 邮件交换站, 名称的指针等。在互联网上, 大多数DNS消息使用UDP/IPv4传输, 并且被限制为512个字节的长度。