DNS协议原理
上面这幅图说明的很具体。我们在自己的操作系统或者浏览器上配置的DNS服务器,本质上其实是本地DNS服务器,相当于老式电话机对面的接线员。本地DNS服务器在收到我们的操作系统或浏览器发送的请求后,会从自己的缓存查找是否有符合的答案,如果有就直接返回,如果没有就代为向其它DNS服务器查询。
本地DNS服务器首先会询问DNS根服务器(全球只有13台,主服务器在美国,但是会有很多镜像服务器),DNS根服务器会根据查询的域名的后缀,发送对应的域名服务器。本地DNS服务器收到答案后会再次去询问域名服务器。以此循环,直到得到最终答案为止,并将域名对应的IP发回给我们的操作系统或浏览器。
值得一提的是,中国目前并没有任何一台根服务器,只有镜像服务器。中国曾经有过根服务器,但是当年技术落后,由于某几次异常配置导致DNS干扰波及了全世界,因此ICANN吊销了中国的根服务器资格。这也是中国崛起过程中的一大遗憾吧。
DNS技术存在的问题
在DNS最初的设计中,设计者们比较天真地幻想骨干网上每一台服务器都是尽职尽责的,并没有考虑到DNS数据包在经过这些服务器的时候有可能会被篡改,因此DNS协议规定的数据包使用UDP 53端口明文传输。这就像你信任全世界所有的快递员,并且把包裹里面所有东西一一列在快递单上。如果所有快递员心地善良那么就算好运,但是有时候我们可能会遇到一些动机不明的快递员(服务器)。这些快递员看了快递单,发现里面有自己想要的东西,于是就拆开来拿走,并且把空盒子重新装好交给收件方。所谓的DNS劫持其实就是这样子。服务器在传输某些DNS数据包的时候,会修改所解析的IP地址的值,或者直接吞掉数据包。我们平时上网过程中遇到浏览器提示“找不到服务器”的情况或者在访问某些网站时却加载出其它网站的情况就有可能是被干扰了。
另外一个问题就是DNS技术本质上要求客户端绝对地信任DNS服务器,而并没有对于DNS服务器有校验机制。在一般的操作系统、浏览器以及我们购买的家用路由器中,默认的DNS往往和网关地址一致。这样的一级一级上溯就会到运营商的本地DNS服务器。某些运营商出于利益或者其它目的,有时候会对其本地DNS服务器设定一些策略,当我们访问某些网站时拒绝访问或者跳转到其它页面(也就是劫持)。这个过程如下图所示:
我们可以使用的nslookup
命令查询某个域名的DNS解析情况:
|
|
如果从本地DNS服务器到我们自己的客户端之间的DNS没有被干扰,那么无外乎三种可能性:
第一种:正常响应
如果域名的IP查询到了,那么就会显示查询到的所有结果,如下所示:
|
|
也有可能会有多个不同的结果,这和服务器的负载均衡有关:
|
|
如果在这种情况下我们无法访问网站,那么有可能是服务器宕机了,也有可能是最近服务器改了IP地址。这种情况下耐心等一段时间(10分钟到1小时)即可。
第二种:对应域名不存在
这意味着我们查询的域名并没有存在,如下所示:
|
|
有几种可能的原因:你的域名没有注册、过期或者被吊销(.cn没有备案的域名尤其容易)或者域名没有配置DNS解析服务(NS服务)。作为访问者,遇到这种情况基本上就可以放弃尝试了。
第三种:没有解析记录
一般这种现象无非有两种原因:这个域名的解析记录不存在或者还没有生效(一般设置了很大的TTL值有可能会这样),如下所示:
|
|
一般来说作为访问者,我们只要隔一段时间(至少10分钟)再回来就可以了。如果还是不行,多半是这个网站已经被放弃了,我们就没必要再尝试访问了。作为站长,我们要去查看一下自己的DNS解析,确认解析记录生效。
DNS被劫持
有时候我们会遇到如下的情况:
|
|
假如我们发现所有的网站都是这样(尤其试一下www.baidu.com
),那么很可能是我们自己的DNS配置有问题了。确认一下自己的本地DNS服务器配置是正确的,并且确认一下服务器是否延迟太大或者连接线路不稳定(往往使用了8.8.8.8
、1.1.1.1
、9.9.9.9
这类海外本地DNS服务器的用户容易遇到)。
假如只有某个网站这样,那么就可以确认是DNS数据包被干扰了(运营商默认本地DNS服务器很容易这样,注意不是劫持,劫持是无法使用nslookup
分析的)。我们可以考虑换一个本地DNS服务器,譬如阿里云本地DNS服务器223.5.5.5
或223.6.6.6
、114DNS114.114.114.114
或114.114.115.115
。
不仅我们认识到了DNS技术的这些缺陷,很多专家早在多年前就已经意识到了,并且研发出了相当多的替代技术:DNSSec、DNSCrypt、DNS-over-HTTPS、DNS-over-TLS等等。过段时间我会发另一篇文章谈谈这些事儿。
参考链接: