DNS ( Domain Name System ) 解析_dnsdb-程序员宅基地

技术标签: 网络  协议  运维  服务器  

From:http://blog.csdn.net/yipiankongbai/article/details/25031461 

dnsdb:https://www.dnsdb.io/zh-cn/
securitytrails.com:https://securitytrails.com/
viewdns.info:https://viewdns.info/
ip138:https://www.ip138.com/

1、域名系统

1.1 域名系统 ( DNS ) 概述

        域名系统 DNS ( Domain Name System )是因特网使用的命名系统,用来把便于人们使用的机器名字转换成为IP地址。域名系统其实就是名字系统。为什么不叫“名字”而叫 "域名" 呢?这是因为在这种因特网的命名系统中使用了许多的 "域(domain)",因此就出现了 "域名" 这个名词。"域名系统" 明确地指明这种系统是应用在因特网中。

        我们都知道,IP地址是由32位的二进制数字组成的。用户与因特网上某台主机通信时,显然不愿意使用很难记忆的长达32位的二进制主机地址。即使是 "点分十进制IP地址" 也并不太容易记忆。相反,大家愿意使用比较容易记忆的主机名字。但是,机器在处理IP数据报时,并不是使用域名而是使用 IP 地址。这是因为 IP 地址长度固定,而域名的长度不固定,机器处理起来比较困难。

        因为因特网规模很大,所以整个因特网只使用一个域名服务器是不可行的。因此,早在1983年因特网开始采用层次树状结构的命名方法,并使用分布式的域名系统 DNS。并采用客户服务器方式。DNS 使大多数名字都在本地解析(resolve),仅有少量解析需要在因特网上通信,因此 DNS系统的效率很高。由于 DNS 是分布式系统,即使单个计算机除了故障,也不会妨碍整个DNS系统的正常运行。

        域名 到 IP 地址 的解析是由分布在因特网上的许多域名服务器程序共同完成的。域名服务器程序在专设的结点上运行,而人们也常把运行域名服务器程序的机器称为域名服务器。

        域名到 IP 地址的解析过程的要点如下:当某一个应用需要把主机名解析为IP地址时,该应用进程就调用解析程序,并称为DNS的一个客户,把待解析的域名放在DNS请求报文中,以 UDP 用户数据报方式发给本地域名服务器。本地域名服务器在查找域名后,把对应的IP地址放在回答报文中返回。应用程序获得目的主机的IP地址后即可进行通信。

        若本地域名服务器不能回答该请求,则此域名服务器就暂时称为DNS的另一个客户,并向其他域名服务器发出查询请求。这种过程直至找到能够回答该请求的域名服务器为止。此过程在后面作进一步讨论。

1.2 DNS 原理

打个比方,假设你的电脑是你家,你家地址是一个IP,你要拜访百度的家,那肯定要知道百度家在哪里,你知道 baidu.com,但是电脑访问的是网络地址,是数字,其它的他都不认识,百度家IP是 220.181.38.148,但是你记不住,你电脑也不知道,那么你肯定要找备忘录啊,这时候,你电脑里有一个 Hosts 文件,这个文件是你的备忘录,然而你备忘录里什么都没写,这时候怎么办呢?是不是要去问?去哪问呢?打电话114去问,114就是情报局,里面什么都有,然后你问到了百度家的地址,接下来电脑就能顺着网线去找了。而这个 114 就是 DNS。DNS 所在服务器的配置,决定了它的的快和慢,但不管怎样,它都会为你指定一个方向,就算是它找不到,他也会问他的上一级服务器要,但这就增加了查询时间,然后你就会觉得慢。

DNS 服务器是一个常年开着的服务器,做一个的指路人,是需要很大代价的,比如服务器费、电费,然后一旦是名声好的DNS,大家都会去用,所以负担也会比较大,这个时候一台DNS服务器的配置怎么样就体现出来了,因此,免费的DNS不是很多(但也不少)。

DNS 能为你指明路,但也能暗中坑你一把,还能把你指到沟里去,这取决于你访问的DNS是否“善良”,有的 DNS 会雁过拔毛,顺走你的信息或者给你塞一张网页广告弹窗传单,这就是叫DNS污染,有的DNS会把你指向另一个地方,这就是DNS劫持。

DNS污染或者DNS劫持,经常会导致上网的时候,原本没有广告弹窗的网页,蹦出各种奇奇怪怪的广告页面,甚至会跳转到其它网页里去,有时候还会有钓鱼诈骗,导致用户信息泄露,损失财产。还有就是QQ可以正常登录、游戏也可以正常玩,但是网页无论如何都打不开。(QQ自带有自己的安全DNS,所以不受影响)(纠正:QQ是内置设定了直连腾讯服务器IP,不需要通过DNS查找自己家的服务器IP地址)

希望大家可以手动设置一下自己的网络DNS。电脑的,路由器的,甚至是手机的都可以设置一下。

设置方法是打开电脑或者路由器的网络设置,然后找到DNS来填写你想要的。

通常方便记忆,我都是设置为主114.114.114.114,备用8.8.8.8。这俩就够用了。

公共 DNS 哪个好(速度快、稳定)?https://www.zhihu.com/question/34826522

1.3 域名结构、DNS 规定

        由于因特网的用户数量较多,所以因特网在命名时采用的是层次树状结构的命名方法。任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,即 域名(domain name)。这里,"域(domain)" 是名字空间中一个可被管理的划分。

        从语法上讲,每一个域名都是:由标号(label)序列组成,而各标号之间用 点(小数点 )隔开。

DNS:Domain Name System 域名管理系统

域名 是由 圆点 分开一串单词或缩写组成的,每一个域名都对应一个惟一的IP地址,这一命名的方法或这样管理域名的系统叫做域名管理系统。 

域名解析:域名虽然便于人们记忆,但网络中的计算机之间只能互相认识 IP地址,它们之间的转换工作称为 域名解析,域名解析 需要由专门的域名解析服务器来完成,DNS 就是进行域名解析的服务器

域名 就是使用 点号 分割的一个 命名系统。

DNS 规定:域名中的 标号 都有 英文和数字 组成,每一个标号不超过63个字符(为了记忆方便,一般不会超过12个字符),也不区分大小写字母。标号中除连字符(-)外不能使用其他的标点符号。级别最低的域名写在最左边,而级别最高的字符写在最右边。由多个标号组成的完整域名总共不超过255个字符。

DNS 既不规定一个域名需要包含多少个下级域名,也不规定每一级域名代表什么意思。各级域名由其上一级的域名管理机构管理,而最高的顶级域名则由ICANN进行管理。用这种方法可使每一个域名在整个互联网范围内是唯一的,并且也容易设计出一种查找域名的机制。

        域名只是逻辑概念,并不代表计算机所在的物理地点。

据 2006 年 12 月统计,现在顶级域名TLD(Top Level Domain)已有265个,分为三大类:

  • (1) 国家顶级域名 nTLD:采用ISO3166的规定。如:cn 代表中国,us 代表美国,uk 代表英国,等等。国家域名又常记为 ccTLD ( cc表示国家代码 contry-code)。
  • (2) 通用顶级域名 gTLD:最常见的通用顶级域名有 7 个,即:com(公司企业),net(网络服务机构),org (非营利组织),int (国际组织),gov (美国的政府部门),mil (美国的军事部门)。
  • (3) 基础结构域名 (infrastructure domain):这种顶级域名只有一个,即 arpa,用于反向域名解析,因此称为反向域名。

示例:

这是中央电视台用于手法电子邮件的计算机的域名,它由三个标号组成,其中标号 com 是顶级域名,标号 cctv 是二级域名,标号 mail 是三级域名。       

1.4 DNS 的几个基本概念

zone ( 区 ) 

对于树状结构的域名空间,如果每一个节点都采用一个域名服务器,这样会使得域名服务器的数量太多,使域名服务器系统的运行效率降低。所以在 DN S中,采用划分区的方法来解决。

一个服务器所负责管辖 (或有权限) 的范围叫做区 (zone)。各单位根据具体情况来划分自己管辖范围的区。但在一个区中的所有节点必须是能够连通的。每一个区设置相应的权限域名服务器,用来保存该区中的所有主机到域名IP地址的映射。

总之,DNS服务器的管辖范围不是以 “域” 为单位,而是以 “区” 为单位。区是 DNS 服务器实际管辖的范围。区 <= 域。

        下图是 "zone (区)" 的不同划分方法的举例。假定abc公司有下属部门x和y,部门x下面有分三个分布们u,v,w,而y下面还有下属部门t。图a表示abc公司只设一个区abc.com。这是,区abc.com和域abc.com指的是同一件事。但图b表示abc公司划分为两个区:abc.com和y.abc.com。这两个区都隶属于域abc.com,都各设置了相应的权限域名服务器。不难看出,区是域的子集。

        下图是以上图b中abc公司划分的两个区为例,给出了DNS域名服务器树状结构图。这种DNS域名服务器树状结构图可以更准确地反映出DNS的分布式结构。图中的每一个域名服务器都能够部分域名到IP地址的解析。当某个DNS服务器不能进行域名到IP地址的转换时,它就会设法找因特网上别的域名服务器进行解析。

根 域

就是所谓的 ".",其实对于任一网址例如 www.baidu.com 在配置当中应该是 www.baidu.com.(最后有一点),在浏览器里输入时会省略后面的点,而这也已经成为了习惯。

根域服务器我们知道有13台,但是这是错误的观点。根域服务器只是具有13个IP地址,但机器数量却不是13台,因为这些IP地址借助了任播的技术,所以我们可以在全球设立这些IP的镜像站点,你访问到的这个IP并不是唯一的那台主机。具体的镜像分布可以参考维基百科。这些主机的内容都是一样的

根域名服务器:最高层次的域名服务器,也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。不管是哪一个本地域名服务器,若要对因特网上任何一个域名进行解析,只要自己无法解析,就首先求助根域名服务器。所以根域名服务器是最重要的域名服务器。假定所有的根域名服务器都瘫痪了,那么整个DNS系统就无法工作。需要注意的是,在很多情况下,根域名服务器并不直接把待查询的域名直接解析出IP地址,而是告诉本地域名服务器下一步应当找哪一个顶级域名服务器进行查询。

顶级域名 ( 一级域名 )

根域 下来就是 顶级域 ( 一级域 )

顶级域名服务器:负责管理在该顶级域名服务器注册的二级域名。

顶级域名 ( 一级域名 ) 有两种划分方式

  • 一种互联网刚兴起时的按照行业性质划分的 com.,net.等,
  • 一种是按国家划分的如 cn.,jp.,等。

每个域都会有域名服务器,也叫权威域名服务器。

baidu.com 就是二级顶级域名,而 www.baidu.com 却不是顶级域名,他是在 baidu.com 这个域里的一个叫做 www 的主机。

一级域之后还有二级域,三级域,只要我买了一个顶级域,并且我搭建了自己 BIND 服务器(或者其他软件搭建的)注册到互联网中,那么我就可以随意在前面多加几个域了(当然长度是有限制的)。比如 a.www.baidu.com,在这个网址中,www.baidu.com 变成了一个二级域而不是一台主机,主机名是 a。

权限域名服务器

负责一个 "zone(区)" 的域名服务器。

本地域名服务器

本地服务器不属于下图的域名服务器的层次结构,但是它对域名系统非常重要。当一个主机发出DNS查询请求时,这个查询请求报文就发送给 本地域名服务器。

1.5 域名服务器

域名服务器:就是能提供域名解析的服务器,上面的记录类型可以是 A(address)记录,NS记录(name server),MX(mail),CNAME 等。

域名解析中A记录、CNAME、MX记录、NS记录的区别和联系:http://blog.csdn.net/jiazhanwei365/article/details/8986581

A 记录是什么意思呢,就是记录一个IP地址和一个主机名字,比如我这个域名服务器所在的域test.baidu.com,我们知道这是一个二级的域名,然后我在里面有一条A记录,记录了主机为a的IP,查到了就返回给你了。

如果我现在要想baidu.com这个域名服务器查询a.test.baidu.com,那么这个顶级域名服务器就会发现你请求的这个网址在test.baidu.com这个域中,我这里记录了这个二级域的域名服务器test.baidu.com的NS的IP。我返回给你这个地址你再去查主机为a的主机把。

这些域内的域名服务器都称为权威服务器,直接提供DNS查询服务。(这些服务器可不会做递归哦)

1.6 DNS 记录类型 ( A记录、MX记录、NS记录等)

DNS A记录 NS记录 MX记录 CNAME记录 TXT记录 TTL值 PTR值

名词解释:A记录 NS记录 MX记录 CNAME记录 TXT记录 TTL值 PTR值 泛域名 泛解析 域名绑定 域名转向  

  • A 记录:就是指定域名对应的IP地址。  
  • NS 记录:就是指定由那些DNS服务器解析你的域名。  
  • SOA 记录:起始授权机构记录,用于在众多 NS记录中标记那一台是主服务器
  • MX 记录:建立电子邮箱服务,指向邮件服务器地址。

A 记录 

A(Address)记录是用来指定主机名(或域名)对应的IP地址记录。用户可以将该域名下的网站服务器指向到自己的web server上。同时也可以设置域名的子域名。通俗来说A记录就是服务器的IP,域名绑定A记录就是告诉DNS,当你输入域名的时候给你引导向设置在DNS的A记录所对应的服务器。 简单的说,A 记录是指定域名对应的IP地址。  

NS 记录

NS(Name Server)记录是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。  您注册域名时,总有默认的DNS服务器,每个注册的域名都是由一个DNS域名服务器来进行解析的,DNS服务器NS记录地址一般以以下的形式出现: ns1.domain.com、ns2.domain.com等。  简单的说,NS 记录是指定由哪个DNS服务器解析你的域名。  

MX 记录

MX(Mail Exchanger)记录是邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。例如,当Internet上的某用户要发一封信给 [email protected] 时,该用户的邮件系统通过DNS查找mydomain.com这个域名的MX记录,如果MX记录存在, 用户计算机就将邮件发送到MX记录所指定的邮件服务器上。  

CNAME 记录

CNAME(Canonical Name )别名记录,允许您将多个名字映射到同一台计算机。通常用于同时提供 WWW 和 MAIL 服务的计算机。例如,有一台计算机名为 host.mydomain.com(A记录),它同时提供 WWW 和 MAIL 服务,为了便于用户访问服务。可以为该计算机设置两个别名(CNAME):WWW 和 MAIL, 这两个别名的全称就 www.mydomain.com 和 mail.mydomain.com 实际上他们都指向 host.mydomain.com

TXT 记录

TXT记录,一般指某个主机名或域名的说明,如:admin IN TXT "管理员, 电话:XXXXXXXXXXX",mail IN TXT "邮件主机,存放在xxx , 管理人:AAA",Jim IN TXT "contact: [email protected]",也就是您可以设置 TXT 内容以便使别人联系到您。   TXT的应用之一,SPF(Sender Policy Framework)反垃圾邮件。SPF是跟DNS相关的一项技术,它的内容写在DNS的TXT类型的记录里面。MX记录的作用是给寄信者指明某个域名的邮件服务器有哪些。SPF的作用跟MX相反,它向收信者表明,哪些邮件服务器是经过某个域名认可会发送邮件的。SPF的作用主要是反垃圾邮件,主要针对那些发信人伪造域名的垃圾邮件。例如:当邮件服务器收到自称发件人是[email protected]的邮件,那么到底它是不是真的gmail.com的邮件服务器发过来的呢,我们可以查询gmail.com的SPF记录,以此防止别人伪造你来发邮件。

TTL值

TTL(Time-To-Live)原理:TTL是IP协议包中的一个值,它告诉网络路由器包在网络中的时间是否太长而应被丢弃。有很多原因使包在一定时间内不能被传递到目的地。例如,不正确的路由表可能导致包的无限循环。一个解决方法就是在一段时间后丢弃这个包,然后给发送者一个报文,由发送者决定是否要重发。TTL的初值通常是系统缺省值,是包头中的8位的域。TTL的最初设想是确定一个时间范围,超过此时间就把包丢弃。由于每个路由器都至少要把TTL域减一,TTL通常表示包在被丢弃前最多能经过的路由器个数。当记数到0时,路由器决定丢弃该包,并发送一个ICMP报文给最初的发送者。   简单的说,TTL就是一条域名解析记录在DNS服务器中的存留时间。当各地的DNS服务器接受到解析请求时,就会向域名指定的NS服务器发出解析请求从而获得解析记录;在获得这个记录之后,记录会在DNS服务器中保存一段时间,这段时间内如果再接到这个域名的解析请求,DNS服务器将不再向NS服务器发出请求,而是直接返回刚才获得的记录,而这个记录在DNS服务器上保留的时间,就是TTL值。   TTL值设置的应用: 一是增大TTL值,以节约域名解析时间,给网站访问加速。  一般情况下,域名的各种记录是极少更改的,很可能几个月、几年内都不会有什么变化。我们完全可以增大域名记录的TTL值让记录在各地DNS服务器中缓存的时间加长,这样在更长的一段时间内,我们访问这个网站时,本地ISP的DNS服务器就不需要向域名的NS服务器发出解析请求,而直接从缓存中返回域名解析记录。  二是减小TTL值,减少更换空间时的不可访问时间。  更换空间99.9%会有DNS记录更改的问题,因为缓存的问题,新的域名记录在有的地方可能生效了,但在有的地方可能等上一两天甚至更久才生效。结果就是有的人可能访问到了新服务器,有的人访问到了旧服务器。仅仅是访问的话,这也不是什么大问题,但如果涉及到了邮件发送,这个就有点麻烦了,说不定哪封重要信件就被发送到了那已经停掉的旧服务器上。 为了尽可能的减小这个各地的解析时间差,合理的做法是: 第一步,先查看域名当前的TTL值,我们假定是1天。  第二步,修改TTL值为可设定的最小值,可能的话,建议为1分钟,就是60。 第三步,等待一天,保证各地的DNS服务器缓存都过期并更新了记录。  第四步,设置修改新记录,这个时候各地的DNS就能以最快的速度更新到新的记录。  第五步,确认各地的DNS已经更新完成后,把TTL值设置成您想要的值。   一般操作系统的默认TTL值如下: TTL=32 Windows 9x/Me TTL=64 LINUX  TTL=128 Windows 200x/XP TTL=255 Unix   

PTR值

PTR是pointer的简写,用于将一个IP地址映射到对应的域名,也可以看成是A记录的反向,IP地址的反向解析。  PTR主要用于邮件服务器,比如邮箱[email protected]给邮箱[email protected]发了一封邮件,yahoo邮件服务器接到邮件时会查看这封邮件的头文件,并分析是由哪个IP地址发出来的,然后根据这个IP地址进行反向解析,如果解析结果对应XXX.com的IP地址就接受这封邮件,反之则拒绝接收这封邮件。  

泛域名 与 泛解析

泛域名是指在一个域名根下,以 *.Domain.com的形式表示这个域名根所有未建立的子域名。  泛解析是把*.Domain.com的A记录解析到某个IP 地址上,通过访问任意的前缀.domain.com都能访问到你解析的站点上。  

域名绑定

域名绑定是指将域名指向服务器IP的操作。  

域名转向

域名转向又称为域名指向或域名转发,当用户地址栏中输入您的域名时,将会自动跳转到您所指定的另一个域名。一般是使用短的好记的域名转向复杂难记的域名。

2、域名 的 解析过程

DNS 中的域名服务器最主要的功能就是响应域名解析器的查询请求(这个域名解析器可能是PC端的解析器,也可能是具有解析功能的另一台域名服务器)。域名解析器是安装在PC端的软件,它负责向本地DNS(local DNS)发起域名解析请求。

DNS 系统中有三类查询

递归查询

域名服务器将代替请求的客户机(下级DNS服务器)进行域名查询,如果域名服务器不能直接回答,则域名服务器会在域各树种的各个分支的上下进行递归查询,最终将查询结果返回给客户机,在域名查询期间,客户机始终处于等待状态。递归解析的过程如下图所示:

上图中需要注意的是,许多授权域名服务器都不会提供递归查询的功能(为什么?),比如根域名服务器.和二级域名服务器.com都不提供递归查询的功能,所以真正意义上的递归查询是由Local DNS来完成的。

一般情况下,递归查询的时候会收到以下三种可能的返回结果:

  • 1):一个或若干个A记录,或者带有CNAME链的A记录。A记录即要请求的域名的IP地址,带有CNAME链的A记录就像上一篇博客“DNS开源服务器BIND最小配置详解”里面请求ftp.cobb.com时会先将ftp.cobb.com CNAME到 ljx.cobb.com,然后返回ljx.cobb.com的A记录。
  • 2):一个标示域或主机不存在的错误信息。需要注意的是这个错误信息也可能含有CNAME记录。例如我要请求ftp.cobb.com,而我的域名服务器将ftp.cobb.com CNAME到了ljx.cobb.com,但是ljx.cobb.com这个主机不存在,这个时候就返回CNAME记录和错误信息。
  • 3):暂时性的错误信息。它主要是因为网络不可达该主机,网络不可达不一定表明该主机不存在。

迭代查询

域名服务器在返回一些下一次查询的指引或者主机IP地址,域名解析器在收到指引后会再次向这些指引发起查询请求,直到收到主机IP地址。迭代解析的过程如下图所示:

一般情况下,递归查询的时候会收到以下三种可能的返回结果:

  • 1. A记录或者带有CNAME链的A记录。
  • 2. 标示域或主机不存在的错误信息。
  • 3. 暂时性错误。可能因为网络不可达。
  • 4. 可以给出下一步域名解析的域名服务器(包括它的IP地址)的列表。告诉解析器再去哪里进一步解析。

反向查询

反向查询是根据一个资源记录查询域名。这个资源记录可能是A记录,CNAME记录或者MX记录(见 "DNS开源服务器BIND最小配置详解")。

为了实现反向查询,DNS中有一个特殊的域名IN-ADDR.ARPA来专门作反向查询定义。详情见RFC3425

主机 ---> 本地 域名服务器

        一、主机向本地域名服务器的查询一般都是采用递归查询。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。

本地域名服务器 ---> 根 域名服务器

       二、本地域名服务器向根域名服务器的查询的迭代查询。迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。

递归查询、迭代查询 区别

下图给出了这两种查询的差别

DNS 解析流程 :示例 1:

下面举一个例子演示整个查询过程:

假定域名为 m.xyz.com 的主机想知道另一个主机 y.abc.com 的IP地址。例如,主机 m.xyz.com 打算发送邮件给 y.abc.com。这时就必须知道主机 y.abc.com 的IP地址。下面是上图 a 的几个查询步骤:

  • 1、主机 m.abc.com 先向本地服务器 dns.xyz.com 进行递归查询。
  • 2、本地服务器采用迭代查询。它先向一个根域名服务器查询。
  • 3、根域名服务器告诉本地服务器,下一次应查询的顶级域名服务器 dns.com 的IP地址。
  • 4、本地域名服务器向顶级域名服务器 dns.com进行查询。
  • 5、顶级域名服务器 dns.com 告诉本地域名服务器,下一步应查询的权限服务器 dns.abc.com的IP地址。
  • 6、本地域名服务器向权限域名服务器 dns.abc.com进行查询。
  • 7、权限域名服务器 dns.abc.com告诉本地域名服务器,所查询的主机的IP地址。
  • 8、本地域名服务器最后把查询结果告诉 m.xyz.com。

整个查询过程共用到了8个UDP报文。

为了提高 DNS 查询效率,并减轻服务器的负荷和减少因特网上的 DNS 查询报文数量,在域名服务器中广泛使用了高速缓存,用来存放最近查询过的域名以及从何处获得域名映射信息的记录。

不仅在域名服务器中需要高速缓存,在主机中也需要。就是 hosts 文件,位置:C:\windows\system32\drivers\etc\

许多主机在启动时从本地服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到名字时才使用域名服务器。维护本地域名服务器数据库的主机应当定期地检查域名服务器以获取新的映射信息,而且主机必须从缓存中删除无效的项。由于域名改动并不频繁,大多数网点不需花精力就能维护数据库的一致性。

DNS 解析流程 :示例 2:

From:http://blog.chinaunix.net/uid-28216282-id-3757849.html

DNS 在53端口上监听请求并提供响应的服务。出于性能的考虑,DNS查询请求用UDP协议交互并且每个请求的大小小于512字节,但是如果返回的请求大小大于512字节,交互双方会协商使用TCP协议。

DNS 是怎么解析一个域名的呢?

  • 1. 现在有一台计算机,通过 ISP 接入了互联网,那么 ISP 就会给我分配一个DNS服务器,这个DNS服务器不是权威服务器,而是相当于一个代理的 dns 解析服务器,他会帮你迭代权威服务器返回的应答,然后把最终查到IP返回给你。
  • 2. 现在的我计算机要向这台 ISPDNS 发起请求查询 www.baidu.com 这个域名了,( 准确来说不是 ISPDNS,而应该是用户自己电脑网络设置里的 DNS,并不一定是 ISPDNS。比如也有可能你手工设置了8.8.8.8)
  • 3. ISPDNS 拿到请求后,先检查一下自己的缓存中有没有这个地址,有的话就直接返回。这个时候拿到的 ip 地址,会被标记为非权威服务器的应答。
  • 4. 如果缓存中没有的话,ISPDNS 会从配置文件里面读取 13 个根域名服务器的地址(这些地址是不变的,直接在 BIND 的配置文件中),
  • 5. 然后向其中一台发起请求。
  • 6. 根服务器拿到这个请求后,知道他是 com. 这个顶级域名下的,所以就会返回 com 域中的NS 记录,一般来说是13台主机名和IP。
  • 7. 然后 ISPDNS 向其中一台再次发起请求,com 域的服务器发现你这请求是baidu.com这个域的,我一查发现了这个域的 NS,那我就返回给你,你再去查。(目前百度有4台 baidu.com 的顶级域名服务器)。
  • 8. ISPDNS 不厌其烦的再次向 baidu.com 这个域的权威服务器发起请求,baidu.com 收到之后,查了下有 www 的这台主机,就把这个 IP 返回给你了,
  • 9. 然后 ISPDNS 拿到了之后,将其返回给了客户端,并且把这个保存在高速缓存中。

下面我们来用 nslookup 这个工具详细来说一下解析步骤:

用 dig 工具来跟踪一下把( linux系统自带有)。dig 工具会在本地计算机做迭代,然后记录查询的过程。

第一步是向我这台机器的 ISPDNS 获取到根域服务区的13个 IP 和 主机名[b-j].root-servers.net.。

第二步是向其中的一台根域服务器(Servername 就是末行小括号里面的)发送 www.baidu.com 的查询请求,他返回了 com. 顶级域的服务器IP(未显示)和名称,

第三步,便向 com. 域的一台服务器 192.33.4.12 请求 www.baidu.com,他返回了 baidu.com 域的服务器IP(未显示)和名称,百度有四台顶级域的服务器

【此处可以用dig @192.33.4.12 www.baidu.com 查看返回的百度顶级域名服务器IP地址】。

第四步呢,向百度的顶级域服务器(202.108.22.220)请求 www.baidu.com,他发现这个 www 有个别名,而不是一台主机,别名是 www.a.shifen.com。

按照一般的逻辑,当 dns 请求到别名的时候,查询会终止,而是重新发起查询别名的请求,所以此处应该返回的是 www.a.shifen.com 而已。

但是为什么返回 a.shifen.com 的这个域的 NS 呢 ?

我们可以尝试下面的这个命令:dig +trace  shifen.com 看看有什么结果。

你会发现第三步时 shifen.com 这个顶级域的域名服务器和 baidu.com 这个域的域名服务器是同一台主机(即:dns.baidu.com)!

当我拿到 www.baidu.com 的别名 www.a.shifen.com 的时候,我本来需要重新到 com 域查找shifen.com 域的 NS,但是因为这两个域在同一台NS上,所以直接向本机发起了,

shifen.com 域发现请求的 www.a.shifen.com 是属于 a.shifen.com这个域的,

于是就把 a.shifen.com 的这个 NS 和 IP 返回,让我到 a.shifen.com 这个域的域名服务器上查询www.a.shifen.com。

于是我便从 ns X .a.shifen.com 中一台拿到了一条 A 记录,最终的最终也便是 www.baidu.com 的IP 地址了。【 此处也可以用 dig +trace www.a.shifen.com】跟踪一下

用一个图来说明一下(图中第三步的全世界只有13台是错误的)

以下内容为在虚拟机中搭建 local dns 服务器得到的实验数据,纠正上述结论

在上面的分析中,我们用dig工具进行了追踪,但是dig没有继续追踪当我们从baidu.com拿到cname和ns2.a.shifen.com的IP之后的事情。

我们就所以然的下结论认为local dns会向ns2.a.shifen.com请求www.a.shifenc.om。

其实这个想法是错误,在自己的本地搭建一个local dns,抓取整个解析过程中是所有包,看看就明白拉。

实际的结果是虽然dns.baidu.com返回了a.shifen.com域的服务器地址和IP,

但是local dns并不是直接向上述返回的IP请求www.a.shifen.com,而是再一次去请求com域,得到shifen.com域的服务器(也就是baidu.com的那四台),

然后又请求www.a.shifen.com,返回a.shifen.com的域的服务器,最后才是去请求www.a.shifen.com,

虽然上面已经返回了IP,但是实验的结果就是再走一遍shifen.com域的查询。

上图就是localdns在解析www.baidu.com的抓包全过程。蓝色那条就是在收到cname和响应的a.shifen.com的域名服务器IP地址之后,继续向com域请求shifen.com。

这个图充分说明了返回cname的同时也返回了ns2.a.shifen.com的IP。

因此总结一下便是

  • ① 本机向 local dns 请求 www.baidu.com
  • ② local dns 向根域请求 www.baidu.com,根域返回 com. 域的服务器IP
  • ③ 向 com. 域请求 www.baidu.com,com.域返回 baidu.com 域的服务器IP
  • ④ 向 baidu.com 请求 www.baidu.com,返回 cname www.a.shifen.com 和 a.shifen.com域的服务器 IP
  • ⑤ 向 root 域 请求 www.a.shifen.com
  • ⑥ 向 com. 域请求 www.a.shife.com
  • ⑦ 向 shifen.com 请求
  • ⑧ 向 a.shifen.com域 请求
  • ⑨ 拿到 www.a.shifen.com 的 IP
  • ⑩ local dns 返回本机 www.baidu.com cname www.a.shifen.com 以及 www.a.shifen.com的IP

DNS 解析流程 :示例 3:

DNS,就是 Domain Name System 的缩写,翻译过来就是域名系统,是互联网上作为域名和IP地址相互映射的一个分布式数据库。DNS能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。下面这张图,详细说明了一个DNS域名解析的全过程:

下面来详细解释 DNS 域名解析的过程:

网络客户端就是我们平常使用的电脑,打开浏览器,输入一个域名。比如输入www.163.com,这时,你使用的电脑会发出一个DNS请求到本地DNS服务器。本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。

查询www.163.com的DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果。如果没有,本地DNS服务器还要向DNS根服务器进行查询。

根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。
本地DNS服务器继续向域服务器发出请求,在这个例子中,请求的对象是.com域服务器。.com域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你的域名的解析服务器的地址。

最后,本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。

关于DNS解析的TTL参数:

我们在配置DNS解析的时候,有一个参数常常容易忽略,就是DNS解析的TTL参数,Time To Live。TTL这个参数告诉本地DNS服务器,域名缓存的最长时间。用阿里云解析来举例,阿里云解析默认的TTL是10分钟,10分钟的含义是,本地DNS服务器对于域名的缓存时间是10分钟,10分钟之后,本地DNS服务器就会删除这条记录,删除之后,如果有用户访问这个域名,就要重复一遍上述复杂的流程。

其实,如果网站已经进入稳定发展的状态,不会轻易更换IP地址,我们完全可以将TTL设置到协议最大值,即24小时。带来的好处是,让域名解析记录能够更长时间的存放在本地DNS服务器中,以加快所有用户的访问。设置成24小时,其实,还解决了Googlebot在全球部署的服务器抓取网站可能带来的问题,这个问题麦新杰专门有一篇博文,请参考:“Googlebot无法访问您的站点”问题理解和处理方法

阿里云之所以只将TTL设置成10分钟,是为了让域名解析更快生效而已。因为之前的解析会在最长10分钟之后失效(本地DNS服务器将对应的解析条目删除),然后新的解析生效。如果是24小时,这个生效的时间最长就是24小时,甚至更长(本地DNS服务器要有用户请求,才会发起查询)。

域 维护

域维护 是指通过DNS协议来在主域名服务器和从域名服务器之间维护同一个zone文件。

DNS中有两种域维护手段,

  • 一种是全量传输AXFR(full zone transfer),
  • 另一种是增量传输 IXFR(incremental zone transfer)。

全量传输 AXFR

全量传输时,从域名服务器从主域名服务器上请求zone文件,poll的时间间隔由SOA记录中的refresh标签定义。请求zone文件的过程是从域名服务器向主域名服务器发送查询来实现,如果主域名服务器中SOA记录中的序列号(serial number标签定义)大于从域名服务器SOA记录的序列号,从域名服务器就会向主域名服务器发送全量传输请求。所以主域名服务器一旦改变了zone文件,则需要增加它该zone中的序列号。整个SOA记录的完整格式见下图:

通常情况下,序列号sn遵循“年+月+日+编号”的格式,如图中的2003080803表示该zone是2003年8月8日的第三次更新。

全量传输是在 TCP 的 53 端口上进行。

增量传输 IXFR

传递非常大的 zone 文件是非常耗资源的(时间、带宽等),尤其是只有 zone 中的一个记录改变的时候,没有必要传递整个zone文件,增量传输是允许主域名服务器和从域名服务器之间只传输那些改变的记录。

需要注意的是,不是所有的域名服务器都支持增量传输,当不支持增量传输时,主从间就采用全量传输的方式。

通告 NOTIFY

从上面的分析中可以看出,从服务器每隔refresh时间向主服务器发送请求,只有主服务器的SOA中的序列号大于从服务器的序列号才传输,但是如果这个时间间隔比较大的话(比如12个小时),快速变化的网络环境可能不允许有如此大时间的差异。

所以在实现了通告消息的DNS集群中,DNS主服务器的zone文件发生改变后,它立即向从服务器发送一个NOTIFY消息,告诉从服务器我的zone文件发生改变了,接着从服务器马上对比两者的序列号,再采用上面介绍的全量传输或者增量传输的方法请求zone文件。

bind  本身支持通告,通告的配置是在named.conf中的zone中的option中配置,配置指令是notify, also-notify和notify-source,具体见这里

动态更新

每次需要更新zone文件的时候都需要停止域名服务器并重启,这样当zone文件很多的时候域名服务器重启时加载zone文件需要很多的时间。所以需要有一种不停止查询服务而且快速更新zone文件地方机制,这种机制主要有两种

  • 一种是允许外部进程在服务器运行的时候更新zone文件
  • 另外一种是将zone中的资源记录RR存储在数据库中,每次查找zone中记录的时候动态读取

DNS 安全

像其他的任何公共服务一样,DNS也会受到各种各样的安全威胁。这节看看DNS服务器会受到什么样的安全威胁?聪明的人们又是怎么应对这些威胁的。

为了了解DNS受到的安全威胁和响应的应对措施,首先需要了解一下DNS的正常数据流。如下图所示:

上图中的每个数据流都会受到响应的安全威胁:

  • 1)zone文件受到的威胁可能有:文件被无意或有意篡改或删除。这种威胁是较好应对的,最主要的方法是制定很好的系统管理策略,zone文件和其他的配置文件需要严格而安全的读写权限。
  • 2)3)动态更新和域传输受到的威胁可能有:未授权的更新、zone文件在传输过程中被篡改(经常是把域名篡改为别的IP)。这种威胁通常的应对方法是TSIG(Transaction SIGnature)策略(这个策略定义在RFC2845中)。TSIG策略中会计算出一个key,这个key是通过单向散列(能轻松地从输入得出值,但很难通过值猜出输入)计算出来的,然后传输zone文件的双方在传输过程中都带上这个key,如果key不对就拒绝传输。
  • 4)5)远程查询受到的威胁可能有:cache污染(IP欺骗、数据拦截或错误的master主机地址)。cache污染是指cache中内容可能将您的域名重定向到了一个错误的服务器。这种威胁通常的应对方法是域名系统安全扩展(DNSSEC, Domain Name System Security Extensions),它是为DNS客户端(解析器)提供的的DNS数据来源,数据完整性验证,但不提供或机密性和认证的拒绝存在扩展集。关于DNSSEC的资料见这里。关于这部分内容,我会在后续的博客中专门介绍, 请关注:www.cnblogs.com/cobbliu

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/freeking101/article/details/69054528

智能推荐

类加载的过程中,不同类加载器的加载路径测试_代码查看扩展类加载器加载路径-程序员宅基地

文章浏览阅读554次。我们知道JVM加载类的过程遵循“双亲委派机制”,每当JVM启动时,是通过一个ClassLoader来加载class文件的。ClassLoader有三个实现,分别是:BootstrapLoader,ExtClassLoader和AppClassLoader.三个类加载器的作用不同,所加载的class文件也不相同。下面我们通过代码实现查看三个类加载器分别所加载的class路径/** * * @author JJ_knows * */public class ClassLoaderTe_代码查看扩展类加载器加载路径

Android启动(一):Linux启动流程_android linux 加载 启动地址-程序员宅基地

文章浏览阅读219次。发现一个介绍Android启动的系列文章,正文如下:=================================================================================================================1 Bootloader对于一般的ARM处理器,CPU上电或复位执行第一条指令所在地址,即第一段程_android linux 加载 启动地址

汽车小游戏简易制作_游戏小车程序-程序员宅基地

文章浏览阅读823次。跟着玉涛学长学做游戏一,首先要明确你要做什么游戏,所做的游戏要分哪几个类。我要做的是小汽车类的游戏,所以我要分以下几个类:小汽车一个类主体界面一个类按键监听也可以另作一个类二,创建一个文件夹 CarGame1.文件夹下创建一个包(package).2.先创建主体界面类(GameInterface)1.需要用到画笔和线程,还有类与对象的知识。首先 GameInter..._游戏小车程序

INS-40718 和 INS - 30516-程序员宅基地

文章浏览阅读1.1k次。RAC 安装的时候报错,INS-40718这个是自己填写的 scan name 和 /etc/hosts 里定义的不一致 可以cat/etc/hosts 看一下INS - 30516这个原因是 由于用使用原来安装的盘,没有清理过,所以报错清理一下就好dd if=/dev/zero of=/dev/raw/raw1 bs=1M..._ins30516

编程语言关于thinkphp邮箱验证码前后台_thinkphp6qq邮箱验证码-程序员宅基地

文章浏览阅读429次。编程语言关于thinkphp邮箱验证码前后台下面由thinkphp教程栏目给大家介绍关于thinkphp邮箱验证码前后台,希望对需要的朋友有所帮助!thinkphp邮箱验证码前后台思路:前台用jquery.validate验证,验证邮箱是否存在等等,交互用ajax来做。后端用邮箱类库直接上代码吧准备:1.下载PHPMailer类库,放到Application/Thinkphp/Library/Vendor/中,在网上搜搜,搜不到可以联系我2.开启SMTP,举个网易邮箱的例子_thinkphp6qq邮箱验证码

error C2660: 'wcscpy_s' : function does not take 2 arguments_error c2660 : function does not take 1 arguments-程序员宅基地

文章浏览阅读6.6k次。_tcscpy_s(m_item.sztype, ITEMTYPE_TEXT); tptextitem.cpp(119) : error C2660: 'wcscpy_s' : function does not take 2 arguments 原因选择的字符集不对。修改:Property -> C/C++ -> Language -> Treat wchar_t as Built-in Type 选择为 No (/Zc_error c2660 : function does not take 1 arguments

随便推点

xutils请求shh框架发布的json数据(类似from表单)_xutils设置form表单-程序员宅基地

文章浏览阅读1.2k次。在Android上面测试的小demo,通过xutils这个框架,轻松发起post或get,同时又同步,异步等方式package com.example.xutilsdemo;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.util.Arra_xutils设置form表单

[Javascript] 解决 IE6 中 png 图片背景不支持透明效果的问题_img id="img_transparent-程序员宅基地

文章浏览阅读331次。/** * Description: * Some functions to fix the PNG files transparent problem in IE6 * * History: * Created by Moky @ 2008-09-19 *//* Usage: // just i_img id="img_transparent

SpringMVC——-Controller返回格式化数据如JSON、XML的配置方式和机制_c# controller接收处理json、xml格式数据-程序员宅基地

文章浏览阅读7.1k次。1、本文内容我们在Web项目开发过程中,一般来说访问一个处理器,然后会返回一个视图,或者跳转到另外的处理器。但是随着项目越来越复杂,需求越来越复杂,对于处理器返回数据的类型要求也越来越多。比如要求能够返回JSON类型的数据、或者能够返回XML格式的数据,或者返回二进制的数据流等等。SpringMVC提供了这样的一个机制,允许控制器返回的数据不经过正常的视图处理流程,而是直接将返回的数据写入响应..._c# controller接收处理json、xml格式数据

如何使用libsvm进行分类(一)_libsvm中一对一分类代码-程序员宅基地

文章浏览阅读4k次。参考:点击打开链接环境为:matlab2014a+libsvm-3.20测试小例子:data = [176 70;180 80;161 45;163 47];label = [1;1;-1;-1];model = svmtrain(label,data);testdata = [190 85];testdatalabel = -1;[predictlabel,ac_libsvm中一对一分类代码

network-manager 查看设备显示WiFi “不可用” || 未发现 SSID 是“ wifi名称”的网络_nmcli 提示找不到ssid-程序员宅基地

文章浏览阅读5.9k次,点赞5次,收藏14次。最近想通过network-manager 来管理树莓派的无有线连接网络,在测试时出现 设备为WiFi状态为 不可用,但是卸载了network-manager, wifi可以正常连接。显示如下倒数第二行:最后发现是之前安装的wpasupplicant 和 network-manager 冲突了。network-manager 的使用需要依赖到wpasupplicant,可能..._nmcli 提示找不到ssid

嵌入式环境搭建之ssh_怎么用ssh进嵌入式系统-程序员宅基地

文章浏览阅读6k次,点赞2次,收藏3次。快毕业了。临走前帮导师搭建了gerrit,git服务器,其中涉及ssh的知识,就总结了下。希望对大家有帮助一、前言(ssh出世的原因)万物有因就有果,既然ssh存在,就必然有它存在的理由!许多网络程序,如telnet、rsh、rlogin或rexec,用明文(plain text)传送口令和秘密的信息,所以可利用任何连接到网络上的计算机监听这些程序和服务器之间的通信并获取口令和秘密信息。现在,te_怎么用ssh进嵌入式系统

推荐文章

热门文章

相关标签