【网络通信——DNS协议】你遇到过域名解析问题吗,如何分析和排查?

2022-11-02 2798阅读

温馨提示:这篇文章已超过650天没有更新,请注意相关的内容是否还可用!

​DNS劫持和DNS域名解析故障是生产环境中比较常见的DNS问题,而域名解析故障又是我们最常遇到到,它的产生原因也很多,比如DNS本地设置问题、缓存刷新不及时、域名供应商服务器错误,等等。我们排查这类问题最常用到的工具就是Dig工具以及nolookup命令。

【网络通信——DNS协议】你遇到过域名解析问题吗,如何分析和排查?
(图片来源网络,侵删)
【网络通信——DNS协议】你遇到过域名解析问题吗,如何分析和排查?
(图片来源网络,侵删)

如果你能回答出以上几个关键点,我相信你已经对DNS这块有所了解了,面试官也不会再难为你了,当然也有可能面试官继续问你,dig命令是用来查询什么的,输出记录中的CNAME记录和NS记录分别表示什么类型记录。如果咱们不清楚,不妨再继续往下阅读。

在2010年百度域名曾发生过域名劫持事件,当时在中国大陆地区和欧美部分地区无法正常访问百度首页,首页被篡改成黑色背景以及伊朗国旗,显示该网站已被伊朗网军入侵,然后跳转至英文雅虎主页。除了DNS劫持问题,在线上环境中,有时候还会出现域名解析慢或无法解析的问题,这会导致我们使用域名无法正常访问到目标网站,而使用IP地址又能访问,这就是域名解析故障。不过在弄清楚DNS劫持和DNS域名解析故障等问题之前,我们首先要理解DNS域名解析系统以及该系统的工作原理。

DNS的全称是Domain Name System,即域名系统。域名系统是互联网的一项域名解析服务,它将域名与IP地址相互映射到分布式数据库中,通过分段域名组合成一个分层分布式数据库,人们通过域名去到域名系统可以获取到对应目标机器的IP地址。

通常我们在开发或测试环境中会自定义一个假域名,通过绑定host(即在host文件中绑定域名和IP的映射关系),当我们访问假域名时,浏览器会首先通过host解析该域名的IP地址。

$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain
::1         localhost6 localhost6.localdomain6
192.168.0.1 domain.com

当在生产环境中,所有人都可以访问我们的网站,此时我们需要一个公共且唯一的域名,就需要通过目标服务器IP地址向域名注册商来申请注册一个公共域名。

为了保证公共域名的唯一性,因特网在命名的时候采用了层次结构的命名方法,即我们大家非常熟悉的xxx.xx.com的这种格式。每个xxx标号应该在63个字符之内,每个标号都可以看成一个层次的域名。级别最低的域名写在左边,级别最高的域名写在右边。

例如我们经常访问的谷歌域名, 分别有四级域名。其中com是顶级域名,google是二级域名,email是三级域名,www是四级域名,如下图所示:

根据域名的结构,由高向低进行层次划分,可将域名服务器分为以下几大类:

以上我们知道了域名是结构化的,而域名服务器则是按照域名结构分层进行管理,域名解析则是按照递归的方式由上而下,分别发送个每个层级的域名服务器,最终获取到域名的IP地址。

DNS 协议在 IOS网络分层或TCP/IP网络协议栈中属于应用层,传输协议则是基于 UDP 协议实现 ,并且域名服务器一般监听在端口 53 上。通常网络管理员会为我们的电脑或服务器动态或手动设置IP地址,除此之外,还需要设置DNS域名服务器地址,DNS也可以动态设置,每次上网时由网关分配,即DHCP机制;也可以手动设置,在linux系统中,DNS服务器的地址保存在/etc/resolv.conf文件中,国内默认DNS服务器地址是114.114.114.114。

114.114.114.114是国内网络运营商提供的免费DNS域名服务器通过域名访问数据库,而在国外通常使用谷歌的DNS域名服务器8.8.8.8。在Linux机器上我们可以通过以下命令查询:

$ cat /etc/resolv.conf
namespace 114.114.114.114

在Linux服务端,nslookup是最常用于查询DNS解析状态的命令了。如下图所示:

$ nslookup gmail.google.com
Server:         10.202.72.116
Address:        10.202.72.116#53
​
​
Non-authoritative answer:
gmail.google.com        canonical name = www3.l.google.com.
Name:   www3.l.google.com
Address: 172.217.160.110

nslookup很粗略的查询到了我们的DNS域名服务器以及对应解析的IP地址,如果我们需要追踪到域名解析的递归过程,可以使用Dig工具。

Dig是我们经常用于域名解析分析的工具。我们可以通过Dig来了解下域名解析的具体过程。

【网络通信——DNS协议】你遇到过域名解析问题吗,如何分析和排查?

Dig输出结果中通过域名访问数据库,包含了很多A、NS等缩写字母,这些字母代表的是DNS资源记录类型。DNS 服务通过资源记录的方式,来管理所有数据,它支持 A、CNAME、MX、NS、PTR 等多种类型的记录。比如:A 记录,用来把域名转换成 IP 地址;CNAME 记录,用来创建别名;MX表示邮件记录,返回接收电子邮件的服务器地址;而 NS 记录,则表示该域名对应的域名服务器地址。

以上Dig输出包括五个部分,也是域名解析的四个步骤:

第一部分是根域名服务器,总共包含了c\b\k\f等十几个根服务器的NS记录;   
.                       39767   IN      NS      b.root-servers.net.
.                       39767   IN      NS      k.root-servers.net.
.                       39767   IN      NS      f.root-servers.net.
.                       39767   IN      NS      m.root-servers.net.
.                       39767   IN      NS      d.root-servers.net.
.                       39767   IN      NS      g.root-servers.net.
.                       39767   IN      NS      a.root-servers.net.
.                       39767   IN      NS      h.root-servers.net.
.                       39767   IN      NS      j.root-servers.net.
.                       39767   IN      NS      e.root-servers.net.
.                       39767   IN      NS      i.root-servers.net.
.                       39767   IN      NS      l.root-servers.net.
第二部分是通过根域名查询到的顶级域名服务器NS记录;
com.                    172800  IN      NS      l.gtld-servers.net.
com.                    172800  IN      NS      b.gtld-servers.net.
com.                    172800  IN      NS      c.gtld-servers.net.
com.                    172800  IN      NS      d.gtld-servers.net.
com.                    172800  IN      NS      e.gtld-servers.net.
com.                    172800  IN      NS      f.gtld-servers.net.
com.                    172800  IN      NS      g.gtld-servers.net.
com.                    172800  IN      NS      a.gtld-servers.net.
com.                    172800  IN      NS      h.gtld-servers.net.
com.                    172800  IN      NS      i.gtld-servers.net.
com.                    172800  IN      NS      j.gtld-servers.net.
com.                    172800  IN      NS      k.gtld-servers.net.
com.                    172800  IN      NS      m.gtld-servers.net.
第三部分则是根据顶级域名查询到权限域名服务器对应的NS记录;
google.com.             172800  IN      NS      ns2.google.com.
google.com.             172800  IN      NS      ns1.google.com.
google.com.             172800  IN      NS      ns3.google.com.
google.com.             172800  IN      NS      ns4.google.com.
第四部分则是根据权限域名(gamil.google.com)查询到对应的CNAME记录,即别名是www3.l.google.com;
gmail.google.com.       604800  IN      CNAME   www3.l.google.com.
最后一个部分则是根据别名查询到A记录。
www3.l.google.com.      300     IN      A       172.217.160.78

域名解析故障是一种非常常见的网络故障,最大的症状就是访问站点对应的IP地址没有问题,然而访问域名则出现了错误。

当我们遭遇到域名解析故障时,首先我们要判断该故障是否时域名解析故障。我们可以用nslookup来判断是否真的是DNS解析故障,假如不能访问的话,那么DNS解析应该是不能够正常进行的。我们会收到DNS request timed out,timeout was 2 seconds的提示信息,这说明我们的计算机确实出现了DNS解析故障。

域名解析故障产生原因也很多,比如DNS本地设置问题、缓存刷新不及时、域名供应商服务器错误,等等。

首先,我们可以检查本地DNS服务器地址设置是否正确,通过查看resolv.conf文件可知该配置为空。

$ cat /etc/resolv.conf

我们可以通过nolookup的debug模式,也能分析到是本地DNS域名服务器地址设置问题。我们可以发现connection to的地址是127.0.0.1,而不是我们熟悉的114.114.114.114或8.8.8.8。

$nslookup -debug time.geekbang.org
;; Connection to 127.0.0.1#53(127.0.0.1) for gmail.google.com failed: connection refused.
;; Connection to ::1#53(::1) for gmail.google.com failed: address not available.

我们可以为resolv.conf加上DNS域名服务器地址。114.114.114.114是国内网络运营商提供的免费DNS域名服务器,而在国外通常使用谷歌的DNS域名服务器8.8.8.8。

$ echo nameserver 114.114.114.114 > /etc/resolv.conf

如果DNS服务器地址配置没有问题,接下来我们再检查系统是否启用DNS缓存。有些服务器为了提升DNS解析的速率,通常会使用DNSMasq缓存来加速域名解析,需要手动安装:

$ yum -y install dnsmasq

我们可以通过重启来刷新DNS缓存信息:

$ systemctl restart dnsmasq.service

如果这些检查都没有问题,这个时候更多考虑是否是DNS服务提供商出现了故障,我们可以通过Dig来进一步检查:

域名劫持是互联网攻击的一种方式,通过攻击域名解析服务器(DNS),或伪造域名解析服务器(DNS)的方法,把目标网站域名解析到错误的地址从而实现用户无法访问目标网站的目的。钓鱼网站以及一些恶意广告是最为常见的域名劫持攻击。

通常解决DNS域名劫持有:

一、准备备用域名,一旦主域名被攻击,则启用备用域名。但这种方案对于已经熟悉主域名的互联网用户访问备用域名;

二、将动态分配DNS服务器地址改为手动修改DNS配置;

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]