说起域名解析失败,小编平时工作中经常遇到。一旦失败可不得了,基本代表着对应的业务无法访问了。不过一部分“失败”指的是请求源向递归DNS查询时候无法解析出结果的情况,并不是真正意义上的失败。所以小编今天向大家科普下域名解析失败的几种情况。
关于DNS-Rcode(DNS返回码)
小编首先要介绍一下DNS-Rcode,DNS-Rcode作为DNS应答报文中有效的字段,主要用来说明DNS应答状态,这可是小编排查域名解析失败的重要指标。通常常见的Rcode值如下:
- Rcode值为0,对应的DNS应答状态为NOERROR,意思是成功的响应,即这个域名解析是成功;
- Rcode值为2,对应的DNS应答状态为SERVFAIL,意思是服务器失败,也就是这个域名的权威服务器拒绝响应或者响应REFUSE,递归服务器返回Rcode值为2给CLIENT;
- Rcode值为3,对应的DNS应答状态为NXDOMAIN,意思是不存在的记录,也就是这个具体的域名在权威服务器中并不存在;
- Rcode值为5,对应的DNS应答状态为REFUSE,意思是拒绝,也就是这个请求源IP不在服务的范围内。
DNS请求失败的具体分析
综上,小编可以知道,常见的请求失败包括:
1、域名记录不存在,即Rcode值为3(NXDOMAIN)的情况,这种情况下域名权威服务器及托管的主域名均正常,但是权威并不存在这条具体的域名记录,于是权威返回了NXDOMAIN,值的注意的是这个NXDOMAIN的报文中会包含一个AUTHORITY SECTION,内容为改主域名的SOA记录,这个应答结果会在递归服务器中被缓存,缓存时间周期为域名的SOA记录的TTL。
2、权威解析失败,即Rcode值为2(SERVFAIL)的情况,递归服务器会给请求源这个结果的原因是向权威解释请求异常,包括且不限于权威不响应/或者权威返回refuse/或者权威返回servfail,这个SERVFAIL的应答结果当然是一个空结果,不过BIND会强制给这个结果增加一个1S的TTL,所以SERVFAIL的应答会在递归服务器中被缓存,缓存时间周期为1S。
2.1)权威不响应。包括递归服务器至权威服务器中间的网络异常在内,递归服务器在发出递归请求并完成重试超时后,给请求源一个SERVFAIL的应答,并缓存1S 。
2.2)权威向递归服务器应答REFUSE。当权威服务器不存在主域名及对应的SOA记录时,权威会向递归服务器返回REFUSE,即不在我服务的范围内拒绝,递归服务器在收到这个REFUSE应答后,给请求源一个SERVFAIL的应答,并缓存1S。
2.3)权威向递归服务器应答SERVFAIL。当权威服务器存在主域名但是由于zonefile被破坏导致权威服务器上域名的NS记录异常时,权威会向递归服务器返回SERVFAIL,即解析失败,递归服务器在收到这个SERVFAIL应答后,给请求源一个SERVFAIL的应答,并缓存1S 。
2.4)权威向递归服务器应答其他的错误Rcode。由于不常见本文就不展开了,递归服务器在收到其他错误应答后,给请求源一个SERVFAIL的应答,并缓存1S。
3、拒绝服务,即Rcode值为5(REFUSE)的情况。除了记录不存在(NXDOMAIN)和解析失败(SERVFAIL)以外,如果请求源不在递归服务器的服务范围内,这种情况下递归服务器会直接给请求源一个REFUSE的应答,本地直接应答无缓存。
4、响应成功,但是没有解析结果,这是一种比较特殊的情况,这种情况是Rcode值为0(NOERROR)的情况。这种情况下域名权威服务器及托管的主域名均正常,权威本身也存在这条具体的域名记录,但是没有对应的记录类型(不包含CNAME,CNAME是特殊情况,可以响应任意类型的请求),这是权威返回了NOERROR,值的注意的是这个NOERROR的报文中没有ANSWER SECTION。但是会包含一个AUTHORITY SECTION,内容为改主域名的SOA记录,这个应答结果会在递归服务器中被缓存,缓存时间周期为域名的SOA记录的TTL。
5、还有最后的一种情况,就是递归服务器本身不响应了,这个比较容易理解,如果递归服务器不响应,那么请求段收不到任何应答,这个时候请求端终端如果有超时机制则会跑出一个dns请求 timeout的结果。
结论
总体上小编看到,递归DNS解析失败有着多种可能的因素。有了这张神图,老板再也不怕小编域名解析失败了。