DNS 是怎么工作的

当前电脑的 DNS 服务器

当我们的设备联网时,DNS 作为系统的必备软件,就已经开始工作了。

比如在 MacOS 上,我们先打开 网络偏好设置:

可以看到当前的 DNS 服务器,如果是自动获取的 IP,一般这个 DNS 服务器地址也是自动获取的 (呈现灰色),也可以自己手工指定,比如 8.8.8.8114.114.114.114 这些常见的。

上面截图中显示的 DNS 服务器是 192.168.31.1,这是家里路由器的地址,我们继续寻找痕迹,路由器上管理页面显示的 DNS 是 192.168.1.1

192.168.1.1 其实是 光猫 的地址,光猫本身也是一个路由器,我们进入光猫的管理界面,可以看到最终默认指派的 DNS 服务器:

如果光猫处于桥接状态,且当前的 ISP (网络提供商,比如电信、移动) 提供公网 IP (也叫独立 IP),则上述的环节会有所不同;同样如果专线入户、网线入户拨号,其环节也有所不同。但本质逻辑是一样的,都是 ISP 默认会提供一个 DNS 服务器以供查询。

上面示例截图为例,比如我们设备联网访问一个 domain.com,实际上会先查询 192.168.31.1 这个路由网关,它又会去查询上级路由(光猫) 192.168.1.1,在 192.168.1.1 上,才会真正去查询外部的 DNS 服务器 (之前都只在局域网内转悠)。
在我们的局域网中,每个网关 (路由器),除了扮演路由的作用,本身也是一个 DNS 服务器,确切的说,是 Proxy (代理) 性质的,一方面去获取数据,另一方面,将数据返回给客户端设备。

与 DNS 有关的一些事情

有些朋友,之前或许懵懂;有些则只关注是否可以上网,却不关心背后 DNS 运行的逻辑。
在本课程的最开始,我们也介绍了为什么选取 DNS 作为一个实践、教学的课题。
DNS 对于绝大多数互联网的使用者而言,是一个典型的离不开它又感觉不到它的基础技术,犹如互联网基层的水与空气。如果未来区块链达到人人可用的状态,这个近乎万年不变的 DNS,应该也会为区块链提供最基础的支撑吧,只是现在,没有这个可能。因为 DNS 的客户端层,没有任何一家是处于垄断的状态,或许某一天 Apple、Google、MicroSoft 达成了共识,才有可能。

在本篇内容的前半部分,我们应该已经理解本地(电脑) 使用了什么 DNS 服务器,来解决域名到 IP 的解析查询问题。
我们用这些知识,重新审视以前可能遇到过的问题,说不定会豁然开朗。

为什么我不能上网了?

上网 确切的说法应该是指可连接到 ISP 的网关,并能访问国际互联网;但对于大多数网民而言,上网 的含义其实特指 可以访问网站。前者能连接到 IP 就算上网了;而后者,则考虑了实际的使用感受,能 ping 通一个 IP 但就是打不开网页 (域名),那就不算上网

为什么我不能上网了? 如果当前设备处于联网状态,但网页就是访问不了,这个时候,第一要怀疑的就是 DNS 服务器出问题了。
以上文为例,我们的一次域名解析,其实经过了 3 个 DNS 服务器,分别为: 主路由器、光猫、ISP 提供的 DNS 服务器,这 3 个服务器,任何一个出现问题,都会导致域名将无法完成解析。
一般来说,ISP 提供的 DNS 服务器 不会出 (致命) 问题,而我们家庭用的路由器如果性能不佳,长久运行后,内置的 DNS 服务器已经负载吃不住了,又或者光猫的性能也不佳,这两个家庭局域网内的 DNS 服务器掉链子的概率其实不低。如果路由器、光猫没有坏掉,断电重启一般也就恢复了。

当然,还有一种情况,就是如上说的几个 DNS 服务器都正常工作,但自己手工设定了 DNS,使用了错误的 DNS 地址、甚至留空。那么,重新设定下 DNS 服务器地址就好了,或者直接选择自动获取。

暴风影音导致的断网

这是一个比较悠久的故事了,在 2009 年 5 月的一天,中国十多个省市互联网大瘫痪,不是地下光缆被挖断之类的物理性原因,而是 ISP 的 DNS 服务器瘫痪了。
我们刚在上段说到,『一般来说,ISP 提供的 DNS 服务器是不会出问题的』,怎么一下子被打脸了?

当时,暴风影音将自己的 DNS 解析托管到 DNSPod (一家专门的 DNS 托管服务商),DNSPod 那天在江苏常州的多个服务器被攻击导致被中国电信封掉了 IP,接下来,使用 DNSPod 托管的约 10 万左右的域名无法解析,其中自然就包括暴风影音的。
由于暴风影音的装机量巨大,当它的用户打开软件之后,会尝试联网,此时会产生 域名解析,也就是会去查询 DNS 服务器。
因为其最终提供 DNS 解析服务的 DNSPod 无法解析了,查询肯定会失败。一般情况下,我们写一个客户端的软件,联网去获取额外信息失败时,就提示用户,或者默认下次间隔多久再去自动请求,但是暴风影音没有这么干,它一直去重试、重试。由于 域名解析 一直失败,暴风影音这个软件压根没有办法连接到自己的服务器上,此时,有趣的事情发生了,ISP 的 DNS 服务器因为巨量的请求 (这已经是一种攻击了),挂了……

擒贼先擒王。
如果去进攻一台服务器,它本身的防御环境很好,再怎么高的流量都无法攻破。那干脆换一条思路,直接进攻网站对应的域名服务器。说不定,这个更不应该被攻破的地方,反倒因为是基础服务而容易被忽略,导致实际上更容易被攻破。

不要乱用别人的 DNS

除了 ISP 默认会提供 DNS 服务器之外,也有一些专门提供公共 DNS 服务服务的,比如 8.8.8.8 (Google 提供的)、114.114.114.114 (国内公共 DNS)。
即使这些知名的公共 DNS 服务,也是存在隐患的,这个隐患跟 ISP 提供的 DNS 服务器其实也一样。比如他们能知道你的解析记录,这是涉及隐私的,如果重度挖掘,能绘制你的上网习惯、消费习惯等人物画像的各种属性。

DNS 服务器还有一种特殊的用法,比如当设定了某个 DNS 服务器作为本地的解析服务,而这个服务器则将所有的 A记录 (就是域名到 IP 的结果匹配) 都指向某个固定 IP,然后这个 IP 对应的服务器是一个网页代理服务器。换句话说,它不仅仅是一台 DNS 服务器,也是一个网络接入的 Web 服务器,无论你访问 google.com 还是 baidu.com,其实都指向了同一个地方。如果只是普通的 透明代理,也没有什么问题,但如果它构造的是假的网银网站呢?或者说除了网银的网站之外,它都正确解析,也不做网页的代理;而一旦涉及网银相关的域名,则通通拦截到某个指定的服务器,那么,什么后果,可想而知。
虽然通过 HTTPS,即使 DNS 拦截了,也不会出现问题。但是,如果面对技术小白,压根无法理解 https://domain.comhttp://domain.com 有什么不同,骗子真的有心为之,合适的契机,足以促成骗局。甚至,在技术小白的眼里,手工修改 DNS 服务器 指向到骗子服务器,看起来也是高科技含量的事情,反而会增加信任感都说不定。