0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

5种最常见的DNS故障诊断及问题处理方法

dyquk4xk2p3d 来源:云原生技术爱好者社区 2023-07-10 10:53 次阅读

本文转载自:「云原生技术爱好者社区」

原文:https://tinyurl.com/6c3anmaj,版权归原作者所有

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 镜像:

$sudodockerpullalpine:3.8

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

$sudodockerrun-d--privileged--namectn-1alpine:3.8sleep3600d
$sudodockerps
CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
233bc36bde4balpine:3.8"sleep3600d"1minutesagoUp14minutesctn-1

进入容器:

$sudodockerexec-itctn-1sh

查看容器网络信息

/#ifconfig
eth0Linkencap:EthernetHWaddr02AC00:09
inetaddr:172.17.0.9Bcast:0.0.0.0Mask:255.255.0.0

3 DNS 配置

3.1 查看 DNS 配置

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

/#cat/etc/resolv.conf
#Dynamicresolv.conf(5)fileforglibcresolver(3)generatedbyresolvconf(8)
#DONOTEDITTHISFILEBYHAND--YOURCHANGESWILLBEOVERWRITTEN
nameserver192.168.1.11
nameserver192.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 地址:

/#nslookupexample.com

Name:example.com
Address1:93.184.216.34
Address2:260622024825c8:1946

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

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

再次测试:

/#nslookupexample.com

nslookup:can'tresolve'example.com':Tryagain

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

4.2 DNS 服务太慢

现象:DNS 查询太慢

可能的原因:配置的 DNS 服务器不合理

解决办法:修改/etc/resolv.conf,配置合适的 DNS 服务器

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

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

/#apkupdate&&apkaddbind-tools

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

/#digexample.com
...
example.com.15814INA93.184.216.34

;;Querytime:0msec
;;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。

再次测试:

/#digexample.com
...
example.com.15814INA93.184.216.34

;;Querytime:150msec
;;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 来测试一下:

/#pingbaidu.com
PINGbaidu.com(220.181.57.216):56databytes
64bytesfrom220.181.57.216:seq=0ttl=45time=26.895ms
64bytesfrom220.181.57.216:seq=1ttl=45time=26.701ms
^C
/#pingbaidu.com
PINGbaidu.com(123.125.115.110):56databytes
64bytesfrom123.125.115.110:seq=0ttl=43time=27.587ms
64bytesfrom123.125.115.110:seq=1ttl=43time=27.757ms
^C

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

/#nslookupbaidu.com
Name:baidu.com
Address:220.181.57.216
Name:baidu.com
Address:123.125.115.110

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

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

/#pingbaidu.com
PINGbaidu.com(123.125.115.110):56databytes
64bytesfrom123.125.115.110:seq=0ttl=43time=27.861ms
^C
---baidu.compingstatistics---
1packetstransmitted,1packetsreceived,0%packetloss
round-tripmin/avg/max=27.861/27.861/27.861ms
/#pingbaidu.com
PINGbaidu.com(123.125.115.110):56databytes
64bytesfrom123.125.115.110:seq=0ttl=43time=27.614ms
^C

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

4.4 DNS 查询不稳定

现象:DNS 查询不稳定,时快时慢

可能的原因:机器上有 tc 或 iptables 规则,导致到 DNS 服务器的 packet 变慢或丢失

解决办法:修改或删除 tc/iptables 规则

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

/#apkaddiproute2

首先查看有没有 tc 规则:

/#tc-pqdisclsdeveth0

默认没有任何规则。

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

/#tcqdiscadddeveth0rootnetemdelay600ms

/#tc-pqdisclsdeveth0
/#qdiscnetem8001:rootrefcnt2limit1000delay600.0ms

测试:

/#digexample.com
...
example.com.15814INA93.184.216.34

;;Querytime:600msec
;;SERVER:192.168.1.11#53(192.168.1.11)

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

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

/#tcqdiscchangedeveth0rootnetemdelay600ms10ms25%
/#tcqdiscchangedeveth0rootnetemdelay600ms20msdistributionnormal

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

最后删除 tc 规则:

/#tcqdiscdeldeveth0root

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:

nslookup

host

dig -x

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





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux系统
    +关注

    关注

    4

    文章

    591

    浏览量

    27353
  • DNS
    DNS
    +关注

    关注

    0

    文章

    217

    浏览量

    19794
  • TCPIP协议
    +关注

    关注

    0

    文章

    35

    浏览量

    11924
  • 虚拟机
    +关注

    关注

    1

    文章

    908

    浏览量

    28090
  • CTl
    CTl
    +关注

    关注

    0

    文章

    6

    浏览量

    7429

原文标题:5 种最常见的 DNS 故障诊断及问题处理方法

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    LabVIEW在齿轮箱故障诊断中的应用

    LabVIEW强大数据处理和仿真能力,开发了一个先进的齿轮箱故障诊断系统。该系统主要采用小波包的独立分量分析(ICA)方法,有效地提取齿轮箱的故障特征频段。 在
    发表于 12-25 18:55

    分形特征的模拟电路故障诊断方法

    针对模拟电路中存在的非线性问题,提出一以模拟电路分形特征为输入量的故障诊断方法。通过对多测试分量数据进行分形特征提取,输入神经网络建立信息融合中心融合处理各分形特征量,利用多源性互补
    发表于 05-06 08:57

    电子电路故障诊断处理

    针对不同电力电子装置进行了研究,从故障诊断的特点与作用出发,利用科学的诊断方法,对其进行了有效的分析与处理,以此确保电力电子装置的正常运行,保证社会生产与社会活动的持续进行。
    发表于 04-24 13:39

    电子电路故障诊断处理

    针对不同电力电子装置进行了研究,从故障诊断的特点与作用出发,利用科学的诊断方法,对其进行了有效的分析与处理,以此确保电力电子装置的正常运行,保证社会生产与社会活动的持续进行。
    发表于 04-25 16:55

    模拟电路故障诊断中的特征提取方法

    析所具有的时频局部化特性、良好的去噪能力,无需系统模型结构的优势使之成为分析和处理此类信号的有效工具,也是目前在模拟电路故障诊断领域使用最多的一特征提取方法,对模拟电路中的软、硬
    发表于 12-09 18:15

    【下载】《模拟电路故障诊断

    检修的专著。作者Bob Pease是模拟电路设计界的传奇人物。在多年的实际工作中,他总结了一系列的技术与方法,大大提高了模拟电路诊断与检修的速度,把通常让人头疼的问题变得简单有趣。《模拟电路故障诊断
    发表于 10-20 17:56

    【转】电力电子电路故障诊断方法

    方法不再适用,只能以输出波形来诊断电力电子电路是否有故障及有何种故障故障诊断的关键是提取故障
    发表于 03-06 20:35

    传感器的故障分类与诊断方法

    方法和不依赖于数学模型的方法。 1、基于解析数学模型的方法根据残差产生的形式不同,基于解析数学模型的方法可以进一步分为:参数估计法、状态估计法和等价空间法。 基于模型的
    发表于 10-30 15:57

    基于电流测试的混合电路故障诊断

      摘要:在运用小波神经网络进行混合电路故障诊断的过程中,测试参数的选取至关重要。研究了一基于电流测试的故障诊断。该方法即通过PSPICE模拟电路的静态及动态电流信息,再通过小波神经
    发表于 11-05 15:50

    常见变频器故障诊断处理

    影响输出电压(即频率)的变化。修改该参数后故障消除。四、综述变频器的应用日趋广泛,其日常维护管理,故障诊断处理会经常遇到。本文对通用变频器的故障诊断
    发表于 10-17 07:29

    工业锅炉故障诊断的改进数据挖掘方法

    针对工业锅炉的常见故障,提出了一基于数据挖掘方法的锅炉故障诊断技术。通过建立一个智能化的数据挖掘工具,直接从大量实时数据中获取故障诊断知识
    发表于 01-11 14:28 13次下载

    模拟故障诊断中的容差处理方法

    基于斜率故障模型的故障诊断方法较好地解决了线性电路的软故障和硬故障诊断问题,是一很有价值的
    发表于 06-13 17:06 50次下载
    模拟<b class='flag-5'>故障诊断</b>中的容差<b class='flag-5'>处理</b><b class='flag-5'>方法</b>

    模拟电路故障诊断方法

    为了解决模拟电路故障诊断复杂多样难于辨识的问题, 有效提高分类的准确度, 提出了一模拟电路故障诊断的新方法
    发表于 03-30 16:10 55次下载
    一<b class='flag-5'>种</b>模拟电路<b class='flag-5'>故障诊断</b><b class='flag-5'>方法</b>

    数控系统常见故障诊断与维修方法有哪些

    本文首先介绍了数控系统的常见故障,其次介绍了数控系统常见故障及造成原因,最后介绍了数控系统故障诊断常用的8种方法
    发表于 11-04 10:23 9537次阅读

    晶闸管故障诊断方法

    晶闸管作为一重要的电力电子器件,在电力控制系统、工业电机驱动、可再生能源发电等领域广泛应用。然而,晶闸管在使用过程中可能会遇到各种故障,影响其正常工作。以下是对晶闸管故障诊断方法的详
    的头像 发表于 08-27 11:31 728次阅读