服务器之家:专注于服务器技术及软件下载分享
分类导航

云服务器|WEB服务器|FTP服务器|邮件服务器|虚拟主机|服务器安全|DNS服务器|服务器知识|Nginx|IIS|Tomcat|

香港云服务器
服务器之家 - 服务器技术 - DNS服务器 - DNS故障诊断及问题分析示例

DNS故障诊断及问题分析示例

2021-11-25 22:13运维派 DNS服务器

有一些场景会导致访问 DNS 服务不稳定,例如 DNS 服务器的设置有问题、网络有丢包、主机 DNS 配置错误等等。我们接下来查看几种 case。

DNS故障诊断及问题分析示例

1、DNS 基础知识

互联网基于 TCP/IP 协议。为了方便管理网络内的主机,整个互联网分为若干个域 (domain),每 个域又可以再分为若干个子域,例如,.com,.org,.edu 都是顶级域,而 google.com 是.com 下面的子域。

网络中的任意一台主机(host)都会属于某个域,并且有自己的名字,称为主机名( hostname)。例如 example.com 就是.com 域中一台主机名为 example.com(或 example,hostname 和 domain name 的区别,见这里 )的主机。

域名/主机名是为了方便人记忆,而机器之间通信最终用的还是 IP 地址,因此需要一个将主 机名(域名)转换成 IP 地址的服务。域名服务系统(DNS, domain name system)做的就是 这个事情,对应的服务器称为域名服务器(Domain Name Server)。

例如,当通过浏览器访问 example.com,浏览器会首先访问 DNS 服务器,查找 example.com 对应的 IP 地址,然后和这个 IP 建立 TCP 连接,接下来才发起 HTTP 请求。

一个域名可以对应一个 IP 地址,也可以对应多个。对于后者,DNS 服务算法会从中选择一个 地址返回。大部分网络服务为了实现高可用,都是对应多个地址,我们后面会看到, baidu.com 就对应多个 IP。

有一些场景会导致访问 DNS 服务不稳定,例如 DNS 服务器的设置有问题、网络有丢包、主机 DNS 配置错误等等。我们接下来查看几种 case。

2、准备测试环境

为方便大家跟着上手练习,本文将搭建一个容器环境。

Pull Docker 镜像:

  1. $ sudo docker pull alpine:3.8

运行容器,注意这里一定要带--privileged 参数 [2],否则后面的部分 tc 命令无法执行:

  1. $ sudo docker run -d --privileged --name ctn-1 alpine:3.8 sleep 3600d
  2. $ sudo docker ps
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. 233bc36bde4b alpine:3.8 "sleep 3600d" 1 minutes ago Up 14 minutes ctn-1

进入容器:

  1. $ sudo docker exec -it ctn-1 sh

查看容器网络信息:

  1. / # ifconfig
  2. eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:09
  3. inet addr:172.17.0.9 Bcast:0.0.0.0 Mask:255.255.0.0

3、DNS 配置

3.1 查看 DNS 配置

Linux 上的 DNS 配置在/etc/resolv.conf 里面。我们先来查看容器的配置:

  1. / # cat /etc/resolv.conf
  2. # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
  3. # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
  4. nameserver 192.168.1.11
  5. nameserver 192.168.1.12

这其实是继承了宿主机的 DNS 配置,在宿主机上执行 cat /etc/resolv.conf 会看到一样的 结果。

3.2 修改 DNS 配置

可以通过修改/etc/resolv.conf 里面的 nameserver 来配置自己想用的 DNS 服务器。例如内网环境可能都会使用自己的 DNS 服务器,因为它除了 提供内网域名解析之外,公网域名解析也会比较快(相比于网络供应商的公网 DNS 服务器) 。

4、DNS 问题排查

本节模拟几种导致 DNS 查询变慢的场景,如果在实际环境中遇到类似现象,可以考虑往这些 方向排查。

4.1 机器未配置 DNS 导致域名查找失败

  • 现象:网络是通的(例如 ping IP 通),但是 DNS 查询总是失败
  • 可能的原因:机器没有配置 DNS 服务器
  • 解决办法:修改/etc/resolv.conf,给机器配置合适的 DNS 服务器 有时新启动的机器(不管是物理机、虚拟机还是容器)没有设置 DNS,导致访问域名不通。我们来复现一下。

在正常的容器里用 nslookup 工具查看域名对应的 IP 地址:

  1. / # nslookup example.com
  2. Name: example.com
  3. Address 1: 93.184.216.34
  4. Address 2: 2606:2800:220:1:248:1893:25c8:1946

可以看到,我们获取到了该域名一个 IPv4 地址和一个 IPv6 地址。

将/etc/resolv.conf 里的 DNS 服务器列表用#注释掉,模拟没有配置 DNS 服务器的场景。

再次测试:

  1. / # nslookup example.com
  2. nslookup: can't resolve 'example.com': Try again

所以遇到这种问题,可以先去排查/etc/resolv.conf 里面是否配置了 DNS 服务器。

4.2 DNS 服务太慢

  • 现象:DNS 查询太慢
  • 可能的原因:配置的 DNS 服务器不合理
  • 解决办法:修改/etc/resolv.conf,配置合适的 DNS 服务器

每个公司一般都有自维护的 DNS 服务器,不仅用来解析内网 DNS,而且可以加速解析公网域名 。

dig 是另外一个功能更强大的 DNS 查询工具,安装:

  1. / # apk update && apk add bind-tools

首先查看使用内网 DNS,查询域名的延迟:

  1. / # dig example.com
  2. ...
  3. example.com. 15814 IN A 93.184.216.34
  4. ;; Query time: 0 msec
  5. ;; SERVER: 192.168.1.11#53(192.168.1.11)

可以看到非常快,在 1ms 以内。

然后我们测试如果使用 Google 的公网 DNS 服务器 8.8.8.8 [1],延迟会是多少。

修改/etc/resolv.conf,将其他 nameserver 注释掉,添加一行 nameserver 8.8.8.8。

再次测试:

  1. / # dig example.com
  2. ...
  3. example.com. 15814 IN A 93.184.216.34
  4. ;; Query time: 150 msec
  5. ;; SERVER: 8.8.8.8#53(8.8.8.8)

延迟变成了 150ms,比原来大了 150 多倍。

因此,对于 DNS 查询特别慢的场景,首先要查看配置的 DNS 服务器是否合理。

4.3 hardcode /etc/hosts 导致跳过 DNS 查询

  • 现象:某域名访问太慢、某域名总是指向相同 IP(多 IP 情况下)、特定机器不可访问 某域名等等
  • 可能的原因:/etc/hosts 有 hardcode 域名及 IP
  • 解决办法:修改/etc/hosts

前面提到,大部分公网域名都对应多个 IP 地址,因此每次 DNS 查询拿到的 IP 地址都可能不一 样,我们用 ping 来测试一下:

  1. / # ping baidu.com
  2. PING baidu.com (220.181.57.216): 56 data bytes
  3. 64 bytes from 220.181.57.216: seq=0 ttl=45 time=26.895 ms
  4. 64 bytes from 220.181.57.216: seq=1 ttl=45 time=26.701 ms
  5. ^C
  1. / # ping baidu.com
  2. PING baidu.com (123.125.115.110): 56 data bytes
  3. 64 bytes from 123.125.115.110: seq=0 ttl=43 time=27.587 ms
  4. 64 bytes from 123.125.115.110: seq=1 ttl=43 time=27.757 ms
  5. ^C

可以看到,两次 ping 测试(内部首先查询 baidu.com 对应的 IP 地址)拿到的 IP 地址是不一样 的。用 nslookup 可以看到它们都是 baidu.com 对应的 IP 地址:

  1. / # nslookup baidu.com
  2. Name: baidu.com
  3. Address: 220.181.57.216
  4. Name: baidu.com
  5. Address: 123.125.115.110

/etc/hosts 里面可以直接 harcode 一个域名对应的 IP 地址,这会导致机器跳过 DNS 查询,直接拿这个 IP 作 为该域名的 IP。我们来验证一下。

修改/etc/hosts,添加一行 123.125.115.110 baidu.com,再次 ping 测试

  1. / # ping baidu.com
  2. PING baidu.com (123.125.115.110): 56 data bytes
  3. 64 bytes from 123.125.115.110: seq=0 ttl=43 time=27.861 ms
  4. ^C
  5. --- baidu.com ping statistics ---
  6. 1 packets transmitted, 1 packets received, 0% packet loss
  7. round-trip min/avg/max = 27.861/27.861/27.861 ms
  8. / # ping baidu.com
  9. PING baidu.com (123.125.115.110): 56 data bytes
  10. 64 bytes from 123.125.115.110: seq=0 ttl=43 time=27.614 ms
  11. ^C

这是不管执行多少次,baidu.com 对应的 IP 地址都不会变了。而实际上,这个 IP 地址并不一定是最优的 IP 地址,甚至有可能这 个 IP 不可用,导致访问 baidu.com 失败。因此,实际中要极力避免在/etc/hosts 中 hardcode。

4.4 DNS 查询不稳定

  • 现象:DNS 查询不稳定,时快时慢
  • 可能的原因:机器上有 tc 或 iptables 规则,导致到 DNS 服务器的 packet 变慢或丢失
  • 解决办法:修改或删除 tc/iptables 规则

我们用 tc 来模拟网络延迟:

  1. / # apk add iproute2

首先查看有没有 tc 规则:

  1. / # tc -p qdisc ls dev eth0

默认没有任何规则。

然后我们加一条:每个 packet 延迟 600ms:

  1. / # tc qdisc add dev eth0 root netem delay 600ms
  2. / # tc -p qdisc ls dev eth0
  3. / # qdisc netem 8001: root refcnt 2 limit 1000 delay 600.0ms

测试:

  1. / # dig example.com
  2. ...
  3. example.com. 15814 IN A 93.184.216.34
  4. ;; Query time: 600 msec
  5. ;; SERVER: 192.168.1.11#53(192.168.1.11)

可以看到,DNS 查询变成了 600ms。

这里我们测试的是固定延迟,这种问题很容易发现。我们还可以测试随机延迟,或者按 比例延迟等 [2]:

  1. / # tc qdisc change dev eth0 root netem delay 600ms 10ms 25%
  2. / # tc qdisc change dev eth0 root netem delay 600ms 20ms distribution normal

此类规则会导致 DNS 查询速度更有随机性。

最后删除 tc 规则:

  1. / # tc qdisc del dev eth0 root

iptables 规则也会导致类似的问题。

很多软件在运行之后,会在宿主机上添加 tc 或 iptables 规则,例如 OpenStack,K8S 等等 。因此遇到这种随机延迟问题,首先可以查看机器上是否有 tc 或 iptables 规则。

4.5 DNS 反向查询不稳定

线上遇到过这样一个问题:从一台机器 ping 一个内网域名,每个 ping 包看起来都会卡 5 ~ 30s 不等,但是 CTL-C 关闭 ping 之后,打印出来的统计信息里,既没有丢包,ping 的延迟也很低 (毫秒级),这就很奇怪。接下来:

  • dig,很快,毫秒级,说明 DNS 查询没有问题
  • dig 能看到域名对应的 IP,直接 ping 这个 IP,发现是没有卡顿的
  • 仍然 ping 域名,用 tcpdump 抓包,tcpdump -i eth0 hostand icmp,发现 ping 包都是立即响应的,印证了统计信息里,ping 延迟很低的事实

根据以上信息,说明 ping 卡顿的问题出在这台机器,而且应该就是 ping 程序本身在做什么耗 时的操作。继续:

  • 仍然 ping 域名,同时,用 ltrace -p跟踪 ping 进程,发现卡在一个叫 gethostbyaddr()的函数
  • 查阅文档,发现这个函数是根据 IP 反向查询 hostname,需要和 DNS 交互

到这里,基本确定了是 DNS 服务器反向查询的问题,我们用另外几个命令行工具验证一下, 以下三个命令都是根据 IP 反查 hostname:

  1. nslookup
  2. host
  3. dig -x

果然,以上三个命令都会卡住。修改/etc/resolv.conf,换一个 DNS 服务器之后,问题 消失了。接下来,就去查 DNS 服务器的问题吧。

原文链接:https://mp.weixin.qq.com/s/0TKSCkTS8CFq3p9Ue22P7A

延伸 · 阅读

精彩推荐
  • DNS服务器域名注册dns轮循

    域名注册dns轮循

    域名注册 DNS 轮循 概述 域名系统(Domain Name System,简称 DNS)是互联网上的一种约定和规范,用于将域名转换为 IP 地址,以便计算机能够识别和访问网站或...

    未知1422023-10-24
  • DNS服务器GoDaddy设置域名服务器(NS)最新教程

    GoDaddy设置域名服务器(NS)最新教程

    有时候我们在GoDaddy注册域名后,想通过第三方来解析域名,那么我们可以通过更改GoDaddy的域名服务器(NS)来实现。今天,小编就给大家介绍下如何修改域名...

    idcspy9172020-10-15
  • DNS服务器腾讯云服务器秒杀dns

    腾讯云服务器秒杀dns

    腾讯 云服务器 秒杀DNS 一、引言 随着互联网的快速发展,云计算技术成为了各行各业的热点,而在众多云计算服务提供商中, 腾讯云 凭借其稳定可靠的性...

    未知1492023-10-23
  • DNS服务器DNS服务器可能不可用怎么修复

    DNS服务器可能不可用怎么修复

    手机和电脑是我们经常使用的智能处理设备,熟练掌握操作技能能帮助我们更好的娱乐生活。你知道DNS服务器可能不可用怎么修复吗?快来看看吧!...

    百度经验9192020-05-04
  • DNS服务器百度云服务器dns

    百度云服务器dns

    百度 云服务器 DNS:解析无限的可能性 引言:随着云计算技术的发展,云服务器已经成为了企业和个人在互联网领域中的首选之一。在这其中, 百度云服务...

    未知1652023-07-31
  • DNS服务器云服务器ddos高防dns

    云服务器ddos高防dns

    云服务器 ddos高防 DNS 在互联网时代,Distributed Denial of Service(DDoS)攻击已成为安全领域最严重的威胁之一。DDoS攻击一般是通过利用大量计算机或设备来向目...

    未知1842023-05-10
  • DNS服务器无法修改域名dns-域名及账户问题

    无法修改域名dns-域名及账户问题

    问:修改成图上显示的内容,直接提示错误,无法修改域名dns 答:您好,已为您处理,目前域名使用的是我司默认dns, 若需要修改其他dns请您再重试下,非常...

    未知1672023-07-03
  • DNS服务器百度云服务器dns解析失败

    百度云服务器dns解析失败

    百度 云服务器 是百度推出的云计算服务平台,为企业和个人提供弹性、稳定、安全的云服务器。然而,就像其他任何服务提供商一样, 百度云服务器 也有...

    未知1142023-08-19
1177