DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住IP。

通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。

为什么需要DNS解析域名为IP地址?

  首先计算机在网络上通讯时只能识别IP地址(网络通讯大部分是基于TCP/IP协议,而TCP/IP是基于IP地址的),比如我要在浏览器中访问百度的地址,我可以在地址栏直接输入14.215.177.39就能访问到百度的首页。但是我们无法记住更多的IP地址。那么域名就出现了,域名是由一串用”.”分隔的唯一名字。所以现在我们访问网站的时候,就可以在浏览器地址栏中输入域名(www.baidu.com),那么DNS就会把域名翻译成IP,然后访问IP

域名

  域名按照从右到左的顺序来划分优先等级,最右边的是最高级的根域,根域就是所谓的”.”,其实我们的域名www.baidu.com在配置当中应该是www.baidu.com.(最后有一个点),一般我们在浏览器里输入时会省略后面的点。接下来就是顶级域又称一级域,一级域之后还有二级三级域。如何区分当前域名是几级域,可以参考域名中有几个点来判断(除了根域外),比如baidu.com就是个一级域,而www.baidu.com就是个二级域(它是在baidu.com这个域里面有一个叫做www的主机)

  每一层域都会有一堆域名(DNS)服务器,DNS服务器是能提供域名解析的服务器,记录类型可以是A(address)记录,NS(name server)记录,MX(mail),CNAME等,这些记录类型后续会一一介绍到。

这里有个知识点,百科中说全世界只有13台根DNS服务器,但其实这是错误的观点,根DNS服务器只有具体的13个IP地址,但机器的数量不止13台。

  DNS服务器一般分三种,根DNS服务器,顶级DNS服务器,权威DNS服务器

  接下来会讲到这些DNS服务器和我们今天说的DNS解析有什么关系,在讲述DNS解析流程前先要理解什么是本地DNS

  本地DNS一般是指你电脑上网时IPv4或者IPv6设置中填写的那个DNS。这个有可能是手工指定的或者是自动分配的。

  如果你的电脑是直连运营商(ISP)网络,一般默认设置情况下DNS为ISP的服务器地址。

  如果你的电脑和ISP之间还加了无线或者有线路由(一般的路由器本身还会内置DNS转发器),它的作用是将发往它所有的DNS请求转发到上层DNS,但最终会转发到ISP的DNS。

  如果手动修改了DNS,比如改成8.8.8.8这样的公用DNS服务器,那么指的就是这个服务器。

  本地DNS不是权威服务器,相当于一个代理的DNS解析服务器,他会帮你迭代权威服务器返回的回答,然后把最终查到的IP返回给你。

  如下图所示,就是之后我们讲到的本地DNS服务器。

  1. 现在我有一台电脑,在浏览器中输入www.baidu.com域名,浏览器会从浏览器的DNS缓存中检查是否有这个网址的映射关系,如果有,就返回IP,完成域名解析
  2. 如果没有,操作系统会先检查自己本地的hosts文件是否有这个网址的映射关系,如果有,就返回IP,完成域名解析。看到这里大家应该都猜到了,有DNS的地方,就有缓存。浏览器、操作系统、本地DNS、根域名服务器,它们都会对DNS结果做一定程度的缓存。
  3. 如果还没有,我的电脑就要向本地DNS服务器发起请求查询www.baidu.com这个域名。
  4. 本地DNS服务器拿到请求后,先检查一下自己的缓存中有没有这个地址,有的话直接返回。这个时候拿到的IP地址,会被标记为非权威服务器的应答
  5. 如果本地DNS服务器的缓存中没有的话,本地DNS服务器会从配置文件中读取13个根DNS服务器的地址,然后向其中一台发起请求
  6. 根DNS服务器拿到请求后,知道他是com.这个顶级域名下的,所以会返回com域名中的NS记录(用来表明哪台服务器对该域名进行解析),其实就是一个IP(com对应的服务器IP)
  7. 本地DNS服务器根据返回的IP(com DNS服务器)发起请求,com DNS服务器发现你这请求的是baidu.com这个域,查到这个域的NS记录,然后返回IP(baidu.com)
  8. 本地DNS服务器在根据IP(baidu.com DNS服务器)访问这些权威服务器,baidu.com服务器在A记录(正向解析记录,域名到IP地址的映射)中查找到www.baidu.com的IP地址,返回IP(www.baidu.com
  9. 最终本地DNS服务器拿到用户想访问的www.baidu.com的IP,返回给客户端,并进行缓存操作,以便下次使用。

看上面的图,再理解一遍:

浏览器:@浏览器缓存,你知道www.baidu.com对应的IP么?

浏览器缓存:知道,是xxxx

浏览器:好的,我去访问啦!

浏览器缓存:不知道

浏览器:@系统缓存,你知道www.baidu.com对应的IP么?

系统缓存:我看下hosts哦,找到了,是xxxx

浏览器:好的,我去访问啦~

系统缓存:我看下hosts哦,哎呀没有找到哎

浏览器:好的,我无能为力了,@客户机想想办法

客户机:我去问问@本地DNS服务器,你知道www.baidu.com对应的IP么?

本地DNS服务器:我去DNS服务器缓存中找找,找到了,是xxxx

客户机:@浏览器,是xxxx,你去访问吧

    浏览器:好的,我去访问啦#

本地DNS服务器:我去DNS服务器缓存中找找,哎呀没有找到哎

本地DNS服务器:想个办法,先去找大哥@根DNS服务器,你知道www.baidu.com对应的IP么?

根DNS服务器:我知道com DNS服务器的IP,你叫他给你查

本地DNS服务器:好的,@com DNS服务器,你知道www.baidu.com对应的IP么?

com DNS服务器:我知道baidu.com DNS服务器的IP,你叫他给你查

本地DNS服务器:怎么开始踢皮球了,@baidu.com DNS服务器,你知道www.baidu.com对应的IP么?

baidu.com DNS服务器:我这里查到了,IP是xxxx

本地DNS服务器:太开心了@客户机IP是xxxx。这么麻烦,先记到DNS服务器缓存,免得下次又这么折腾。

客户机:@浏览器 IP是xxxx

浏览器:好的,我去访问啦

  上面就把正常的DNS解析流程讲解完毕了,其中有提到的迭代查询,在整个DNS解析过程中会存在递归查询过程和迭代查询过程。

  我的电脑向本地DNS服务器的查询一般都是采用递归查询

  本地DNS服务器向其他DNS服务器的查询是迭代查询

  总结下就是发起查询的机器改变了就是递归查询,反之,发起查询的机器不变就是迭代查询。

DNS解析过程中也解释了DNS服务器记录中的NS记录和A记录,那么接下来就看下DNS服务器中的这些记录的作用

  其实在上面DNS解析www.baidu.com域名的时候,在实际操作中就有遇到CNAME记录。

当我们向baidu.com请求www.baidu.com的时候,返回了一个别名www.a.shifen.com

  一般解析过程中遇到CNAME,查询会终止,重新向根DNS服务器发起查询别名的请求,最终返回给电脑www.baidu.com 的CNAME以及别名的IP。

以上所有流程可以使用nslookup或dig(linux自带,windows可装)命令查询验证

DNS劫持

  DNS决定的是我们的域名将解析到哪一个IP地址的记录,是基于UDP协议的一种应用层协议。这种攻击的前提是攻击者掌控了你的本地DNS服务器

攻击者劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致用户对该域名地址进行访问的时候,由原来的IP地址转入到修改后的IP地址。结果就是让正确的网址不能解析或者是被解析到另一个网址的IP,实现获取用户资料或者破坏原有网址正常服务的目的。

  原理如下图所示:

  由于域名劫持往往只能在特定的被劫持的网络范围内进行,所以在此范围外的DNS服务器能够返回正常的IP地址,或者修改DNS以及直接IP访问。

  一般而言,用户上网的DNS服务器都是运营商分配的,所以在这个节点上,运营商可以做一些事情,比如,你去访问www.a.com,正常DNS应该返回10.0.0.1,而运营商劫持后,会返回一个运营商的中间服务器IP,访问该服务器会一致性的返回302(暂时重定向),让用户浏览器跳转到预处理好的带广告的网页,在该网页中再通过iframe打开用户原先访问的地址。

DNS污染

  又称域名服务器缓存投毒(DNS cache poisoning),它和DNS劫持的不同之处,在于污染针对的是DNS缓存,是在查询信息到达目标DNS服务器前,经过的节点上做手脚,而劫持是DNS服务器中记录的是错误的内容。

总结下就是DNS劫持是修改DNS服务器,DNS污染是修改DNS缓存。

  看下图举个例子:对于GFW来说,DNS劫持用于国内服务器,因为可以修改服务器中的DNS记录,而对于国外服务器GFW无法更改其内容,故采用DNS污染的方式篡改用户收到的信息。其中的过程是,当你向国外DNS服务器查询DNS记录时,这些流量走到国际出口带宽的时候会遇到GFW的关键字审查,如果上了黑名单,GFW会立即向你返回一个虚假的DNS记录。上面也说到DNS走的是UDP协议,加上DNS查询结果只认最快返回的,所以一定是先收到了GFW给你返回的虚假DNS记录,就算马上你收到了真正的来自国外DNS的回复,也会被你的系统无视掉。这种攻击也被称为中间人攻击。

一篇你看了就懂的DNS详解的更多相关文章

  1. Kotlin——中级篇(二): 属性与字段详解

    在前面的章节中,详细的为大家讲解到了Kotlin中对类的类的定义.使用.初始化.初始化.类继承等内容,但是在一个类中,几乎上是不可能不出现属性与字段(field)的,这一篇文章就为大家奉上Kotlin ...

  2. 【HANA系列】【第五篇】SAP HANA XS的JavaScript API详解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列][第五篇]SAP HANA XS ...

  3. 【HANA系列】【第二篇】SAP HANA XS使用JavaScript编程详解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列][第二篇]SAP HANA XS ...

  4. Kotlin——高级篇(二):高阶函数详解与标准的高阶函数使用

    在上面一个章节中,详细的讲解了Kotlin中关于Lambda表达式的语法以及运用,如果还您对其还不甚理解,请参见Kotlin--高级篇(一):Lambda表达式详解.在这篇文章中,多次提到了Kotli ...

  5. Kotlin——中级篇(三):可见性修饰符详解

    在Kotlin中,不管是类,对象,接口,构造函数,函数,属性及其设置器都具有可见性修饰符.Kotlin中的可见性修饰符共四种.即public.protected.private.internal.在不 ...

  6. 精讲RestTemplate第4篇-DELETE、PUT等请求方法使用详解

    本文是精讲RestTemplate第5篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层H ...

  7. 基础篇-http协议《http 简介、url详解、request》

    目录 一.http 简介 二.url 详解 三.request 1.get 和 post 2.请求方法 3.request 组成 4.请求头 5.get 请求参数 6.post 请求参数 7.post ...

  8. 一篇看懂JVM底层详解,利用class反编译文件了解文件执行流程

    JVM之内存结构详解 JVM内存结构 java虚拟机在执行程序的过程中会将内存划分为不同的区域,具体如图1-1所示. 五个区域 JVM分为五个区域:堆.虚拟机栈.本地方法栈.方法区(元空间).程序计数 ...

  9. 一篇非常经典的springMVC注解实现方式详解

    今天公司让搭建个springMVC的注解框架,研究了好半天,网络搜罗了半天,好不容易找到篇,拿来分享下: 原文出处:http://itxxz.com/a/kuangjia/2014/0531/4.ht ...

随机推荐

  1. 论EFMS模拟量部分采集电路的修改

    论1:电阻R11的作用 如图1是2014-3-11之前模拟量采集的部分硬件电路,图2是纠正后的正确电路. D5是SA20CA,TVS双向二极管,有效防止外接电源的浪涌冲击情况,保护电路.  D6是稳压 ...

  2. http://vjudge.net/contest/view.action?cid=51142#problem/C 精度转换的一道题。。。

    C - Get-Together at Den's Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & ...

  3. ECCV 2016 paper list

    摘录ECCV2016部分文章,主要有Human pose esimation,  Human activiity / actions, Face alignment, Face detection & ...

  4. HSmartWindowControl 之 摄像头实时显示( 使用 WPF )

    1.添加Halcon控件,创建WPF项目 在VS2013中创建一个WPF工程,然后添加halcon的控件和工具包,参见: HSmartWindowControl之安装篇 (Visual Studio ...

  5. 利用 Azure Devops 创建和发布 Nuget 包

    利用 Azure Devops 创建和发布 Nuget 包 原 Visual Studio Team Service ,简称 VSTS,能够创建 pipelines 管道以构建应用程序,并将其部署到任 ...

  6. C# 实现简单仿QQ登陆注册功能

    闲来没事,想做一个仿QQ登陆注册的winform,于是利用工作之余,根据自己的掌握和查阅的资料,历时4天修改完成,新手水平,希望和大家共同学习进步,有不同见解希望提出! 废话不多说,进入正题: 先来看 ...

  7. jQuery的addClass,removeClass和toggleClass方法

    jQuery的addClass,removeClass和toggleClass方法,最后一个方法在某一情形之下,可以替代前面2个方法. 第一个方法addClass为元素添加一个class. 第二个方法 ...

  8. ES6中的元编程-Proxy & Reflect

    前言 ES6已经出来好久了,但是工作中比较常用的只有let const声明,通过箭头函数改this指向,使用promise + async 解决异步编程,还有些数据类型方法...所以单独写一篇文章学习 ...

  9. Note of The Linux Command Line

    心得 在用鼠标点击的图形化桌面之前,单纯用键盘操作软件的时代已经很成熟了.并且还在这样延续下去.鼠标不是电脑操作的唯一模式,至少不是程序员的. 在黑色屏幕下,因为没有鼠标所以只能用按键来操作软件.包括 ...

  10. 简单介绍RPM包制作方法

    RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,是一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中.它生成具有.RPM扩展名的文件.使用r ...