文档ID:星级:★★★★摘要
调试工具
RR
协议报文
DNS查询原理
如何配置DNS
入方向负载均衡的实现
参考资料
1. 摘要
本文介绍了DNS的工作原理,包括报文格式,各种记录的区别,查询原理,Windows上的DNS调试工具,DNS服务器的部分常用配置,以及负载均衡设备在进行入方向负载均衡时的工作原理。
2. 调试工具
通常网络访问正常,DNS出现故障时,会出现很多奇怪的现象,比如QQ可以正常登陆,却不能访问网页。绝大部分软件在访问Internet时,需要通过DNS将域名解析为IP 地址,再进行IP寻址,所以很多软件在DNS不正常时是不能工作的,但是有些软件可以,比如QQ,这种软件不使用域名,而是直接使用IP通信。
通常在DNS出现故障时候,我们会使用ping “域名”来调试,比如要解析域名www.h3c.com,可以直接ping www.h3c.com来尝试解析这个域名:
如果出现了www.h3c.com的IP,则说明主机可以解析到这个域名,但是并不代表DNS工作正常。主机在ping www.h3c.com的时候,它首先会查自己的hosts文件,Windows主机这个文件位于c:\\windows\\system32\\drivers\\etc\\hosts, *unix主机位于/etc/hosts;如果hosts文件中没有相关记录,主机会查询自己的DNS Cache,如果Cache中有,则直接从缓存中提取IP,如果缓存中没有,才会向DNS发起查询;通常为了验证DNS是否工作正常,需要先查看host文件,并清除DNS Cache(命令:ipconfig /flushdns)。
nslookup是一个最常见的DNS调试工具,在处理上与ping不同,nslookup不会去查hosts文件和DNS Cache,它会直接向DNS服务器发送请求,并且可以使用命令更改DNS 服务器,而不需要修改TCP/IP配置。
但是使用nslookup在你配置的DNS服务器上解析到IP,也不代表DNS工作正常,因为DNS服务器也会在自己的DNS Cache中查询,如果DNS返回结果为“非权威应答”,则代表这条记录为DNS服务器从它的Cache中提取的。图中例子,第一次查询www.3com.com时,由于www.3com.com在服务器上没有Cache,所以查询到的结果上没有“非权威应答”的提示,而第二次查询时,由于服务器上已有Cache,所以会带有“非权威应答”的提示。
nslookup工具有很多参数可以配置,通常可以配置查询类型和修改domain以完成不同类型的查询和避免一些处理上的错误。如果PC加入了AD域,nslookup会自动在要查询的域名后增加AD域的域名,这样会造成查询错误,这个时候需要修改domain(或者在域名后面加上”.”),命令为set domain=.。下图为查询ipv6.google.com的AAAA记录(RR的一种)。
3. RR
RR是Resource Records的意思,是DNS中记录的各种域名与主机信息,也就是DNS 系统所提供的核心信息,RR包括以下几部分,后面会介绍RR的报文构成:
NAME 域名
Type(16bits) 类型
A 主机地址
CNAME 别名
HINFO 主机CPU OS 信息
MX 邮件服务器记录
NS NAME的授权域名服务器
PTR 部分域名空间的指针
SOA 起始授权区域
AAAA IPV6主机地址
Class(16bits) 协议族或协议实例IN Internet系统
CH Chaos 系统
TTL (32bits)表示RR可以缓存的时间,单位为秒;
RDATA 资源数据,即服务器提供的资源信息
4. 协议报文
DNS承载于UDP之上,在特殊情况下也可以使用TCP,端口都是53,当报文大小超过512字节时,DNS报文会进行截取,并将DNS首部的TC置位,这个时候客户端将向服务器发起TCP连接来进行DNS查询。报文包括12字节的首部和可变长的问题、回答、授权、额外信息五部分,其中回答、授权、额外信息都是由RRs组成。
标识
标识字段由客户程序设置,服务器在返回结果携带。客户程序通过它来确定响应与查询是否匹配。
标志
QR:0表示查询,1表示响应;
Opcode:0表示标准查询,1表示反向查询,2表示服务器状态查询,3-15保留;
AA(Authoritative ):
0表示非授权域名服务器应答,1表示为授权域名服务器应答;
TC(Truncated):
如果DNS报文大小超过512字节,则报文会进行截取,这个时候TC需要
置位,表示报文被截断;
RD(Recursion desired):
1表示期望递归,0表示不期望递归;这个标志位决定了internet上DNS
的查询与响应方式,后面将详细介绍;
RA(Recursion available):
1表示服务器具备递归查询的能力,大多数服务器提供递归查询,但根
DNS服务器不提供此服务;
Zero(reserved):
保留位,必须为0;
Rcode(Reply Code):0表示没有差错,1格式错误,2服务器失败,3表示域名错误,4无法执
行。
问题数(Questions)
后面“问题”域中的问题的数量;
回答资源数(Answer RRs)
后面“回答”域中的RR的数量;
授权资源数
后面“授权”域中的RR的数量;
附加资源数
后面“附件信息”域中的RR的数量;
问题
问题由三部分组成,NAME、Type和class;
NAME
(.)来隔离,而是在每个node的前面用一个字节标明字符串的长度,协议规定长度范围为0-63,而0就是根节点,所以每个域名都是以0结束的。查询名可以有多个,这个数目在前面的首部中由”问题数”决定,每个域名之间用0隔开。
Type和Class与
响应资源、授权资源、附件资源
这三部分都是由RR(Resource Records)组成,都是变长,每条RR记录包括域名(可变
下面是一个标准的DNS请求和应答报文:
5. DNS查询原理
DNS查询分为递归和迭代两种方式。递归查询是指服务器会替代源地址进行查询,类似于代理的工作方式。迭代查询是指服务器回给客户端的信息中,RA不置位,并携带有其他DNS服务器的信息,让客户端再向其他服务器发起查询,由于internet上的根服务器压力巨大,所以根服务器都是不接受递归查询的,因此internet上的查询过程基本上都是迭代的。
递归查询
1、PC想要访问一个域名,首先会查自己的HOST文件和DNS Cache;
2、HOST文件和DNS Cache中如果有相应记录,则查询结束,否则继续;
3、PC会向自己配置的DNS服务器发送查询,RD置位(期待递归);
4、本地DNS服务器会查看本机上是否有相应的DNS区域,无此区域则查询DNS
Cache;
5、如果本地DNS中有相应的区域,无论是否有这条记录,DNS都会直接返回结果给
PC(授权应答)。如果没有这个区域,则会查询DNS Cache,如果Cache中有相应
的记录则直接返回结果给PC(非授权应答),查询结束,否则继续;
6、本地DNS向上级DNS服务器(通常是配置的转发器)发送DNS请求,RD置位
(期待递归);
7、上级DNS服务器将重复步骤4、5、6;
8、当本地DNS服务器收到上级的DNS应答后,将应答报文转发给PC;
这种逐级向上请求的方式就是递归查询,从缓存读取的记录都是非授权的,只有服务器上相应的区域是,回复的应答报文才是授权的。
以下为递归查询的过程报文:
迭代查询
PC发出的DNS请求,RD置位,DNS服务器收到后,如果本地没有相应的区域,并且没有配置转发器,则会向根服务器发送请求,这时请求报文的RD将不置位(服务器默认配置),根服务器在回应报文中并不携带answer,而是携带Authoritative nameservers和Additional records,分别携带有其他域名服务器的NS记录和A记录。如果要查询的域名为www.tianya.cn,根服务器的应答将携带有负责cn.区域的DNS服务器的域名和IP(NS记录和A记录)。
下图为一次典型迭代查询的过程报文:
1、PC发送查询报文给DNS服务器192.168.207.207;
2、DNS服务器192.168.207.207进行递归查询,将查询转发给根服务器192.5.5.241;
3、根服务器192.5.5.241回应响应报文,携带授权DNS(.cn.)服务器的NS记录,指
向DNS服务器203.119.27.1;
4、DNS服务器192.168.207.207再将查询报文转发给DNS(.cn.)服务器203.119.27.1;
5、DNS(.cn.)服务器203.119.27.1回应响应报文, 携带授权DNS(tianya.cn.)服务器的NS记录,指向DNS服务器221.11.172.10;
6、DNS服务器192.168.207.207再将查询报文转发给DNS(tianya.cn.)服务器
221.11.172.10;
7、DNS(tianya.cn.)服务器221.11.172.10发现本机上有相应的区域,查询是否有对应
的A记录,返回给DNS服务器192.168.207.207;
8、本地DNS服务器192.168.207.207,将DNS(tianya.cn.)服务器221.11.172.10返回
到应答报文转发给PC;
下图为根服务器回应给本地DNS(第17个报文)服务器的内容:
DNS服务器发往根服务器的请求RD缺省未置位,如果将根服务器配置为转发器,则会发送RD置位的报文给根服务器,根服务器不支持递归,回应报文RA不置位,这时服务器会正常的向下一台服务器发送RD未置位的请求。
Windows只能发送RD置位的报文,当服务器的响应报文中RA未置位时,Windows 无法像DNS服务器一样进行迭代查询,查询会失败,但是windows可以显示响应报文中的NS和A记录,在调试的时候,也可以手动进行迭代。
6. 如何配置DNS
下图为一次典型的internet上的DNS查询过程,这里以windows server 2003为例,讲解在不同位置上,DNS服务器的配置。
服务器192.168.207.207:
作为本地服务器,不需要进行任何配置,根服务器为内置表项,不需要手动配置;
服务器192.5.5.241:
作为根服务器,需要配置不允许进行递归查询,并配置响应区域的委派:
1、勾选属性中的禁用递归,关闭递归查询功能。
2、配置根区域”.”
3、配置委派,将cn.委派给服务器。
服务器203.119.27.1及其后各级服务器:
配置区域委派即可,最后的服务器配置相应的A记录就可以了;
7. 入方向负载均衡的实现
由于Internet上的DNS查询都会由本地DNS服务器进行递归,然后在internet上进行迭代,所以最终到达域名所有者的DNS服务器时,源地址是客户端所在区域的本地DNS服务器的地址,可以认为本地DNS服务器与PC位置基本一致。负载均衡在这个组网中,通常是替换域名所有者的DNS服务器,在返回应答前,向本地DNS发送探测报文,判断源地址距离哪个ISP线路更近,从而决定返回哪条A记录(通常A记录的IP为相应ISP线路上的NAT Server的IP,但是并没有必然关系)。
1、 PC向本地DNS服务器发送DNS请求,RD置位;
2、本地DNS服务器如果无缓存,则向根服务器发送DNS请求,RD不置位,如果配置为置
位,根服务器会在回应报文中将RA置位,后续本地DNS服务器不再将RD置位;3、根服务器回应本地DNS服务器的请求,回应报文中无Answer,在Authoritative
nameservers中包含指定DNS服务器的NS记录,Additional records包含前面这里NS记录对应的A记录(203.119.27.1);
4、本地DNS服务器收到根服务器的应答后,提取其中的Ns记录和A记录,根据A记录中的
地址,将DNS请求发送给203.119.27.1;
5、与步骤3相同,对应A记录IP为221.11.172.154;
6、本地DNS服务器收到根服务器的应答后,提取其中的Ns记录和A记录,根据A记录中的
地址,将DNS请求发送给221.11.172.154;
7、 LoadBalance根据配置的ISP线路(这里假设有中国电信和中国联通2条ISP),分别从
2根线路,向本地DNS服务器发送NQA探测报文。根据探测报文的时延,TTL等,按照一定算法来确定从哪条ISP线路距离客户端更近;
注意:这里不是向PC发送探测报文,而是本地DNS服务器的地址,LoadBalance无法知道PC的IP地址。所以在进行负载均衡调试的时候,并不需要将PC接入不同的运营商来测试,只需要在nslookup中,使用命令server来更换DNS服务器的地址来进行测试,注意前面提到的,只有看不到非授权应答,才证明负载均衡工作正常;
8、将携带A记录的应答报文发送给本地DNS服务器;
9、本地DNS服务器将携带A记录的应答报文发送给PC;
10、PC上的应用程序根据A记录中的IP进行寻址访问。
8. 参考资料
RFC 1035下载本文