linux下DNS解析(nslookup、dig、host)

先说一下DNS的几个基本概念:linux


一. 根域


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

根域服务器咱们知道有13台,可是这是错误的观点。缓存

根域服务器只是具备13个IP地址,但机器数量却不是13台,由于这些IP地址借助了任播的技术,因此咱们能够在全球设立这些IP的镜像站点,你访问到的这个IP并非惟一的那台主机。服务器

具体的镜像分布能够参考维基百科。这些主机的内容都是同样的

网络

二. 域的划分

根域下来就是顶级域或者叫一级域,dom

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

具体多少你能够本身去查,咱们这里不关心。工具

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

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

一级域以后还有二级域,三级域,只要我买了一个顶级域,而且我搭建了本身BIND服务器(或者其余软件搭建的)注册到互联网中,那么我就能够随意在前面多加几个域了(固然长度是有限制的)。

好比a.www.baidu.com,在这个网址中,www.baidu.com变成了一个二级域而不是一台主机,主机名是a。

三. 域名服务器

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

(详解参见博客:域名解析中A记录、CNAME、MX记录、NS记录的区别和联系

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

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

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

四.解析过程

那么咱们的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 这个工具详细来讲一下解析步骤:


从上图咱们能够看到:

第一行Server是:DNS服务器的主机名--210.32.32.1

第二行Address是: 它的IP地址--210.32.32.1#53

下面的Name是:解析的URL-- www.jsjzx.com

Address是:解析出来的IP--112.121.162.168


可是也有像百度这样的DNS比较复杂的解析:

你会发现百度有一个cname = www.a.shifen.com 的别名。

这是怎么一个过程呢?

咱们用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

⑩localdns返回本机www.baidu.com cname www.a.shifen.com 以及 www.a.shifen.com的IP

 

/etc/hosts :记录hostname对应的ip地址

/etc/resolv.conf :设置DNS服务器的ip地址

/etc/host.conf :指定域名解析的顺序(是从本地的hosts文件解析仍是从DNS解析)



DNS的查询指令:host、nslookup、dig

host 语法:

Host [-a] [FQDN] [server]

Host -l [domain] [server]


参数说明:

-a :表明列出该主机全部的相关资讯,包括IP、TTL等

-l :若后面接的那个domain设定容许allow-transfer时,则列出该domain所管理的全部主机名称对应资料。

Server: 这个参数无关紧要,当想要利用非/etc/resolv.conf内的主机来查询主机名称与ip的对应时,就能够利用这个参数了。



Nslookup 语法:

Nslookup [FQDN] [server]

Nslookup

参数说明:

能够直接在nslookup后加上待查询的主机名称或者ip,【server】无关紧要。

若是在nslookup后面没有加上任何主机名称或ip,那将进入nslookup的查询功能。在nslookup的查询功能当中,能够输入其余参数来进行特殊查询,例如:

Set type=any    :列出全部的信息

Set type=mx    :列出与mx相关的信息



Dig 语法:

Dig [@server] [FQDN] [type]

参数说明:

@server :若是不想以/etc/resolv.conf来做为dns主机,则能够在此填入其余的ip

Type :预设是查询A记录,你能够在这里写入其余的记录,如:MX,NS等。

此功能亦可以使用[-t type]来处理。

下面是 dig 的一些比较经常使用的命令:


# dig 最基本的用法

dig @server sina.com.cn.


# 用 dig 查看 zone 数据传输

dig @server zx.xmgd.com. AXFR


# 用 dig 查看 zone 数据的增量传输

dig @server zx.xmgd.com. IXFR=N


# 用 dig 查看反向解析

dig -x 210.52.83.228 @server


# 查找一个域的受权 dns 服务器

dig xmgd.com. +nssearch


# 从根服务器开始追踪一个域名的解析过程

dig xmgd.com +trace


# 查看你使用的是哪一个 F root dns server

dig +norec @F.ROOT-SERVERS.NET HOSTNAME.BIND CHAOS TXT

相关文章
相关标签/搜索