Linux学习之CentOS(三十三)--DNS基础及域名系统架构
本篇文章将主要讲解DNS的一些基础知识以及域名的系统架构,当然这篇随笔是为后面的配置自己的DNS服务器来奠定基础的... 一、域名 在讲解DNS之前,首先粗略的说一下域名这个东西 比如说我们在用浏览器访问网址的时候,我们输入的网站的地址就是一个域名,例如 www.google.com,但其实我们知道我们标志互联网中的每一个机器都是有一个IP地址的,我们若需要访问一个网站的服务器,实际上是需要输入该网站的IP地址来进行访问的,但是IP地址往往难以记忆,IPv4尚且难记,IPv6就更不用说了,所以我们就通过使用域名来对其进行管理,但是在访问的时候,系统底层还是通过ip地址来进行访问的,域名和IP地址直接的转换就是通过DNS服务器来完成的。首先我们先来看看域名的一些知识,就拿 www.google.com 这个域名来说。 通常对于一个域名来说,其主要分为3个部分 www.google.com主机名域名类型 ①类型 标志着该域名的类型(com、cn、edu、org等) ②域名 域的名称,如上面的 google ③主机名 域里面一台主机的名字,如www这台主机 其实严格的来说,域名后面还有一个 ".",所以完整的域名应该是 www.google.com. 对于域名来说,其大小写是不敏感的,在浏览器里面我们输入大小写都指向的同一个ip地址 二、DNS 从上面可以知道,每一个域名都对应了一个IP地址,我们访问一个域名时,其实底层的操作系统进行通信时还是通过IP地址来进行通信,所以我们就需要有一个服务能将域名转换成对应的IP地址,或者反向的将IP地址转换成域名,这个服务就是DNS(Domain Name System)。 DNS提供的服务就是在IP和域名之间进行转换,DNS服务是由DNS服务器来提供的,一般提供DNS服务的都有一个单独的DNS服务器,这个DNS服务器的作用就是用来保存我们的域名到其IP地址之间的解析,例如我们在访问 www.google.com 这个域名的时候,我们的主机首先会向一个DNS服务器发起一个DNS的请求,请求DNS服务器告诉我www.google.com这个域名的IP地址,此时DNS服务器就会给我们返回该域名的IP地址,这个时候我们再根据这个IP地址访问www.google.com这台服务器 DNS服务就是将我们的域名解析成其对应的IP地址,我们日常使用的支持网络的计算机一般是做为DNS客户端来使用的,应用程序、服务、进程等等通过操作系统底层的功能发起对DNS服务器的查询,来对指定的域名进行解析 在Linux系统当中,一般是使用系统底层提供的gethostbyname()这个函数来进行域名解析的 在Linux系统当中,解析域名通常可以基于以下三种方式: ①文件 (/etc/hosts、/etc/networks) hosts是主机文件,里面存放的是域名到IP地址的一个对应,在windows下也有这样一个文件,通常linux下通过文件来解析域名都是通过 /etc/hosts 这个文件 [root@xiaoluo~]#cat/etc/hosts127.0.0.1localhostlocalhost.localdomainlocalhost4localhost4.localdomain4 ::1localhostlocalhost.localdomainlocalhost6localhost6.localdomain6 因为hosts文件里面保存的就是域名到IP地址直接的对应关系,我们也可以手动的去将我们的域名指定为其它的IP,例如我们将 www.google.com 的 ip 修改为 192.168.1.1 [root@xiaoluo~]#pingwww.google.com PINGwww.google.com(173.194.72.103)56(84)bytesofdata. [root@xiaoluo~]#vim/etc/hosts127.0.0.1localhostlocalhost.localdomainlocalhost4localhost4.localdomain4 ::1localhostlocalhost.localdomainlocalhost6localhost6.localdomain6192.168.1.1www.google.com[root@xiaoluo~]#pingwww.google.com PINGwww.google.com(192.168.1.1)56(84)bytesofdata. 我们看到,我们在 /etc/hosts 文件里加上 192.168.1.1 www.google.com 这条映射关系以后,此时在ping www.google.com时,其ip地址变成了我们自己设定的 192.168.1.1了,但是我们知道其IP地址肯定不是这个。为此,我们可以在操作系统上将一些域名的IP地址直接写到 hosts 文件里面,这样在进行解析时可以直接去访问我们指定的IP地址 ②DNS 这个就是通过我们指定的DNS服务器来对我们的域名进行解析了 ③NIS 这个用的非常少 我们可以通过查看 /etc/nsswitch.conf 这个文件来查看DNS解析的顺序 [root@xiaoluo~]#cat/etc/nsswitch.conf # #/etc/nsswitch.conf # #AnexampleNameServiceSwitchconfigfile.Thisfileshouldbe #sortedwiththemost-usedservicesatthebeginning. # #Theentry'[NOTFOUND=return]'meansthatthesearchforan #entryshouldstopifthesearchinthepreviousentryturned #upnothing.Notethatifthesearchfailedduetosomeotherreason #(likenoNISserverresponding)thenthesearchcontinueswiththe #nextentry. # #Validentriesinclude: # #nisplusUseNIS+(NISversion3) #nisUseNIS(NISversion2),alsocalledYP #dnsUseDNS(DomainNameService) #filesUsethelocalfiles #dbUsethelocaldatabase(.db)files #compatUseNISoncompatmode #hesiodUseHesiodforuserlookups #[NOTFOUND=return]Stopsearchingifnotfoundsofar # #Tousedb,putthe"db"infrontof"files"forentriesyouwanttobe #lookedupfirstinthedatabases # #Example: #passwd:dbfilesnisplusnis #shadow:dbfilesnisplusnis #group:dbfilesnisplusnispasswd:files shadow:files group:files#hosts:dbfilesnisplusnisdns hosts:filesdns#Example-obeyonlywhatnisplustellsus... #services:nisplus[NOTFOUND=return]files #networks:nisplus[NOTFOUND=return]files #protocols:nisplus[NOTFOUND=return]files #rpc:nisplus[NOTFOUND=return]files #ethers:nisplus[NOTFOUND=return]files #netmasks:nisplus[NOTFOUND=return]files bootparams:nisplus[NOTFOUND=return]files ethers:files netmasks:files networks:files protocols:files rpc:files services:files netgroup:nisplus publickey:nisplus automount:filesnisplus aliases:filesnisplus 我们看到我们 hosts 解析的顺序先是通过 file 文件来进行解析,再是通过DNS进行解析,我们可以直接修改该文件来控制我们的查询顺序 三、DNS查询 我们可以通过 host 或者 dig 命令来查询我们域名对应的IP地址 ①host(显示内容较少) [root@xiaoluo~]#hostwww.google.com www.google.comhasaddress74.125.31.104www.google.comhasaddress74.125.31.147www.google.comhasaddress74.125.31.106www.google.comhasaddress74.125.31.99www.google.comhasaddress74.125.31.103www.google.comhasaddress74.125.31.105www.google.comhasIPv6address2404:6800:4008:c01::6a ②dig(显示内容详细) [root@xiaoluo~]#digwww.google.com ;<<>>DiG9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6<<>>www.google.com ;;globaloptions:+cmd ;;Gotanswer: ;;->>HEADER<<-opcode:QUERY,status:NOERROR,id:65143;;flags:qrrdra;QUERY:1,ANSWER:6,AUTHORITY:0,ADDITIONAL:0;;QUESTIONSECTION: ;www.google.com.INA ;;ANSWERSECTION: www.google.com.5INA74.125.31.104www.google.com.5INA74.125.31.147www.google.com.5INA74.125.31.106www.google.com.5INA74.125.31.99www.google.com.5INA74.125.31.103www.google.com.5INA74.125.31.105;;Querytime:2012msec ;;SERVER:192.168.198.2#53(192.168.198.2) ;;WHEN:MonJun319:49:552013;;MSGSIZErcvd:128 我们看到dig命令查询出来的内容非常多,对于里面的每一行语句的含义,将在后续随笔中详细讲解 对于DNS查询来说,其实DNS是一个树状的结构,查询的时候是根据域名从右到左来进行查询,域名每一级由独立的一个或者多个DNS服务器来进行查询 我们看到,当我们在对 www.google.com 这个域名进行查询时,首先是通过 . 这个根DNS服务器去查询 com 这个类型的 DNS 服务器地址,然后再通过 com 对应的多台DNS服务器(每一层都有多个DNS服务器)去查询 google 这个域名的DNS服务器,最后再通过 google的DNS服务器去查询主机名为 www 的这台主机的资源记录,从而得到 www.google.com 的IP地址。我们可以通过dig +trace www.google.com这个命令来追踪整个DNS查询的过程 [root@xiaoluo~]#dig+tracewww.google.com;<<>>DiG9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6<<>>+tracewww.google.com ;;globaloptions:+cmd .5INNSf.root-servers.net. .5INNSg.root-servers.net. .5INNSh.root-servers.net. .5INNSi.root-servers.net. .5INNSj.root-servers.net. .5INNSk.root-servers.net. .5INNSl.root-servers.net. .5INNSm.root-servers.net. .5INNSa.root-servers.net. .5INNSb.root-servers.net. .5INNSc.root-servers.net. .5INNSd.root-servers.net. .5INNSe.root-servers.net. ;;Received508bytesfrom192.168.198.2#53(192.168.198.2)in28138ms com.172800INNSa.gtld-servers.net. com.172800INNSb.gtld-servers.net. com.172800INNSc.gtld-servers.net. com.172800INNSd.gtld-servers.net. com.172800INNSe.gtld-servers.net. com.172800INNSf.gtld-servers.net. com.172800INNSg.gtld-servers.net. com.172800INNSh.gtld-servers.net. com.172800INNSi.gtld-servers.net. com.172800INNSj.gtld-servers.net. com.172800INNSk.gtld-servers.net. com.172800INNSl.gtld-servers.net. com.172800INNSm.gtld-servers.net. ;;Received492bytesfrom193.0.14.129#53(193.0.14.129)in26867ms google.com.172800INNSns2.google.com. google.com.172800INNSns1.google.com. google.com.172800INNSns3.google.com. google.com.172800INNSns4.google.com. ;;Received168bytesfrom192.54.112.30#53(192.54.112.30)in8681ms www.google.com.300INA173.194.72.103www.google.com.300INA173.194.72.99www.google.com.300INA173.194.72.106www.google.com.300INA173.194.72.104www.google.com.300INA173.194.72.147www.google.com.300INA173.194.72.105;;Received128bytesfrom216.239.38.10#53(216.239.38.10)in82ms 我们看到整个DNS查询过程就是上述的根据域名从右到左来一步步查询, . root DNS -> com DNS -> google DNS -> www DNS查询类型一共有两种,一种是 迭代查询 (Iterative Query),另一种是 递归查询 (Recursive Query)我们通过下面两个示意图就可以知道这两种查询的区别了 ①迭代查询 (Iterative Query) ②递归查询 (Recursive Query) 我们看到迭代查询时本地DNS Server会首先向 . DNS Server发出请求,此时 . DNS Server会返回给本地DNS Server com的 DNS Server,这样依次类推下去,最后将 www.google.com的ip地址返回,而递归查询,则只是本地DNS Server向 . DNS Server发出一个请求,然后解析IP是交给了其下属的DNS Server来完成,最后将IP地址返回,由于递归查询在每个DNS Server上会有缓存信息,所以一般我们都是使用两种查询方式相结合的方式来进行DNS查询的 四、资源记录 在DNS服务器上,DNS的信息都是通过一个叫做资源记录(RR Resource Record)的格式来进行保存的,RR不仅能够保存域名到IP地址的信息,还能保持其他很多的信息 资源记录常用的属性有: -NAME (主机名) -CLASS (类别,通常是IN) -TYPE (类型,资源记录的类型) -RDATA (信息) 如: www IN A 192.168.1.1 mail IN A 192.168.1.2 server1 IN CNAME www IN MX 10 mail.gmail.com.(对于MX记录,后面的域名一定要写完整,即最后的 . 也要加上) NAME CLASS TYPE RDATA 上面都是我们的资源记录。DNS的资源记录可以记录许多类型的资源,而不仅仅是IP地址,常见的资源记录类型如下: 资源记录类型(TYPE) 表示内容 A IPv4地址 AAAA IPv6地址 MX 邮件记录 CNAME 别名 PTR 指针(逆向解析) SRV 服务资源 我们可以使用DNS的高级查询命令来查看这些资源记录的信息 ①dig -t awww.google.com 查看域名的IPv4地址 [root@xiaoluo~]#dig-tawww.google.com;<<>>DiG9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6<<>>-tawww.google.com ;;globaloptions:+cmd ;;Gotanswer: ;;->>HEADER<<-opcode:QUERY,status:NOERROR,id:52161;;flags:qrrdra;QUERY:1,ANSWER:6,AUTHORITY:0,ADDITIONAL:0;;QUESTIONSECTION: ;www.google.com.INA ;;ANSWERSECTION: www.google.com.5INA74.125.31.103www.google.com.5INA74.125.31.99www.google.com.5INA74.125.31.147www.google.com.5INA74.125.31.104www.google.com.5INA74.125.31.106www.google.com.5INA74.125.31.105 // 这些都是www.google.com的IPv4地址;;Querytime:2010msec ;;SERVER:192.168.198.2#53(192.168.198.2) ;;WHEN:MonJun320:45:302013;;MSGSIZErcvd:128 ②dig -t mx gmail.com 查看gmail.com这个域名的邮件记录 [root@xiaoluo~]#dig-tmxgmail.com;<<>>DiG9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6<<>>-tmxgmail.com ;;globaloptions:+cmd ;;Gotanswer: ;;->>HEADER<<-opcode:QUERY,status:NOERROR,id:44633;;flags:qrrdra;QUERY:1,ANSWER:5,AUTHORITY:0,ADDITIONAL:4;;QUESTIONSECTION: ;gmail.com.INMX ;;ANSWERSECTION: gmail.com.5INMX40alt4.gmail-smtp-in.l.google.com. gmail.com.5INMX30alt3.gmail-smtp-in.l.google.com. gmail.com.5INMX10alt1.gmail-smtp-in.l.google.com. gmail.com.5INMX5gmail-smtp-in.l.google.com. gmail.com.5INMX20alt2.gmail-smtp-in.l.google.com. //gmail.com的邮件服务器 ;;ADDITIONALSECTION: alt3.gmail-smtp-in.l.google.com.5INAAAA2607:f8b0:400d:c02::1a alt1.gmail-smtp-in.l.google.com.5INAAAA2a00:1450:4010:c03::1b gmail-smtp-in.l.google.com.5INAAAA2607:f8b0:400e:c01::1a alt4.gmail-smtp-in.l.google.com.5INAAAA2607:f8b0:400c:c01::1a //gmail.com邮件服务器对应的IP地址 ;;Querytime:2003msec ;;SERVER:192.168.198.2#53(192.168.198.2) ;;WHEN:MonJun320:47:322013;;MSGSIZErcvd:262 ③dig -x42.121.135.98 逆向解析42.121.135.98 这个IP地址得到其域名 (博客园的IP) [root@xiaoluo~]#hostwww.cnblogs.com www.cnblogs.comhasaddress42.121.135.98[root@xiaoluo~]#dig-x42.121.135.98;<<>>DiG9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6<<>>-x42.121.135.98;;globaloptions:+cmd ;;Gotanswer: ;;->>HEADER<<-opcode:QUERY,status:NXDOMAIN,id:22590;;flags:qrrdra;QUERY:1,ANSWER:0,AUTHORITY:1,ADDITIONAL:0;;QUESTIONSECTION: ;98.135.121.42.in-addr.arpa.INPTR ;;AUTHORITYSECTION:121.42.in-addr.arpa.5INSOAhidden-master.aliyun.com.hostmaster.aliyun-inc.com.201306030072009002592000600;;Querytime:2004msec ;;SERVER:192.168.198.2#53(192.168.198.2) ;;WHEN:MonJun320:51:272013;;MSGSIZErcvd:126 以上这些都是对DNS以及域名进行一些简单的知识介绍、总结(自己感觉总结的有点繁琐哈。。。),在下一篇文章里面将详细讲解Linux下如何配置我们自己的DNS服务器。。。 本文转自sandshell博客51CTO博客,原文链接http://blog.51cto.com/sandshell/1947776如需转载请自行联系原作者 sandshell