• DNS 工作原理

    基础背景

    when  someone  去访问一个网站时,它往往只需要在浏览器里输入一串网址然后点击回车就完事了。那么问题来了,这中间到底经历了怎样不为人知的秘密呢?我们来看一下:

    dns1

    如上图,我们用curl命令去模仿浏览器去访问helloworld.sinaapp.com这个网址。我们看到它首先去 /etc/hosts里面去查找是否有这个网址对应的IP地址。如果没有找到,就只能借助DNS服务了。DNS是一套分布式的域名服务系统。每个DNS服务器上都存放着大量的机器名和IP地址的映射,并且是动态更新的。众多网络客户端都使用DNS协议来向DNS服务器查询目标主机 的IP地址。 我们要访问DNS服务,就必须知道DNS服务器的IP地址。Linux使用 /etc/resolv.conf 文件来存放DNS服务器的IP地址,如下:

    dns2

    我们可以使用tcpdump来观察DNS的通信过程,先打开一个终端,执行:

    # tcpdump -i eth1 -nt -s 500 port domain

    这里的-n表示不将ip转换成域名,-t表示不打印出时间戳, -s 表示设置抓包时的抓取长度。

    然后再打开一个终端,用host命令进行一个对www.taobao.com 域名的查询。其选项-t告诉我们DNS协议使用哪种查询类型。我们这里使用的是A类型, 即通过机器的域名获得其IP地址。

    dns3

    然后我们可以看到DNS包的查询过程:

    dns4

    如上图,10.13.144.190是我自己的IP地址,我首先向/etc/resolv.conf里的三个DNS服务器发送了一个查询报文。以第一个报文为例,其中33193唯一标识了DNS查询,所以看到几个报文中都是一样的。 + 表示递归查询, A表示A类查询。报文大小为32字节。然后我们再看第四个报文,DNS服务器查询到了www.taobao.com的IP地址,给我们返还回来。其中 3/6/6 表示该报文中含有3个应答资源纪录,6个授权资源纪录,6个额外信息记录。这里又有人要问了,那些乱七八糟的记录是什么啊? 我们dig看一下就知道了。我们执行:dig  www.taobao.com 得到下面的输出结果:

    dns5

    如图:有没有发现ANSWER SECTION字段刚好有3行? AUTHORITY和ADDITIONAL刚好有6行?这不就是那个3/6/6吗?

    -ANSWER SECTION :显示出我们查询的输出,默认的查询是查询A记录,你可以显示或者禁止掉这些用+[no]question选项。

    -AUTHORITY :告诉我们哪个DNS服务器给我们提供权威的答案,你可以用+[no]authority选项保留这段输出。

    -ADDITIONAL:权威DNS的IP地址,这段输出可以用+[no]additional选项保留。

    RR(Resource Record)资源记录与类型

    DNS层级结构中,不管是节点还是叶子节点都是资源(比如根服务器或者.cn服务器),对这些资源中的某一个的标识使用一定格式的多字段的一条记录来表示,这条记录就是资源记录RR。 没听懂是吧?  或许这么说就明白了: 在dig结果中你看到的那一行一行的就是一条一条的RR记录。如下为SOA类型的RR记录格式

    dns6

    问题来了, 什么是SOA? 什么是CNAME等等?

    RR 资源记录可以分成不同的类型(type),SOA 和 CNAME 就是其中的两种类型,主要常用的RR类型有以下几种:

    • A:地址记录(Address),返回域名指向的IP地址。
    • NS:域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。
    • MX:邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。
    • CNAME:规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的跳转,详见下文。
    • PTR:逆向查询记录(Pointer Record),只用于从IP地址查询域名。
    • SOA:起始授权机构,主要描述 Master DNS 的一些间隔特性(因为它比较难理解,下面详细介绍下)。

    SOA记录表明了DNS服务器之间的关系。SOA记录表明了谁是这个区域的所有者(讲的通俗点就是DNS Master)。比如www.sina.com这个区域。一个 DNS服务器安装后,需要创建一个区域,以后这个区域的查询解析,都是通过这个DNS服务器来完成的。但是为了提高可用性,分担解析负载,这个DNS 服务器也可以衍生出来一些辅助DNS,就像MySQL 中的Slave从库一样。 标准DNS当然是可以读写修改的(Master 可读写)。而辅助DNS(DNS Slave)只能通过向Master复制来完 成,不能修改。而Master DNS就会有SOA记录,或者准确说SOA记录中的主机地址一定是这个Master DNS 的服务器IP地址。

    注:大家都知道电信和网通都有很多的DNS 服务器。这些服务器为我们上公网做域名解析提供了很多方便。但是这些DNS服务器有一个有意思的地方是这些DNS不存放任何区域,看上去更像是一个DNS CLIENT,它们被称为缓存DNS服务器。它们会缓存大量的解析地址,这样就会让你解析的时候选择它们会觉得很快。

     

    网站的DNS解析

    比如我要开启一个网站,你先在阿里云搞了一台虚拟机作为你的服务器,然后到号称全球最大注册商的godaddy去买一个域名。等域名买好以后要在Godaddy中配置 DNS 领域查询授权。

    a1

    也就是说你得指定当别人想访问你的网站时,他应该走哪个DNS服务器。这时候你就要告诉godaddy你的 DNS 服务器名称以及 你 服务器的 IP。  这时候你可能要去借助腾讯的免费的DNS提供者DNSPod来作为你的DNS服务器(当然如果你有钱可以自己买一台服务器专门做DNS)。 而这个DNSPod其实就是类型为A的RR记录的服务器,他保存了你的域名到IP地址的映射关系。当然你也可以把DNSPod作为CNAME类型的服务器,用它来保存访问你网站的别名。具体可以参考腾讯云解析的文档,他们是面向用户的,所以文档简洁易懂:

    http://www.qcloud.com/wiki/云解析

    那么比如我们想查看一个域名的CNAME或者A记录应该怎么办呢? 我们可以借助dig命令来查看:

    dig  @serever  name  type

     dns8

     

    然后我们对比上图中的 ANSWER SECTION和下面类型为的CNAME的RR看看:

    dns9

    是不是刚好对应呢?

    至此,我们人就从DNS服务器上得到我们想要的IP地址了。

    DNS解析原理简述

    DNS 利用类似树状目录的架构,将主机名的管理分配在不同层级的 DNS 服务器当中。当我们想要拥有一个域的解析权利时,可以去申请购买(就如之前在Godaddy中一样),如下图是阿里万网的域网站:

    dns10

    如上图,你可以看到左边列出来了很多我们常见的域名选项。我们可以根据需求选择购买没有被占用的域名。

    我们再来看一下,DNS的架构是怎样的:

    dns11

    最上面的叫做根服务器,他下面管理了一堆我们之前看到的域名,然后每个域名又可以继续往下延伸,所以 xinyu.com.cn 和 xinyu.edu.cn 是分属不同的域名网址,不同域名的大致功能范围如下:

    dns11

    在这里我们要问,为什么要设计成这种结构呢?其实每一个上层的DNS服务器只记录属于自己下层的主机名而已,至于下下层怎样走,他就不管了。这样的话管理起来会方便很多。下面我们来进一步详细分析当我们访问 helloworld.sinaapp.com这个域名的过程。下面我们借助鸟哥的私房菜里的例子来描述这一过程,很好理解:

    dns11

    首先,当你在浏览器的网址列输入 http://www.ksu.edu.tw时,你的计算机就会依据相关设定 (在 Linux 底下就是利用 /etc/resolv.conf 这个档案) 所提供的 DNS 的 IP 去进行联机查询了。由于目前最常见的 DNS 服务器就属 Hinet 的 168.95.1.1 这个 DNS,所以我们就拿他来做例子吧!嗯!这个时候,hinet 的这部服务器会这样工作:

    • 第一步收到用户的查询要求,先查看本身有没有纪录,若无则向 . 查询:由于 DNS 是阶层式的架构,每部主机都会管理自己辖下的主机名解译而已。因为 hinet 并没有管理台湾学术网络的权力, 因此就无法直接回报给客户端。此时 168.95.1.1 就会向最顶层,也就是 . (root) 的服务器查询相关 IP 信息。
    • 第二步向最顶层的 . (root) 查询,168.95.1.1 会主动的向 . 询问 www.ksu.edu.tw 在哪里呢?但是由于 . 只记录了 .tw 的信息 (因为台湾只有 .tw 向 . 注册而已),此时 . 会告知『我是不知道这部主机的 IP 啦,不过,你应该向 .tw 去询问才对,我这里不管! 我跟你说 .tw 在哪里吧!
    • 第三步:向第二层的 .tw 服务器查询,168.95.1.1 接着又到 .tw 去查询,而该部机器管理的又仅有 .edu.tw, .com.tw, gov.tw… 那几部主机,经过比对后发现我们要的是 .edu.tw 的网域,所以这个时候 .tw 又告诉 168.95.1.1 说:『你要去管理 .edu.tw 这个网域的主机那里查询,我有他的 IP !
    • 第四步:向第三层的 .edu.tw 服务器查询,同理可证, .edu.tw 只会告诉 168.95.1.1 ,应该要去 .ksu.edu.tw 进行查询,这里只能告知 .ksu.edu.tw 的 IP 而已。
    • 第五步:向第四层的 .ksu.edu.tw 服务器查询:等到 168.95.1.1 找到 .ksu.edu.tw 之后, Bingo !.ksu.edu.tw 说:『没错!这部主机名是我管理的~ 我跟你说他的 IP 是…所以此时 168.95.1.1 就能够查到 www.ksu.edu.tw 的 IP 啰!
    • 第六步:记录暂存内存并回报用户,查到了正确的 IP 后,168.95.1.1 的 DNS 机器总不会在下次有人查询 www.ksu.edu.tw 的时候再跑一次这样的流程吧! 粉远粉累的吶!而且也很耗系统的资源与网络的带宽,所以呢,168.95.1.1 这个 DNS 会很聪明的先记录一份查询的结果在自己的暂存内存当中,以方便响应下一次的相同要求啊! 最后则将结果回报给 client 端!当然啦,那个记忆在 cache 当中的数据,其实是有时间性的,当过了 DNS 设定记忆的时间 (通常可能是 24 小时),那么该记录就会被释放喔!

    鸟哥不愧是大神,讲的很透彻啊,接下来继续由菜鸟王介绍吧:

    在这个过程中要特别注意:向DNS服务器的查询,每次都是由168.95.1.1 发起的,也就是说,当我们向根服务器查询时,根服务器将结果返回给我们就不管了,接下来的查询还得靠168.95.1.1 自己去继续查询。注意上面那张图中的箭头 x.2 哦!我们自己用Dig命令来检验一下是不是和我们说的一样呢?下面的几张图时同一个命令的解析结果,我这里为了讲解分开截出来了。

    dns11

    果然,他第一步就是去询问我们的 . (根)服务器了。

    dns12

    哎,当跟服务器告诉他地址后,它又去com服务器问了。

    dns13

    终于找到了,这下可以去拿IP去访问了!!!

    DNS 查询中的递归与迭代

    这个问题经常会被在面试中问到,其实我们上面的那个解析 http://www.ksu.edu.tw 域名的例子中就既包含DNS递归查询也包含DNS迭代查询。  我们先像 resolve.conf 中的 Local DNS 去询问交互时,它不是立刻给你返回结果,而是帮你去进一步查询处理,这个过程就是递归查询。

    而 Local DNS 从根、再到顶级域、再到二级域、这样一级一级的去交互查询解析的过程,我们可以看做是DNS的迭代查询。

    所以,不严谨的讲:从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。

    域名劫持

    什么是域名劫持?——问度娘:

    定义:域名劫持是互联网攻击的一种方式,通过攻击域名解析服务器(DNS),或伪造域名解析服务器(DNS)的方法,把目标网站域名解析到错误的地址从而实现用户无法访问目标网站的目的。

    原理:域名解析(DNS)的基本原理是把网络地址(域名,以一个字符串的形式)对应到真实的计算机能够识别的网络地址(IP地址,比如216.239.53.99 这样的形式),以便计算机能够进一步通信,传递网址和内容等。由于域名劫持往往只能在特定的被劫持的网络范围内进行,所以在此范围外的域名服务器(DNS)能够返回正常的IP地址,高级用户可以在网络设置把DNS指向这些正常的域名服务器以实现对网址的正常访问。所以域名劫持通常相伴的措施——封锁正常DNS的IP。如果知道该域名的真实IP地址,则可以直接用此IP代替域名后进行访问。比如访问谷歌 ,可以把访问改为http://216.239.53.99/ ,从而绕开域名劫持。

    额,听起来好可怕的样子。   可怕不可怕先不说,不过确实挺烦人的。三天两头就会有用户反馈:“为什么我访问不了你们公司的首页啊?访问其他网站都好好的啊,是不是你们的服务器挂了啊?”  对此我想说,要是我们的服务器三天两头就挂,那我们还活的下去吗?  那么当接到用户这样的反馈的时候,我们该怎么处理呢? 或者说我们该怎么向用户证明——我们的服务器没有挂呢?  让用户dig /traceroute /nslookup /ping /host一下将结果返回给我们,然后看一下,DNS的解析是否安全到达了我们的服务器地址。若不是,则有可能是被DNS劫持了(排除第三方服务的可能)。那怎么办呢?打电话给网络组处理呗,至于网络组怎么处理的,我也不知道~~~~~~~~~

    下面我们就来简单的介绍一下比较火的解析命令dig :

    dig www.oolec.com     即查询域名的A记录,查询的dns服务器将采用系统配置的服务器,即/etc/resovle.conf 中的。如果要查询其他类型的记录,比如NS等,只需将类型加在命令后面即可

    dig www.oolec.com mxdig www.oolec.com ns

    此外,如果不以/etc/resolv.conf 来查询,可以指定DNS服务器,例如

    dig @8.8.8.8 www.oolec.com a

    默认情况下dig将采用udp协议进行查询,如果要采用tcp方式,可以加上 +tcp参数

    dig www.oolec.com a +tcp

    另外一个重要的功能是+trace参数,使用这个参数之后将显示从根域逐级查询的过程,上面已经用过了,这里就不再详细介绍了。

    dig www.oolec.com a +trace

    DNS数据库的记录, 正解,反解,zone的概念:

    正解: 从主机名映射到ip地址,正解的zone通常具体以下几种标志: (A, NS, SOA)

    反解: 从ip地址映射到主机名, 反解的zone主要有 Ptr

    DNS服务器内部记录各式信息的存储我们称之为数据库。在数据库里面, 每个要解析的领域(domain),我们称之为zone。 那么什么是领域?*.sinaapp.com.cn 就是一个领域, 比如sae的DNS服务器就是管理*.sinaapp.com.cn这个领域的查询权,别人想要知道*.sinaapp.com.cn的ip地址就得询问sae的这个DNS服务器,*.sinaapp.com.cn就是一个正解的zone! 这个正解的DNS服务器的架设权限是先到先得的,只要该领域没有被占用,你抢到了,就是你的。也就是说假如我有了*.sinaapp.com这个域名的权限以后,那么我就可以自己指定这个域下的子域的所有解析规则。 比如neitui123.sinaapp.com, 比如xinyu17.sinaapp.com等等的解析规则。 这些解析规则我都可以在我sae的这台DNS服务器上通过BIND等应用层软件来设置!

    那么什么是反解的领域呢? 比如 192.168.0.* 这就是一个反解的领域,在DNS的反解析树里面,他存放的就是192.168.0.1    192.168.0.2… 等等这些ip地址对应的主机名。

    hint类型的zone是每部DNS服务器必备的,他存放的是根DNS的记录,当本DNS查询不到相关信息时,往往要询问根DNS。

    随着DNS日趋重要, 我们在注册领域名的时候往往要填写多个DNS以做备用。 如果有两部以上的DNS,网络会搜索哪一台呢?  答案是随机的!  所以,必须保证两部DNS的存储是一模一样的。 所以除了hint类型外,还有master和slave两种类型。像数据库的主从一样保持复制和同步。

     

    注:以上内容纯属个人见解,有些可能理解的不是很到位。如有错误,欢迎指出,不甚感激。