Loading

DNS解析那些事

前言:近期由于服务交接,有几套内部dns交接过来,也因此遇到一些dns解析失败的问题,在沟通过程中也发现大家对于一些细节问题认知不一致,因此记录处理笔记及相关信息如下。

DNS-Rcode

首先,当客户端发起一次dns请求的时候,通常的格式是这样的:

[root@VM-xx-xxx /usr/local/services/unbound/log]# dig @9.xx.xx.xx mirrors.xxx.com

; <<>> DiG 9.7.3-P3-RedHat-9.7.3-8.P3.el6_2.2 <<>> @9.xx.xx.xx mirrors.xxx.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42388
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;mirrors.xxx.com. IN      A

;; ANSWER SECTION:
mirrors.xx.com. 300 IN   A       [ip:域名的A记录]

;; Query time: 0 msec
;; SERVER: 9.xx.xx.xx#53(9.xx.xx.xx)
;; WHEN: Fri Sep 16 11:35:58 2022
;; MSG SIZE  rcvd: 63

而对应的server端日志是这样的:

[1663298658] unbound[5659:b] info: 11.109.74.36 mirrors.xx.com. A IN
[1663298658] unbound[5659:b] info: 11.109.74.36 mirrors.xx.com. A IN , rcode = 0

这个rcode就是DNS应答报文中的状态字段,常见的Rcode值如下:

  • Rcode值为0,对应的DNS应答状态为NOERROR,意思是成功的响应,即这个域名解析是成功
  • Rcode值为2,对应的DNS应答状态为SERVFAIL,意思是服务器失败,也就是这个域名的权威服务器拒绝响应或者响应REFUSE,递归服务器返回Rcode值为2给CLIENT
  • Rcode值为3,对应的DNS应答状态为NXDOMAIN,意思是不存在的记录,也就是这个具体的域名在权威服务器中并不存在
  • Rcode值为5,对应的DNS应答状态为REFUSE,意思是拒绝,也就是这个请求源IP不在服务的范围内

失败原因具体分析

一个典型的两级DNS服务架构如图所示:
image

那么根据以上的错误码,我们可以展开分析几种情况如下

1. Rcode=2 域名解析失败

Rcode值为2,对应的DNS应答状态为SERVFAIL,意思是服务器失败,也就是这个域名的权威服务器拒绝响应或者响应REFUSE,递归服务器返回Rcode值为2给CLIENT。
包括且不限于有以下几种情况:

  • 权威不响应
  • 权威返回refuse
  • 权威返回servfail

1.1 权威不响应。

包括递归服务器至权威服务器中间的网络异常在内,递归服务器在发出递归请求并完成重试超时后,给请求源一个SERVFAIL的应答,并缓存1S,如图:
image

1.2 权威应答REFUSE

权威服务器向递归服务器应答REFUSE。即当权威服务器不存在主域名及对应的SOA记录时,权威会向递归服务器返回REFUSE,即不在我服务的范围内。递归服务器在收到这个REFUSE应答后,给请求源一个SERVFAIL的应答,并缓存1S:
image

1.3 权威应答SERVFAIL

当权威服务器存在主域名但是由于zonefile被破坏导致权威上的NS记录异常时,权威会向递归返回SERVFAIL即解析失败。
递归服务器收到SERVFAIL应答后,给请求源即客户端一个SERVFAIL的应答,并缓存1S:
image

1.4 权威应答其他错误

权威服务器向递归服务器返回其他错误Rcode,递归服务器给请求源返回一个SERVFAIL的应答,并缓存1S:
image

2. Rcode=3 域名记录不存在

当Rcode=3时表示域名不存在,这种情况下权威域名服务器服务正常,但权威不存在这条具体的域名记录,于是权威返回了NXDOMAIN,值得注意的是这个NXDOMAIN的报文中会包含一个AUTHORITY SECTION,内容为该主域名的SOA记录,这个应答结果会在递归服务器中缓存,缓存周期为域名SOA记录的TTL:
image

3. Rcode=5 拒绝服务

当Rcode=5时即server端直接拒绝了该请求,表示请求源不在递归服务器的服务范围内

# control which clients are allowed to make (recursive) queries
# to this server. Specify classless netblocks with /size and action.
# By default everything is refused, except for localhost.
# Choose deny (drop message), refuse (polite error reply),
# allow (recursive ok), allow_snoop (recursive and nonrecursive ok)
# access-control: 0.0.0.0/0 refuse
access-control: 30.135.0.0/16 allow_snoop

image

4. 服务无响应

客户端连接递归服务器超时后也未收到响应
image

root@:~# dig @9.xx.xx.xx mirrors.xx.com 
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.tl2.5 <<>> @9.xx.xx.xx mirrors.xxx.com
; (1 server found)
;; global options: +cmd
;; connection timed out; no servers could be reached

抓包信息如下

[root@VM-xx-xx-centos /data/home/aog]# tcpdump -i eth0 -nt port domain and host 9.ip.of.client
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 500 bytes

IP 9.ip.of.client.44040 > 9.ip.of.server.domain: 38474+ [1au] A? mirrors.xx.com. (58)
IP 9.ip.of.server.domain > 9.ip.of.client.44040: 38474* 1/0/1 A 9.223.76.121 (74)
IP 9.ip.of.client.44040 > 9.ip.of.server.domain: 38474+ [1au] A? mirrors.xx.com. (58)
IP 9.ip.of.server.domain > 9.ip.of.client.44040: 38474* 1/0/1 A 9.223.76.121 (74)
IP 9.ip.of.client.44040 > 9.ip.of.server.domain: 38474+ [1au] A? mirrors.xx.com. (58)
IP 9.ip.of.server.domain > 9.ip.of.client.44040: 38474* 1/0/1 A 9.223.76.121 (74)

一个完整的判断流程如图:

image

posted @ 2022-09-16 16:05  motorao  阅读(919)  评论(0编辑  收藏  举报