DNS:DNS问题故障排查
1写在前面
-
分享一些 DNS 排故的笔记给小伙伴 -
博文内容涉及 DNS 解析顺序,常见排故顺序 -
理解不足小伙伴帮忙指正
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
2排故DNS问题
名称解析遇到问题时,应考虑从以下几点来解决:
-
客户端上 /etc/hosts
和/etc/resolv.conf
-
客户端使用的 缓存名称服务器
的操作 -
向缓存名称服务器提供数据的 权威名称服务器
的操作 -
权威名称服务器上的数据 -
用于在这些系统之间通信的网络配置
DNS 解析顺序
DNS
是系统最常用的名称解析方法, 但DNS不是系统解析主机名和IP地址的唯一方法。/etc/nsswitch.conf
文件中的hosts行控制查找主机名的方式。hosts: files dns myhostname
[root@serverb ~]# cat /etc/nsswitch.conf | grep host
# hosts: files dns
# hosts: files dns # from user file
hosts: files dns myhostname
[root@serverb ~]#
files
:首先在本地 /etc/hosts
文件中查找,可以手动指定主机名与 IP 地址之间的映射关系。如果主机名在该文件中找到匹配项,系统将直接使用该 IP 地址,不进行 DNS 查询。
[root@serverb ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.254 classroom.example.com classroom
172.25.254.254 content.example.com content
172.25.254.254 materials.example.com materials
172.25.250.254 workstation.lab.example.com workstation
### rht-vm-hosts file listing the entries to be appended to /etc/hosts
172.25.250.254 bastion.lab.example.com bastion
172.25.250.9 workstation.lab.example.com workstation
172.25.250.10 servera.lab.example.com servera
172.25.250.11 serverb.lab.example.com serverb
172.25.250.12 serverc.lab.example.com serverc
172.25.250.13 serverd.lab.example.com serverd
[root@serverb ~]#
dns
:然后执行DNS域名解析查找/etc/resolv.conf
,如果在 /etc/hosts 文件中找不到匹配项,系统将使用 DNS 解析器进行域名解析。解析器会检查 /etc/resolv.conf 文件以获取 DNS 服务器的配置信息。
[root@serverb ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search lab.example.com example.com
nameserver 172.25.250.254
[root@serverb ~]#
-
search lab.example.com example.com
指定了DNS搜索域名,即在解析主机名时,会自动添加这些域名后缀。 -
nameserver 172.25.250.254
指定了DNS服务器的IP地址,即在解析主机名时,会向该IP地址的DNS服务器发送查询请求。如果第一个 DNS 服务器无法提供解析结果,解析器将尝试后续的 DNS 服务器,直到找到匹配的解析结果或遍历完所有配置的 DNS 服务器
myhostname
:最后使用查找本地配置
的系统主机名
,表示系统将使用本地主机名来解析主机名。本地主机名可以通过 /etc/hostname 文件或通过网络配置获得。使用 myhostname 关键字时,系统将尝试将主机名解析为本地主机名的 IP 地址。
模拟普通应用程序 DNS 解析过程
glibc-common
软件包中的 getent
命令,会按照/etc/nsswitch.conf
所指定的主机名称解析顺序执行名称解析。这种解析过程也是大多数应用程序解析的过程
。
使用方式
root@servera ~]# getent hosts classroom.example.com
172.25.254.254 classroom.example.com classroom
对 servera.blog.liruilong.com
进行解析,没有得到任何信息
[root@serverb ~]# getent hosts servera.blog.liruilong.com
在 /etc/hosts
文件添加,解析成功
[root@serverb ~]# echo "192.168.0.10 servera.blog.liruilong.com" >> /etc/hosts
[root@serverb ~]# getent hosts servera.blog.liruilong.com
192.168.0.10 servera.blog.liruilong.com
[root@serverb ~]#
通过域名解析工具可以正常解析,这里我们指定了解析的 DNS 服务器
[root@serverb ~]# host servera.blog.liruilong.com 172.25.250.11
Using domain server:
Name: 172.25.250.11
Address: 172.25.250.11#53
Aliases:
servera.blog.liruilong.com has address 172.25.250.10
如何没有指定,则提示解析失败
[root@serverb ~]# dig servera.blog.liruilong.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el8 <<>> servera.blog.liruilong.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 14280
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: e53c16c7ad16ce3a13c1014064c684340c193df2aea1f352 (good)
;; QUESTION SECTION:
;servera.blog.liruilong.com. IN A
;; Query time: 1205 msec
;; SERVER: 172.25.250.254#53(172.25.250.254)
;; WHEN: Sun Jul 30 23:39:32 CST 2023
;; MSG SIZE rcvd: 83
status
: SERVFAIL表示DNS服务器返回了SERVFAIL的错误状态码,即无法处理该查询请求。
我们在 /etc/resolv.conf
添加对应的 解析 DNS
服务器
[root@serverb ~]# vim /etc/resolv.conf
[root@serverb ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search lab.example.com example.com
nameserver 172.25.250.254
nameserver 172.25.250.11
[root@serverb ~]#
在次解析,解析成功
[root@serverb ~]# dig servera.blog.liruilong.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el8 <<>> servera.blog.liruilong.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1345
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 0b410e7fc0c1426dafcd22d864c684a68204bd8e1cf907f2 (good)
;; QUESTION SECTION:
;servera.blog.liruilong.com. IN A
;; ANSWER SECTION:
servera.blog.liruilong.com. 300 IN A 172.25.250.10
;; AUTHORITY SECTION:
blog.liruilong.com. 300 IN NS serverb.blog.liruilong.com.
;; ADDITIONAL SECTION:
serverb.blog.liruilong.com. 300 IN A 172.25.250.11
;; Query time: 1 msec
;; SERVER: 172.25.250.11#53(172.25.250.11)
;; WHEN: Sun Jul 30 23:41:26 CST 2023
;; MSG SIZE rcvd: 137
[root@serverb ~]# getent hosts servera.blog.liruilong.com
172.25.250.10 servera.blog.liruilong.com
[root@serverb ~]#
dig 默认解析的 A记录,并且默认使用 /etc/resolv.conf
配置的 DNS 进行查询,如果 getent
的结果与 dig
产生的结果不同,则可以清楚地表明,是 DNS
以外的其他原因导致了意外的名称解析结果,即 DNS 的解析结果 可能和 /etc/hosts
的结果不同。
网络连接问题
为了使DNS名称解析正常工作,客户端必须能够与解析名称服务器正常通行,当然解析名称服务器与其他权威名称服务器正常通信。
例如: dig无法到达 /etc/resolv.conf
中的任何DNS服务器,则会发生以下错误
[root@serverb ~]# dig blog.liruilong.com A @8.8.8.8
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el8 <<>> blog.liruilong.com A @8.8.8.8
;; global options: +cmd
;; connection timed out; no servers could be reached
[root@serverb ~]# dig blog.liruilong.com A @114.114.114.114
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el8 <<>> blog.liruilong.com A @114.114.114.114
;; global options: +cmd
;; connection timed out; no servers could be reached
可能的原因
: 名称服务器已关闭,客户端上的网络或防火墙出现问题或/etc/resolv.conf
的配置错误。
[root@serverb ~]# ping -c3 114.114.114.114
PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data.
From 172.25.252.254 icmp_seq=1 Destination Net Unreachable
From 172.25.252.254 icmp_seq=2 Destination Net Unreachable
From 172.25.252.254 icmp_seq=3 Destination Net Unreachable
--- 114.114.114.114 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 7ms
[root@serverb ~]#
如果涉及防火墙,则必须确保客户端可以与名称服器UDP和TCP上53端口通信
。 如果名称服务器只允许端口53/UDP
上的流量通过,不允许端口53/TCP
上的流量通过,则当响应的大小超过512字节 (支持DNS扩展机制 (EDNS) 的服务器为4096字节)
时,解析器必须从UDP切换到TCP并重试查询
,您会看到截断通知以及主机无法访问的错误:
[root@servera ~]# dig @dns.example.com A labhost1.example.com
;; Truncated, retrying in TCP mode.
;; Connection to 172.25.1.11#53(172.25.1.11) for labhost1.example.com failed:
host unreachable.
dig
命令可以指定tcp或vc
选项,强制使用TCP查询记录,而不是默认行为: 先使用UDP,然后仅对于大响应才使用TCP
[root@servera ]~# dig +tcp A example.com
DNS 响应代码说明
NOERROR
表示查询成功
[root@serverb ~]# dig A servera.blog.liruilong.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el8 <<>> A servera.blog.liruilong.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 173
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: d12897e63585d13c02dc879064c68b93e0350fa4cb0b5e22 (good)
;; QUESTION SECTION:
;servera.blog.liruilong.com. IN A
;; ANSWER SECTION:
servera.blog.liruilong.com. 300 IN A 172.25.250.10
;; AUTHORITY SECTION:
blog.liruilong.com. 300 IN NS serverb.blog.liruilong.com.
;; ADDITIONAL SECTION:
serverb.blog.liruilong.com. 300 IN A 172.25.250.11
;; Query time: 1 msec
;; SERVER: 172.25.250.11#53(172.25.250.11)
;; WHEN: Mon Jul 31 00:10:59 CST 2023
;; MSG SIZE rcvd: 137
[root@serverb ~]#
SERVFAIL
:伺服失败,名称服务器在处理查询时遇到问题。
[root@serverb ~]# dig A liruilong.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el8 <<>> A liruilong.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 5501
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: c5abce0d58f38ad379ab40ba64c68b5468a9b60530e59887 (good)
;; QUESTION SECTION:
;liruilong.com. IN A
;; Query time: 7 msec
;; SERVER: 172.25.250.254#53(172.25.250.254)
;; WHEN: Mon Jul 31 00:09:56 CST 2023
;; MSG SIZE rcvd: 70
NXDOMAIN
: 查询的名称不存在于区域中。
┌──[hp@hp-ProLiant-SL270s-Gen8-SE]-[~]
└─$dig liruilong.com A
; <<>> DiG 9.18.12-0ubuntu0.22.04.2-Ubuntu <<>> liruilong.com A
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 45394
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;liruilong.com. IN A
;; AUTHORITY SECTION:
com. 570 IN SOA a.gtld-servers.net. nstld.verisign-grs.com. 1690734225 1800 900 604800 86400
;; Query time: 184 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Sun Jul 30 12:24:18 EDT 2023
;; MSG SIZE rcvd: 115
SERVFAIL和NXDOMAIN
是DNS服务器返回的两种不同的响应状态码,它们分别表示以下情况:
-
SERVFAIL
表示DNS服务器无法处理该查询请求,通常是由于服务器故障、网络问题或其他错误导致的。这种情况下,DNS服务器没有返回任何答案、授权或附加信息。 -
NXDOMAIN
表示DNS服务器已经处理了该查询请求,但无法找到与查询请求匹配的域名记录。这种情况下,DNS服务器返回了一个包含授权信息的响应,但没有任何答案记录。
因此,SERVFAIL和NXDOMAIN的区别在于,前者表示DNS服务器无法处理查询请求,而后者表示DNS服务器已经处理了查询请求,但没有找到匹配的记录
REFUSED
:由于策略限制,名称服务器拒绝了客户端的DNS请求。
[root@serverb ~]# dig A servera.blog.liruilong.com @serverc
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el8 <<>> A servera.blog.liruilong.com @serverc
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 25684
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 1914c2b482142e19fd901ec464c68ff64f464af36f2bcff4 (good)
;; QUESTION SECTION:
;servera.blog.liruilong.com. IN A
;; Query time: 3 msec
;; SERVER: 172.25.250.12#53(172.25.250.12)
;; WHEN: Mon Jul 31 00:29:42 CST 2023
;; MSG SIZE rcvd: 83
[root@serverb ~]#
[root@serverc ~]# cat /etc/named.conf | grep allow
allow-query { localhost;172.25.250.254; 192.168.0.0/24; };
[root@serverc ~]#
跟踪 DNS 查询
通过 dig +trace
命令可以跟踪 DNS 解析过程
┌──[hp@hp-ProLiant-SL270s-Gen8-SE]-[~]
└─$dig +trace liruilongs.github.io
; <<>> DiG 9.18.12-0ubuntu0.22.04.2-Ubuntu <<>> +trace liruilongs.github.io
;; global options: +cmd
. 7105 IN NS e.root-servers.net.
. 7105 IN NS f.root-servers.net.
. 7105 IN NS a.root-servers.net.
. 7105 IN NS m.root-servers.net.
. 7105 IN NS g.root-servers.net.
. 7105 IN NS h.root-servers.net.
. 7105 IN NS i.root-servers.net.
. 7105 IN NS c.root-servers.net.
. 7105 IN NS d.root-servers.net.
. 7105 IN NS j.root-servers.net.
. 7105 IN NS b.root-servers.net.
. 7105 IN NS l.root-servers.net.
. 7105 IN NS k.root-servers.net.
;; Received 239 bytes from 127.0.0.53#53(127.0.0.53) in 0 ms
io. 172800 IN NS c0.nic.io.
io. 172800 IN NS a2.nic.io.
io. 172800 IN NS a0.nic.io.
io. 172800 IN NS b0.nic.io.
io. 86400 IN DS 57355 8 2 95A57C3BAB7849DBCDDF7C72ADA71A88146B141110318CA5BE672057 E865C3E2
io. 86400 IN RRSIG DS 8 1 86400 20230812140000 20230730130000 11019 . PQxqrG5/DAsu9RBIZN4Ol4lzzGkMBzyDxsC0lI+l8HDz5qTocF2tx8+F CYOeqJ235GhJI6cqMs0qFSMd9yHKupIllXOvrIBTgcJ/a8hoyXxoWyQL iwFJ8lj3+Wc3VSdHGvkqWYMZ52Ny9orne3zqTOzpGV1xtyxAiw+a9h92 hufkRTmoki6jMdiIFlVhQIHzqtc4MY/HmuUhOjbn0/b3432XAeeJx+uw sRqaFgs6K//QdvllYATpgnXoZ2RdgJuIsmEF1HfDY2vg+O3y4DMW4htU EkQiBqHx6aVPCAaCK5nkp7UEzZfgfhkugxGl1ikxaXn0mBt8awkkCIaa H9l2rw==
;; Received 636 bytes from 202.12.27.33#53(m.root-servers.net) in 68 ms
;; UDP setup with 2a01:8840:9e::17#53(2a01:8840:9e::17) for liruilongs.github.io failed: network unreachable.
;; UDP setup with 2a01:8840:9e::17#53(2a01:8840:9e::17) for liruilongs.github.io failed: network unreachable.
;; UDP setup with 2a01:8840:9e::17#53(2a01:8840:9e::17) for liruilongs.github.io failed: network unreachable.
;; communications error to 65.22.160.17#53: timed out
github.io. 3600 IN NS dns1.p05.nsone.net.
github.io. 3600 IN NS dns2.p05.nsone.net.
github.io. 3600 IN NS dns3.p05.nsone.net.
github.io. 3600 IN NS ns-692.awsdns-22.net.
github.io. 3600 IN NS ns-1622.awsdns-10.co.uk.
0d790076pp5pfktg2hrthj5bj6ckckcb.io. 3600 IN NSEC3 1 1 10 332539EE7F95C32A 0D7N522D3BFMA1LA01BUIOBUK6MROGMU NS SOA RRSIG DNSKEY NSEC3PARAM
0d790076pp5pfktg2hrthj5bj6ckckcb.io. 3600 IN RRSIG NSEC3 8 2 3600 20230820161400 20230730151400 47703 io. eJVfgk+RJy6pJULS8AGI5vdwg5l5aheH3AXAAEedhWaDV2RZ5wkjG55M NnnWLDfRYPSCJjQwlDeYLqxLbwcIZVKFYAI2bGcMp5gwF+3N8GKobO0J fufmVtT2feylQnFVC414+dRVmfswmycKiVqYz+R5evDJVvlba47Nw2jk +uw=
0jehpe7obc68rhh4ntet0u9o44qmosmo.io. 3600 IN NSEC3 1 1 10 332539EE7F95C32A 0JES1F5OD9SG1E4CCRGBS865PMBUV4PC NS DS RRSIG
0jehpe7obc68rhh4ntet0u9o44qmosmo.io. 3600 IN RRSIG NSEC3 8 2 3600 20230815155455 20230725145455 47703 io. YGikk+waO8SYkaBCCNiFjRwXRmjJWGhfk7g1iTAPUz3a8WHtZ/MJSjMc uQPhpbfl7h2Bq0//Gcl657brOnAGL4/pa8Bo0gyWhDLQDPGQe+DNPm+t LFNAd4V/oJw747ch2bAJW4U+zSkCmY/WVlCwuht82Z37mMrRRilt7HZ9 UnQ=
;; Received 686 bytes from 65.22.162.17#53(c0.nic.io) in 120 ms
;; UDP setup with 2600:9000:5306:5600::1#53(2600:9000:5306:5600::1) for liruilongs.github.io failed: network unreachable.
;; UDP setup with 2620:4d:4000:6259:7:5:0:1#53(2620:4d:4000:6259:7:5:0:1) for liruilongs.github.io failed: network unreachable.
liruilongs.github.io. 3600 IN A 185.199.108.153
liruilongs.github.io. 3600 IN A 185.199.109.153
liruilongs.github.io. 3600 IN A 185.199.110.153
liruilongs.github.io. 3600 IN A 185.199.111.153
;; Received 113 bytes from 198.51.44.69#53(dns3.p05.nsone.net) in 48 ms
根据dig命令的输出结果,可以看出在查询名为liruilongs.github.io
的主机名时,返回了一个包含以下信息的响应:
status: NOERROR
表示DNS服务器成功处理了该查询请求。 ANSWER: 4
表示DNS服务器返回了4个答案。
Zone数据问题
有时,名称解析问题是由于权威名称服务器上区域中错误配置引起的。
-
负响应(缓存的影响) -
得到不同的答案: DNS轮询,DNS负载均衡
DNS轮询是一种负载均衡的技术,可以将客户端的请求分配到多个服务器中,从而提高系统的可用性和性能。
在DNS服务器上创建多个A记录,每个记录对应一个服务器的IP地址。例如,假设有3个服务器的IP地址分别为192.168.1.1、192.168.1.2和192.168.1.3,则需要在DNS服务器上创建3个A记录,分别对应这些IP地址。
针对每个A记录,设置相同的域名和TTL值,以确保客户端每次查询时都会得到相同的结果。
在BIND DNS服务器中,可以使用round-robin
关键字启用轮询功能
编辑BIND配置文件,并在example.com区域中添加以下行:
zone "example.com" {
type master;
file "example.com.zone";
rrset-order { random; };
};
在该区域中添加rrset-order
选项,并将其设置为random或cyclic。其中,random表示随机轮询,cyclic表示顺序轮询。
-
反向查询失败
: 缺少PTR记录,No PTR record found: 表示DNS服务器未找到与该IP地址对应的PTR记录 -
获取记录不存在的响应 -
名称中看到两次 FQDN
以及相关错误(.
为 当前zong,如果不加会默认加上) -
识别循环的 CNAME
记录 -
从权威服务器获得不同的答案
3博文部分内容参考
© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知
<RH358 授课课堂笔记>
© 2018-2023 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)
- 点赞
- 收藏
- 关注作者
评论(0)