在Linux和Unix上用Dig工具排除域名解析DNS故障


在实际应用过程中可能会遇到DNS解析错误的问题,就是说当我们访问一个域名时无法完成将其解析到IP地址的工作,而直接输入网站IP却可以正常访问,这就是因为DNS解析出现故障造成的
DNS不能解析的常见原因有:

域名本身已经过期或被停止;
域名的DNS服务器记录不正确;
域名的DNS服务器记录本身没有作解析;
域名的DNS服务器上named服务没有启动;
域名的DNS服务器上未解析;
域名的多个DNS服务器上的解析不一致;
域名的DNS服务器网络设置禁止了53端口TCP/UDP协议;
本地DNS cache未更新,与DNS服务器上的记录不同步
DNS的解析过程:
1) 首先查找本地DNS的cache,如果cache里有,且未超过服务器或域名本身定义的生存时间,则返回cache中的记录;
2) 如果cache中没有,或已过期,首先查询互联网根服务器如a.gtld-servers.net),找出该域名的DNS服务器是哪几个,如果查不到,返回错误;
3) 随机地从域名的DNS服务器中挑出一个,查出其IP地址,如果查不到,返回错误;
4) 连接到该IP地址的53端口UDP或TCP协议),查询域名,如果连接不上,或服务器未返回结果,则返回错误。
如何判断域名的DNS服务器记录不正确
在Linux/Unix上,可以使用dig工具

dig @a.gtld-servers.net upsdn.net

返回

; <<>> DiG 9.3.2-P1 <<>> @a.gtld-servers.net upsdn.net
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34265
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 8, ADDITIONAL: 8

;; QUESTION SECTION:
;upsdn.net. IN A

;; AUTHORITY SECTION:
upsdn.net. 172800 IN NS ns1.dnspod.net.
upsdn.net. 172800 IN NS ns1.everydns.net.
upsdn.net. 172800 IN NS ns2.dnspod.net.
upsdn.net. 172800 IN NS ns2.everydns.net.
upsdn.net. 172800 IN NS ns3.dnspod.net.
upsdn.net. 172800 IN NS ns3.everydns.net.
upsdn.net. 172800 IN NS ns4.dnspod.net.
upsdn.net. 172800 IN NS ns4.everydns.net.

;; ADDITIONAL SECTION:
ns1.dnspod.net. 172800 IN A 218.108.58.68
ns1.everydns.net. 172800 IN A 38.99.14.207
ns2.dnspod.net. 172800 IN A 60.195.249.161
ns2.everydns.net. 172800 IN A 216.218.240.206
ns3.dnspod.net. 172800 IN A 60.195.249.166
ns3.everydns.net. 172800 IN A 80.84.249.169
ns4.dnspod.net. 172800 IN A 61.129.70.142
ns4.everydns.net. 172800 IN A 63.219.183.200

;; Query time: 599 msec
;; SERVER: 192.5.6.30#53(192.5.6.30)
;; WHEN: Sun Sep 24 19:03:23 2006
;; MSG SIZE rcvd: 315

如果只有Question,没有Answer,那就有问题了
如何判断域名的DNS服务器记录本身有没有解析
域名的DNS服务器记录是一组特殊的主机名。这些DNS主机名必须要在Internic注册之后,才能用于域名注册。注册之后,通过whois能够查到,而且在互联网根服务器上会为注册的DNS服务器作解析。
以upsdn.com为例,他的dns服务器
Name Server: SENS01.DIG.COM
Name Server: SENS02.DIG.COM
Name Server: orNS01.DIG.COM
Name Server: orNS02.DIG.COM

都可以通过whois以及dig @a.gtld-servers.net查到。
为了保险起见,所有注册过的DNS服务器,同时也要在它本身的域名服务器上作A纪录的解析。否则,有的客户端可能不能正常工作。
如SENS01.DIG.COM本身在其自身的DNS服务器上也作了解析。
如果你注册了自己的DNS服务器,但没有为DNS服务器做解析,可能会出现解析不稳定的情况。
如何判断域名的DNS服务器上未解析
登陆到域名的DNS服务器上,执行:
dig @localhost upsdn.net

如果没有结果,可以看/etc/named.conf中有没有该域名的记录,以及记录中的zone文件是否存在,如果都存在,可以执行程序代码:
rndc reload abc.com

然后执行:
tail /var/log/messages

看log中有没有报错,有没有zone文件格式的问题。
如何判断域名的多个DNS服务器上的解析不一致
依次查询该域名的每个DNS服务器,看结果是否一致。在所有的服务器中,如果有的服务器没有返回结果,不会影响到域名的正常解析,因为此时解析客户端会尝试其他的服务器,只有当所有的服务器都没有结果才会报错。但是如果A服务器上和B服务器上的解析不一致,则会出现域名解析时对时不对的故障。
Dig @ns2.everydns.com upsdn.net
Dig @ns4.dnspod.net upsdn.net

如果不一致,通常是服务器之间的同步问题。
如何判断域名的DNS服务器网络设置是否正确
可以从其他机器分别以tcp和udp协议连接,如:
dig +tcp @ns4.dnspod.net upsdn.net
及
dig +notcp @ns4.dnspod.net upsdn.net

如果不能连接,而且服务器上named服务已经启动,多半是软件或硬件防火墙的原因。在服务器上检查/etc/sysconfig/ipchains或 iptable中是否允许domain53端口)的tcp及udp连接。或暂时停止ipchains/iptable服务,看外部是否能够连接。如果软件防火墙配置正确或根本未启动,则检查硬件防火墙有没有打开53端口。
如何判断本地DNS cache未更新
可以查出域名的DNS服务器,检查这些服务器上解析是否正确,如果服务器上正确,而本地解析不正确,则说明使用的本地DNS服务器没有刷新,需要等到它刷新之后。通常需要4到12个小时左右。

相关文章】

  • DNS在活动目录中的使用常见问题及解答

相关内容