DNS:DNS问题故障排查

写在前面


  • 分享一些 DNS 排故的笔记给小伙伴
  • 博文内容涉及 DNS 解析顺序,常见排故顺序
  • 理解不足小伙伴帮忙指正

对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》


排故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记录
  • 从权威服务器获得不同的答案

博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知


https://www.isc.org/bind/


© 2018-2023 [email protected], All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

你可能感兴趣的:(服务管理与自动化,DNS)