1

目录

  1. 前言
  2. 第一步:浏览器对 DNS 解析
  3. 第二步:本地 hosts文件 DNS解析
  4. 第三步:本地域名解析服务器 DNS 解析
  5. 第四步:根域名解析服务器 DNS 解析
  6. 第五步:gTLD服务器 DNS 解析
  7. 第六步:权威域名服务器 DNS 解析
  8. 第七步:返回缓存
  9. DNS 解析原理
  10. DNS 解析优化
  11. DNS 劫持
  12. DNS 劫持应对策略
  13. 结束语
  14. 题外话
  15. 参考

前言

在上一篇文章中,介绍浏览器解析 URL 的黑魔法,这篇文章来介绍一下 DNS 黑魔法。

概念

DNS 的全称是 Domain Name System 或者 Domain Name Service,它主要的作用就是将人们所熟悉的网址 (域名) “翻译”成电脑可以理解的 IP 地址,这个过程叫做 DNS 域名解析。

为什么需要 DNS 解析

网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如“192.168.0.0.1”之类的IP地址,而不能认识域名。而对于人类的心智模型来说,很难记住10个以上IP地址的网站,所以我们访问网站时,更多的是在浏览器地址栏中输入域名,就能看到所需要的页面,这是因为有一个叫“DNS服务器”的计算机自动把我们的域名“翻译”成了相应的IP地址,然后调出IP地址所对应的网页。

大厂经常问

DNS 解析在面试中是一个常见的问题。经常会存在这样的题目「在浏览器输入一个 URL 之后发生了什么?」,这个问题扩展开来就囊括了 DNS 的解析过程。当然还有的面试官会把 DNS 的解析过程单独拿出来问。这篇文章就详细来讲讲 DNS 怎么解析的。

第一步:浏览器 DNS 解析

检查浏览器缓存中是否缓存过该域名对应的IP地址

用户通过浏览器浏览过某网站之后,浏览器就会自动缓存该网站域名对应的地址,当用户再次访问的时候,浏览器就会从缓存中查找该域名对应的IP地址,因为缓存不仅是有大小限制,而且还有时间限制(域名被缓存的时间通过属性来设置),所以存在域名对应的找不到的情况。

当浏览器从缓存中找到了该网站域名对应的地址,那么整个解析过程结束,如果没有找到,将进行下一步骤。对于的缓存时间问题,不宜设置太长的缓存时间,时间太长,如果域名对应的发生变化,那么用户将在一段时间内无法正常访问到网站,如果太短,那么又造成频繁解析域名。

浏览器缓存 DNS 时间

浏览器为了提高响应的时间,会对 DNS 记录缓存,但是不同的浏览器缓存的时间不一样。

chrome

chrome://net-internals/#dns 这里可以看各域名的DNS 缓存时间。Chrome对每个域名会默认缓存60s。但是有可能chrome://net-internals显示不出来dns缓存。只有一个清除缓存的按钮。

image.png
当遇到这样的情况时,你可以按照如下的流程操作来查看 DNS 缓存,这个不能查看 DNS 缓存是因为 chrome://net-internals/ 的一些功能已经在Chrome 71之后被移除了。

  1. chrome://net-export 导出日志
  2. https://netlog-viewer.appspot... 下导入日志查看

DNS解析1.gif

Firefox

Firefox有DNS缓存功能,默认缓存时间只有1分钟。

IE

IE将DNS缓存30min。

Safari

Safari DNS缓存时间约为10s

浏览器对 DNS 解析结果的处理

如果一个域名的DNS解析结果会有多个的话,浏览器是如何处理的呢?Chrome浏览器会优先向第一个IP发起HTTP请求,如果不通,再向后面的IP发起HTTP请求。DNS 域名查询网址

image.png

第二步:本地 hosts文件 DNS解析

如果第一个步骤没有完成对域名的解析过程,那么浏览器会去系统缓存中查找系统是否缓存过这个域名对应的地址,也可以理解为系统自己也具备域名解析的基本能力。在系统中,可以通过设置文件来将域名手动的绑定到 某个 IP 上。如果使用过代理软件(如 fiddler )的同学可能对这个比较清楚一点,在系统的 hosts 文件,可以用来设置域名和 IP 的对于关系。对于普通用户,并不推荐自己手动绑定域名和,对于开发者来说,通过绑定域名和,可以轻松切换环境,可以从测试环境切换到开发环境,方便开发和测试。

hosts文件

hosts文件是一个用于储存计算机网络中各节点信息的计算机文件。这个文件负责将主机域名映射到相应的IP地址。hosts文件通常用于补充或取代网络中DNS的功能。和DNS不同的是,计算机的用户可以直接对hosts文件进行控制。hosts文件的作用非常大,可以自由解析域名。

hosts文件位置

  • Windows NT/2000/XP/Vista/win7(即微软NT系列操作系统):默认位置为 %SystemRoot%\system32\drivers\etc\,但也可以改变。
  • 典型的XP系统hosts文件位置:C:\windows\system32\drivers\etc
  • Windows 95/98/Me:%WinDir%\Linux及其他类Unix操作系统:/etc苹果系:
  • Mac OS 9及更早的系统:System Folder: Preferences或System folder(文件格式可能与Windows和Linux所对应的文件不同)
  • Mac OS X:/private/etc(使用BSD风格的hosts文件)
  • iPhone OS:/etc
  • iPad OS:/private/etcSymbian第1/2版手机:C:\system\data\hosts
  • Symbian第3版手机:C:\private\10000882\hosts,只能使用兼容AllFiles的文件浏览器访问,大部分都不行。

位置如果有问题请告知,谢谢!

hosts文件的一些用途

  • 将广告域名重定向到本地IP地址:127.0.0.1上来过滤广告。
  • hosts文件可用于拦截一些恶意网站的请求,从而防止访问欺诈网站或感染一些病毒或恶意软件。
  • 使用hosts文件来强制将网站指定到正确的IP上。

第三步:本地域名解析服务器 DNS 解析

如果在本机上无法完成域名的解析,那么系统只能请求本地域名解析服务系统进行解析,本地域名系统一般都是本地区的域名服务器,比如你连接的校园网,那么域名解析系统就在你的校园机房里,如果你连接的是电信、移动或者联通的网络,那么本地域名解析服务器就在本地区,由各自的运营商来提供服务。对于本地服务器地址,系统使用命令就可以查看,在和系统下,直接使用命令来查看服务地址。一般都缓存了大部分的域名解析的结果,当然缓存时间也受域名失效时间控制,大部分的解析工作到这里就差不多已经结束了,负责了大部分的解析工作。

第四步:根域名解析服务器 DNS 解析

本地域名解析器还没有完成解析的话,那么本地域名解析服务器将向根域名服务器发起解析请求。本地域名解析向根域名服务器发起解析请求,根域名服务器返回的是所查域的通用顶级域xxx地址。

根域名解析服务器

由于早期的 DNS 查询结果是一个512字节的 UDP 数据包。这个包最多可以容纳13个服务器的地址,因此就规定全世界有13个根域名服务器,编号从a.root-servers.net一直到m.root-servers.net。
这13台根域名服务器由12个组织独立运营。其中,Verisign 公司管理两台根域名服务器:A 和 J。每家公司为了保证根域名服务器的可用性,会部署多个节点,比如单单 Verisign 一家公司就部署了104台根域名服务器(2016年1月数据)。
所以,根域名服务器其实不止13台。据统计,截止2016年1月,全世界共有 517 台根域名服务器。你可以在 http://root-servers.org 这个网站查到所有根域名服务器的信息。

第五步:gTLD服务器 DNS 解析

本地域名解析服务器向gTLD服务器发起请求。gLTD服务器查询并返回域名对应的Name Server域名服务器的地址,通常是你注册的域名服务器,例如你在某个域名服务器提供商申请的域名,那么这个域名解析任务就由这个域名服务提供商来完成。

第六步:权威域名服务器 DNS 解析

权威域名服务器会查询存储的域名和ip的映射关系表,将 ip 连同一个 TTL 值返回给DNS 本地域名服务器。

第七步:返回,然后缓存

本地域名服务器拿到 ip 和 TTL 会缓存起来。返回给浏览器。

DNS 解析原理

image.png

  • 本地DNS解析是递归过程。
  • 其他服务器DNS解析是迭代过程。

每一次DNS解析需要20~120ms ,第一次解析完成后,会把解析信息缓存到本地 下一次再次发送这个域名请求,直接从本地缓存中进行解析了
一个页面中域名很多那么需要解析的就很多服务器。减少域名解析(页面中尽可能少用不同的服务器),但是真实情况要做一个取舍: 为了节约服务器资源,大型网站一般都是服务器分布式 或者 服务器分离 WEB资源服务器 图片服务器 数据服务器 .....

DNS 解析优化

DNS解析会有20ms~120ms的耗时,哪减少这个耗时是有必要的,通常是做饭是减少 DNS 的请求次数,尽可能不要请求太多的服务器解析。但是现在很多的公司为了做负载均衡或者服务器的分离独立部署,都是更可能多请求服务器。哪还有一种做法就是 DNS 预解析,DNS预解析其实就是减少域名解析成IP的时间。

<link rel="dns-prefetch" href="xxx"></link>
<meta http-equiv="x-dns-prefetch-control" content="on"/>

DNS 劫持

概念

DNS劫持即通过某种技术手段,篡改正确域名和IP地址的映射关系,使得域名映射到了错误的IP地址,因此可以认为DNS劫持是一种DNS重定向攻击。DNS劫持通常可被用作域名欺诈,如在用户访问网页时显示额外的信息来赚取收入等;也可被用作网络钓鱼,如显示用户访问的虚假网站版本并非法窃取用户的个人信息。

DNS 劫持大事记

《AWS route53 BGP路由泄漏事件》

事件发生在2018年4月24日。黑客针对四段分配给AWS,本应作为AWS route53 DNS服务器服务地址的IP空间(205.251.192.0/23, 205.251.194.0/23, 205.251.196.0/23, 205.251.198.0/23)发布了虚假的BGP路由,导致在BGP泄漏的两个小时期间,本应该AWS route53 DNS服务器的DNS查询都被重定向到了黑客的恶意DNS服务器。且黑客DNS劫持的目标十分明确,恶意DNS服务器只响应对http://myetherwallet.com 的查询,其他域名的查询均返回SERVFAIL。一旦用户没有注意“网站不安全”的提示而访问http://myetherwallet.com 登录自己的以太坊钱包,黑客就可以轻易获取用户的私钥进而窃取用户的数字货币资产。
据不完全统计,DNS劫持导致两个小时内有多个用户的以太坊钱包被转账清空,共计至少13000美元的资产被黑客盗取。

《巴西银行钓鱼事件》

事件发生在2018年。黑客利用D-Link路由器的漏洞,入侵了至少500个家用路由器。黑客入侵后更改受害者路由器上的DNS配置,将受害者的DNS请求重定向到黑客自己搭建的恶意DNS服务器上。黑客入侵后更改受害者路由器上的DNS配置,将受害者的DNS请求重定向到黑客自己搭建的恶意DNS服务器上,最终诱导原本想访问正常银行网站的受害者访问到钓鱼网站,并恶意窃取受害者的银行账目密码信息。
黑客诱导原本想访问正常银行网站的受害者访问到钓鱼网站,并恶意窃取受害者的银行账目密码信息。

DNS 劫持分类

本地DNS劫持

  • 篡改本地的 hosts文件。黑客通过木马病毒或者恶意程序入侵PC,篡改DNS配置(hosts文件,DNS服务器地址,DNS缓存等)。
  • 攻击路由器或者利用路由器的漏洞篡改 DNS 配置。

    DNS解析路径劫持

  • 通过技术手段(中间盒子,软件等)将DNS流量重定向到其他DNS服务器。
  • 利用分光等设备将DNS查询复制到网络设备,并先于正常应答返回DNS劫持的结果。
  • 网络设备或者软件直接代替DNS服务器对DNS查询进行应答。

    篡改DNS权威记录

  • 篡改DNS权威记录 我们这里指的黑客非法入侵DNS权威记录管理账号,直接修改DNS记录的行为。

DNS 劫持应对策略

DNS劫持在互联网中似乎已经变成了家常便饭,那么该如何应对各种层出不穷的DNS劫持呢?如果怀疑自己遇到了DNS劫持,首先要做的事情就是要确认问题。

如何确认DNS劫持

阿里云的可以检测域名是否被劫持(注意我不是阿里云的拖,哈哈哈哈),地址

image.png

DNS劫持防范

  • 安装杀毒软件,防御木马病毒和恶意软件;定期修改路由器管理账号密码和更新固件。
  • 选择安全技术实力过硬的域名注册商,并且给自己的域名权威数据上锁,防止域名权威数据被篡改。
  • 选择支持DNSSEC的域名解析服务商,并且给自己的域名实施DNSSEC。DNSSEC能够保证递归DNS服务器和权威DNS服务器之间的通信不被篡改。阿里云DNS作为一家专业的DNS解析服务厂商,一直在不断完善打磨产品功能,DNSSEC功能已经在开发中,不日就会上线发布。
  • 在客户端和递归DNS服务器通信的最后一英里使用DNS加密技术,如DNS-over-TLS,DNS-over-HTTPS等。

结束语

如果文章中什么不对或者写的不好的地方,请大家多多指正,谢谢!码字不易,点个赞加个关注吧!

image.png

题外话

笔者在「深圳虾皮」,一家口碑还不错的东南亚电商公司,2021大量招人,机会多多!快来加入我们吧!

现在有想法,还是以后有想法的同学,都可以加我微信[stone---999]!内推你加入我们的大家庭!

参考


stonehehehehehe
3 声望1 粉丝

星辰大海