DNS数据包格式及内容详解

1 域名解析过程

域名解析总体可分为两大步骤,第一个步骤是本机向本地域名服务器发出一个DNS请求报文,报文里携带需要查询的域名;第二个步骤是本地域名服务器向本机回应一个DNS响应报文,里面包含域名对应的IP地址或者别名等。从下面对jocent.me进行域名解析的报文中可明显看出这两大步骤。注意:第一个步骤从主机到本地域名服务器是递归查询;第二大步骤中采用的是迭代查询,其实是包含了很多小步骤的,详情见下面的流程分析(本地服务器向根域名服务器,顶级域名服务器,二级域名服务器,权限域名服务器(一般由公司企业提供解析)等DNS迭代查询)。

其具体的流程可描述如下:

  1. 主机10.74.36.90先向本地域名服务器10.74.1.11进行递归查询
  2. 本地域名服务器采用迭代查询,向一个根域名服务器进行查询
  3. 根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器 dns.me的IP地址
  4. 本地域名服务器向顶级域名服务器 dns.me进行查询
  5. 顶级域名服务器me告诉本地域名服务器,下一步查询权限服务器dns.jocent.me 的IP地址
  6. 本地域名服务器向权限服务器 dns.jocent.me进行查询
  7. 权限服务器 dns.jocent.me告诉本地域名服务器所查询的主机的IP地址
  8. 本地域名服务器最后把查询结果告诉 10.74.36.90

其中有两个概念递归查询和迭代查询,其实在整个描述的过程中已经体现的很明显,这里再说明一下:

  • 递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机
  • 迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询

2 DNS数据包格式

请求数、回答数、权威域名服务器数、其他记录数

è¿éåå¾çæè¿°

2.1 头部

  1. 会话标识ID(2字节):是DNS报文的ID标识,对于请求报文和其对应的应答报文,这个字段是相同的,通过它可以区分DNS应答报文是哪个请求的响应。用于划分DNS流(一个请求对应一个响应)。
  2. 标志(2字节):
    QR(1bit)查询/响应标志,0为查询,1为响应Response: Message is a response
    opcode(4bit)

    4个比特位用来设置查询的种类,应答的时候会带相同值,

    0 标准查询 (QUERY)

    1 反向查询 (IQUERY)

    2 服务器状态查询 (STATUS)

    3 无

    4 为通知 (Notify)

    5 为更新 (Update)

    6-15 保留值,暂时未使用

    Opcode: Standard query (0)
    AA(1bit)

    表示授权应答 Authoritative Answer 

    应答的时候有意义,指出给出应答的服务器是查询域名的授权解析服务器。注意因为别名的存在,应答可能存在多个主域名,这个AA位对应请求名,或者应答中的第一个主域名。

    1标识域名服务器是授权服务器。

    0 为应答服务器不是该域名的权威解析服务器

    1 为应答服务器是该域名的权威解析服务器

    Authoritative: Server is not an authority for domain
    TC(1bit)

    表示截断 TrunCation

    用来指出报文比允许的长度还要长,导致被截断。仅当DNS报文使用UDP服务时使用。因为UDP数据包有长度限制,当长度过长时会被截断。

    1标识DNS报文长度超过512字节,并被截断。

    0 为报文未截断

    1 为报文过长被截断 (只返回了前 512 个字节)

    Truncated: Message is not truncated
    RD(1bit)

    表示期望递归 Recursion Desired

    这个比特位被请求设置,应答的时候使用的相同的值返回。如果设置了RD,就建议域名服务器进行递归解析,递归查询的支持是可选的。

    1标识执行递归查询,即DNS服务器无法解析某一个主机名,则它向其它DNS服务器继续查询,如此反复,直到它解析到目标主机名并返回给客户端。0标识迭代查询,即DNS服务器无法解析目标主机时,它将查询到的其它DNS服务器的IP地址返回给客户端,供客户端进行参考。

    0 为不期望进行递归查询

    1 为期望进行递归查询 (从域名服务器进行递归查询)

    Recursion desired: Don't do query recursively
    RA(1bit)

    表示支持递归 Recursion Available

    这个比特位在应答中设置或取消,用来代表服务器是否支持递归查询。允许递归标识。此字段在应答字段中使用,1标识DNS服务器支持递归查询。

    0 为应答服务器不支持递归查询

    1 为应答服务器支持递归查询

    Recursion available: Server can't do recursive queries
    Z(1bit)保留字段,暂时未使用。在所有的请求和应答报文中必须置为0。

    Z: reserved (0) 

    此时大家可能有疑问,本身Z不是三个bit吗,为什么还有Z, AD, CD那,实际上参考书上Z是三个字节,作为保留,但是有时会用来作为RCode域的扩展。

    但实际上抓包我发现,Z只占一个bit,还有AD和CD,所以我猜测实际运行中认为AD和CD是RCode域的扩展。只有Z是保留。

    AD(1bit)

    应答认证:应答/权限部分未由服务器进行认证

    0 为应答服务器未验证了该查询相关的 DNSSEC 数字签名

    1 为应答服务器已经验证了该查询相关的 DNSSEC 数字签名

    Answer authenticated: Answer/authority portion was not authenticated by the server
    CD(1bit)

    未经认证的数据:不可接受

    0 为服务器已经进行了相关 DNSSEC 数字签名的验证

    1 为服务器并未进行相关 DNSSEC 数字签名的验证

    Non-authenticated data: Unacceptable
    rcode(4bit)

    应答码(Response code) - 这4个比特位在应答报文中设置,代表的含义如下:

    0 正常,没有差错。

    1 报文格式错误(Format error) - NS服务器不能解析请求的报文。

    2 服务器失败(Server failure) - 因为服务器的原因导致没办法处理这个请求。

    3 名字差错(Name Error) - 只有对授权域名解析服务器有意义,指出解析的域名不存在(请求中的地址并不存在)。

    4 没有实现(Not Implemented) - NS域名服务器不支持查询类型。

    5 拒绝(Refused) - 服务器由于设置的策略拒绝给出应答。比如,服务器不希望对某些请求者给出应答,或者服务器不希望进行某些操作(比如区域传送zone transfer)。

    6 为域名出现了但是他不该出现

    7 为集合 RR 存在但是他不该存在

    8 为集合 RR 不存在但是他应该存在

    9 为服务器并不是这个区域的权威服务器

    10 为该名称并不包含在区域中

    11-15 保留值,暂时未使用。

    16 为错误的 OPT 版本或者 TSIG 签名无效

    17 为无法识别的密钥

    18 为签名不在时间范围内

    19 为错误的 TKEY 模式

    20 为重复的密钥名称

    21 为该算法不支持

    22 为错误的截断

    23 - 3840 保留

    3841 - 4095 私人使用

    4096 - 65534 保留

    65535 RFC 6195

    Reply code: No error (0)
  3. 数量字段(总共8字节):Questions、Answer RRs、Authority RRs、Additional RRs 各自表示后面的四个区域的数目。Questions表示查询问题区域节的数量,Answers表示回答区域的数量,Authoritative namesversers表示授权区域的数量,Additional recoreds表示附加区域的数量。

问题数QDCOUNT 无符号16位整数表示报文请求段中的问题记录数。

资源记录数ANCOUNT 无符号16位整数表示报文回答段中的回答记录数。

授权资源记录数NSCOUNT 无符号16位整数表示报文授权段中的授权记录数。

额外资源记录数ARCOUNT 无符号16位整数表示报文附加段中的附加记录数。
 

2.2 正文

2.2.1 Queries区域

(1)查询名 QNAME 要查找的名字,是一个或多个标识符的序列,长度不固定,且不使用填充字节,一般该字段表示的就是需要查询的域名(如果是反向查询,则为IP,反向查询即由IP地址反查域名)。每个标识符以首字节的计数值来说明随后标识符的字节长度,每个名字以最后字节为0结束,长度为0的标识符是根标识符。单个标识符最大长度为63字节。一般的格式如下图所示。

(2)查询类型 QTYPE 每个问题有一个查询类型。2个字节表示查询类型,取值可以为任何可用的类型值,以及通配码*来表示所有的资源记录。

类型助记符说明
1A由域名获得IPv4地址
2NS查询授权的域名服务器
5CNAME查询规范名称(别名)
6SOA开始授权
11WKS熟知服务
12PTR把IP地址转换成域名(指针记录,反向查询)
13HINFO主机信息
15MX邮件交换记录
28AAAA由域名获得IPv6地址
252AXFR对区域转换的请求,传送整个区的请求。
255ANY对所有记录的请求

其他QTYPE类型有

MD 3 a mail destination (Obsolete - use MX)

MF 4 a mail forwarder (Obsolete - use MX)

SOA 6 marks the start of a zone of authority

MB 7 a mailbox domain name (EXPERIMENTAL)

MG 8 a mail group member (EXPERIMENTAL)

MR 9 a mail rename domain name (EXPERIMENTAL)

NULL 10 a null RR (EXPERIMENTAL)

WKS 11 a well known service description

MINFO 14 mailbox or mail list information

TXT 16 text strings TXT 记录是为您所在网域之外的来源提供文本信息的一种 DNS 记录,可用于多种用途。该记录的值可以是人工可读文本,也可以是机器可读文本。(常用夹带其他数据比如C&C和文件,用于建立隧道)

查询类型出现在问题字段中,查询类型是类型的一个超集,所有的类型都是可用的查询类型

AXFR 252 A request for a transfer of an entire zone

MAILB 253 A request for mailbox-related records (MB, MG or MR)

MAILA 254 A request for mail agent RRs (Obsolete - see MX)

255 A request for all records

这里给一个域名,可用来模拟DNS的查询类型,可以选择不同的类型,比如A,PTR等玩一下, https://www.nslookuptool.com/chs/       
(3)查询类:通常为1,表示IN,表明是Internet数据。

IN (1) 指互联网地址。

CS 2 the CSNET class (Obsolete - used only for examples in some obsolete RFCs)

CH 3 the CHAOS class

HS 4 Hesiod [Dyer 87]

查询类是类的一个超集

* 255 any class

2.2.2 资源记录(RR)区域(包括回答区域,授权区域和附加区域)

该区域有三个,但格式都是一样的。这三个区域分别是:回答区域,授权区域和附加区域

(1) 域名NAME(2字节或不定长):它的格式和Queries区域的查询名字字段是一样的。有一点不同就是,当报文中域名重复出现的时候,该字段使用2个字节的偏移指针来表示。比如,在资源记录中,域名通常是查询问题部分的域名的重复,因此用2字节的指针来表示,具体格式是最前面的两个高位是 11,用于识别指针。其余的14位从DNS报文的开始处计数(从0开始),指出该报文中的相应字节数。一个典型的例子,C00C(1100000000001100,12正好是头部的长度,其正好指向Queries区域的查询名字字段)。

(2) 查询类型TYPE 表明资源纪录的类型,见2.2.1节的查询类型表格所示指出RDATA数据的含义

(3)查询类CLASS 对于Internet信息,总是1,代表IN。表示RDATA的类

(4)生存时间(TTL):4字节无符号整数表示资源记录可以缓存的时间。以秒为单位,表示的是资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间,它同时也可以表明该资源记录的稳定程度,极为稳定的信息会被分配一个很大的值(比如86400,这是一天的秒数)。0代表只能被传输,但是不能被缓存。

TTL 是 DNS 记录中的一个值,可决定对该记录所做的后续更改需要多少秒才会生效。网域的每条 DNS 记录(如 MX 记录、CNAME 记录等)都有一个 TTL 值。一条记录目前所设的 TTL 决定了您现在所做的任何更改需要多久才会生效。例如,如果一条记录的 TTL 为 86400 秒,则对该记录的更改最多需要 24 小时才会生效。

请注意,更改记录的 TTL 会影响之后的所有更改需要多久才会生效。我们建议将 TTL 值设置为 3600,即让整个互联网中的服务器每小时检查一次该记录的更新情况。较短的 TTL 在之前的有效期到期后才会生效。这意味着,下次更新该记录时,您的更改最多要一个小时才会生效。要使后续的更改更快生效(例如,如果您想快速还原一项更改),则可以设置较短的 TTL 值,如 300 秒(5 分钟)。正确配置记录后,我们建议将 TTL 值设置为 86400,即让整个互联网中的服务器每 24 小时检查一次记录的更新情况。

(5) 资源数据长度:URDLENGT**H 2个字节无符号整数表示RDATA的长度

(6)资源数据 RDATA  该字段是一个可变长字段,不定长字符串来表示记录,格式与TYPE和CLASS有关。比如,TYPE是A,CLASS 是 IN,那么RDATA就是一个4个字节的ARPA网络地址。表示按照查询段的要求返回的相关资源记录的数据。可以是Address(表明查询报文想要的回应是一个IP地址)或者CNAME(表明查询报文想要的回应是一个规范主机名)等。

2.2.3 授权区域

2.2.4 附加区域

注意:

为了减小报文,域名系统使用一种压缩方法来消除报文中域名的重复。使用这种方法,后面重复出现的域名或者labels被替换为指向之前出现位置的指针。优点:节约了空间,降低报文的容量;避免数据包截断;保证了数据的一致性。缺点:但是需要所有的程序都应该能够理解收到的报文中包含的指针。

以上截断概念重申:

仅当DNS报文使用UDP服务时使用截断标识和功能。因为UDP数据报有长度限制,所以过长的DNS报文将被截断。1表示DNS报文超过512字节,并被截断。当然基于TCP的DNS数据包不存在此问题。

常用记录类型

TXT记录

一般指某个主机名或域名的说明,如:admin IN TXT "管理员, 电话:XXXXXXXXXXX",mail IN TXT "邮件主机,存放在xxx , 管理人:AAA",Jim IN TXT "contact: abc@mailserver.com",也就是您可以设置 TXT 内容以便使别人联系到您。 

TXT的应用之一,SPF(Sender Policy Framework)反垃圾邮件。SPF是跟DNS相关的一项技术,它的内容写在DNS的TXT类型的记录里面。MX记录的作用是给寄信者指明某个域名的邮件服务器有哪些。SPF的作用跟MX相反,它向收信者表明,哪些邮件服务器是经过某个域名认可会发送邮件的。SPF的作用主要是反垃圾邮件,主要针对那些发信人伪造域名的垃圾邮件。例如:当邮件服务器收到自称发件人是spam@gmail.com的邮件,那么到底它是不是真的gmail.com的邮件服务器发过来的呢,我们可以查询gmail.com的SPF记录,以此防止别人伪造你来发邮件。

CNAME记录

DNS 协议不允许您为 DNS 命名空间的顶端节点(也称为区域顶点)创建别名记录 (CNAME)。例如,如果您注册了 DNS 名称 example.com,则顶级域名为 example.com。您不能为 example.com 创建 CNAME 记录,但可以为 www.example.com、newproduct.example.com 等创建 CNAME 记录。

此外,如果您为某个子域创建 CNAME 记录,则不能为该子域创建任何其他记录。例如,如果您为 www.example.com 创建 CNAME,则不能创建其“名称”字段的值为 www.example.com 的任何其他记录。

MX 记录类型

MX 记录的每个值实际上都包含两个值,即优先级和域名:

Priority

表示电子邮件服务器优先级的一个整数。如果只指定一个服务器,则优先级可以是 0 到 65535 之间的任意整数。如果指定多个服务器,则为优先级指定的值指示您要将邮件路由到第一个、第二个等电子邮件服务器中的哪一个。优先级值最低的服务器优先。例如,如果您有两个电子邮件服务器,并且为优先级指定值 10 和 20,则电子邮件始终会路由到优先级为 10 的服务器 (除非该服务器不可用)。如果您指定值为 10 和 10,则电子邮件会大致同等地路由到两个服务器。

域名

电子邮件服务器的域名. 指定 A 或 AAAA 记录的名称 (如 mail.example.com)。在 RFC 2181, Clarifications to the DNS Specification 中,10.3 小节禁止为域名值指定 CNAME 记录的名称。(当 RFC 提到“别名”时,指的是 CNAME 记录,而不是 Route 53 别名记录。)

NAPTR 记录类型

名称权威指针 (NAPTR) 是动态授权发现系统 (DDDS) 应用程序用于将一个值转换为另一个值或将一个值替换为另一个值的一种记录类型。例如,一个常见的用途是将电话号码转换为 SIP URI。

NAPTR 记录的 Value 元素包含六个以空格分隔的值:

Order

当您指定多个记录时,您希望 DDDS 应用程序评估记录的顺序。有效值:0 - 65535.

Preference

当您指定具有相同 Order 的两个或更多记录时,您评估这些记录的顺序首选项。例如,如果两个记录的 Order 为 1,则 DDDS 应用程序首先会评估具有较低 Preference 的记录。有效值:0 - 65535.

Flags

特定于 DDDS 应用程序的一个设置。RFC 3404 中当前定义的值为大写字母和小写字母 "A""P""S" 和 "U",以及空字符串 ""。将 Flags 用引号引起来。

服务

特定于 DDDS 应用程序的一个设置。将 Service 用引号引起来。

Regexp

DDDS 应用程序用于将输入值转换为输出值的一个正则表达式。例如,IP 电话系统可使用一个正则表达式将用户输入的电话号码转换为 SIP URI。将 Regexp 用引号引起来。为 Regexp 指定一个值,或者为 Replacement 指定一个值,但不要同时为这两者指定值。

该正则表达式可包含以下任何可打印 ASCII 字符:

  • a-z

  • 0-9

  • - (连字符)

  • (space)

  • ! # $ % & ' ( ) * + , - / : ; < = > ? @ [ ] ^ _ ` { | } ~ .

  • " (引号)。要在字符串中包含引号字符,请在它前面加上 \ 字符:\"。

  • \ (反斜杠)。要在字符串中包含反斜杠,请在它前面加上 \ 字符:\\。

以八进制格式指定所有其他值,例如国际化域名。

Replacement

您希望 DDDS 应用程序对其提交 DNS 查询的下一个域名的完全限定域名 (FQDN)。DDDS 应用程序会用您为 Replacement 指定的值 (如果有) 来替换输入值。为 Regexp 指定一个值,或者为 Replacement 指定一个值,但不要同时为这两者指定值。如果您为 Regexp 指定了一个值,请为 Replacement 指定一个圆点 (.)。

域名可以包含 a-z、0-9 和 - (连字符)。

NS 记录类型

NS 记录会标识托管区域的名称服务器。NS 记录的值为名称服务器的域名。

PTR 记录类型

PTR 记录 Value 元素的格式与域名相同。

SOA 记录类型

授权起始点 (SOA) 记录会提供有关域和相应 Amazon Route 53 托管区域的信息。

SPF 记录类型

SPF 记录以前用于验证电子邮件发件人的身份。但是,不再建议您创建记录类型为 SPF 的记录。RFC 7208 中的 Sender Policy Framework (SPF) for Authorizing Use of Domains in Email, Version 1 (在电子邮件中授权使用域的发件人策略框架 (SPF),版本 1) 已更新为:“...[I]ts existence and mechanism defined in [RFC4408] have led to some interoperability issues. Accordingly, its use is no longer appropriate for SPF version 1; implementations are not to use it.“(...在 [RFC4408] 中定义的其存在和机制已导致一些互操作性问题。因此,它已不再适合 SPF 版本 1;实施方案中不应再使用它。) 在 RFC 7208 中,请参阅第 14.1 节 The SPF DNS Record Type

建议您创建一个包含适用值的 TXT 记录,而不是 SPF 记录。

SRV 记录类型

SRV 记录 Value 元素包含四个以空格分隔的值。前三个值为分别是表示优先级、权重和端口的十进制数。第四个值为一个域名。有关 SRV 记录格式的信息,请参阅适用的文档。

TXT 记录类型

TXT 记录包含一个或多个用双引号 (") 引起的字符串。当您使用简单路由策略时,请将域 (example.com) 或子域 (www.example.com) 的所有值包含在同一 TXT 记录中。

单个字符串最多可包含 255 个字符,包括以下内容:

  • a-z

  • A-Z

  • 0-9

  • 空格

  • - (连字符)

  • ! " # $ % & ' ( ) * + , - / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ .

如果您的 TXT 记录包含以下任意字符,则必须使用 \三位八进制代码格式的转义码指定字符:

  • 八进制字符 000 到 040 (十进制 0 到 32,十六进制 0x00 到 0x20)

  • 八进制字符 177 到 377 (十进制 127 到 255,十六进制 0x7F 到 0xFF)

例如,如果您的 TXT 记录的值为 "exämple.com",则应指定 "ex\344mple.com"

有关 ASCII 字符和八进制代码之间的映射,请在 Internet 上搜索“ascii 八进制代码”。一个有用的参考是 ASCII 代码 - 扩展 ASCII 表

大小写将被保留,因此 "Ab" 和 "aB" 是不同的值。

要将引号 (") 包含在字符串中,请在引号前面放置反斜杠 (\) 字符:\"。转义字符。

  • 21
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值