本篇文章将主要讲解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.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
因为hosts文件里面保存的就是域名到IP地址直接的对应关系,我们也可以手动的去将我们的域名指定为其它的IP,例如我们将 www.google.com 的 ip 修改为 192.168.1.1
[root@xiaoluo ~]# ping www.google.com PING www.google.com (173.194.72.103) 56(84) bytes of data. [root@xiaoluo ~]# vim /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.1.1 www.google.com[root@xiaoluo ~]# ping www.google.com PING www.google.com (192.168.1.1) 56(84) bytes of data.
我们看到,我们在 /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 # # An example Name Service Switch config file. This file should be # sorted with the most-used services at the beginning. # # The entry '[NOTFOUND=return]' means that the search for an # entry should stop if the search in the previous entry turned # up nothing. Note that if the search failed due to some other reason # (like no NIS server responding) then the search continues with the # next entry. # # Valid entries include: # # nisplus Use NIS+ (NIS version 3) # nis Use NIS (NIS version 2), also called YP # dns Use DNS (Domain Name Service) # files Use the local files # db Use the local database (.db) files # compat Use NIS on compat mode # hesiod Use Hesiod for user lookups # [NOTFOUND=return] Stop searching if not found so far # # To use db, put the "db" in front of "files" for entries you want to be # looked up first in the databases # # Example: #passwd: db files nisplus nis #shadow: db files nisplus nis #group: db files nisplus nispasswd: files shadow: files group: files#hosts: db files nisplus nis dns hosts: files dns# Example - obey only what nisplus tells us... #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: files nisplus aliases: files nisplus
我们看到我们 hosts 解析的顺序先是通过 file 文件来进行解析,再是通过DNS进行解析,我们可以直接修改该文件来控制我们的查询顺序
三、DNS查询
我们可以通过 host 或者 dig 命令来查询我们域名对应的IP地址
①host(显示内容较少)
[root@xiaoluo ~]# host www.google.com www.google.com has address 74.125.31.104www.google.com has address 74.125.31.147www.google.com has address 74.125.31.106www.google.com has address 74.125.31.99www.google.com has address 74.125.31.103www.google.com has address 74.125.31.105www.google.com has IPv6 address 2404:6800:4008:c01::6a
②dig (显示内容详细)
[root@xiaoluo ~]# dig www.google.com ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6 <<>> www.google.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65143;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0;; QUESTION SECTION: ;www.google.com. IN A ;; ANSWER SECTION: www.google.com. 5 IN A 74.125.31.104www.google.com. 5 IN A 74.125.31.147www.google.com. 5 IN A 74.125.31.106www.google.com. 5 IN A 74.125.31.99www.google.com. 5 IN A 74.125.31.103www.google.com. 5 IN A 74.125.31.105;; Query time: 2012 msec ;; SERVER: 192.168.198.2#53(192.168.198.2) ;; WHEN: Mon Jun 3 19:49:55 2013;; MSG SIZE rcvd: 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 +trace www.google.com; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6 <<>> +trace www.google.com ;; global options: +cmd . 5 IN NS f.root-servers.net. . 5 IN NS g.root-servers.net. . 5 IN NS h.root-servers.net. . 5 IN NS i.root-servers.net. . 5 IN NS j.root-servers.net. . 5 IN NS k.root-servers.net. . 5 IN NS l.root-servers.net. . 5 IN NS m.root-servers.net. . 5 IN NS a.root-servers.net. . 5 IN NS b.root-servers.net. . 5 IN NS c.root-servers.net. . 5 IN NS d.root-servers.net. . 5 IN NS e.root-servers.net. ;; Received 508 bytes from 192.168.198.2#53(192.168.198.2) in 28138 ms com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net. ;; Received 492 bytes from 193.0.14.129#53(193.0.14.129) in 26867 ms google.com. 172800 IN NS ns2.google.com. google.com. 172800 IN NS ns1.google.com. google.com. 172800 IN NS ns3.google.com. google.com. 172800 IN NS ns4.google.com. ;; Received 168 bytes from 192.54.112.30#53(192.54.112.30) in 8681 ms www.google.com. 300 IN A 173.194.72.103www.google.com. 300 IN A 173.194.72.99www.google.com. 300 IN A 173.194.72.106www.google.com. 300 IN A 173.194.72.104www.google.com. 300 IN A 173.194.72.147www.google.com. 300 IN A 173.194.72.105;; Received 128 bytes from 216.239.38.10#53(216.239.38.10) in 82 ms
我们看到整个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 a www.google.com 查看域名的IPv4地址
[root@xiaoluo ~]# dig -t a www.google.com; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6 <<>> -t a www.google.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52161;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0;; QUESTION SECTION: ;www.google.com. IN A ;; ANSWER SECTION: www.google.com. 5 IN A 74.125.31.103www.google.com. 5 IN A 74.125.31.99www.google.com. 5 IN A 74.125.31.147www.google.com. 5 IN A 74.125.31.104www.google.com. 5 IN A 74.125.31.106www.google.com. 5 IN A 74.125.31.105 // 这些都是 www.google.com 的IPv4地址;; Query time: 2010 msec ;; SERVER: 192.168.198.2#53(192.168.198.2) ;; WHEN: Mon Jun 3 20:45:30 2013;; MSG SIZE rcvd: 128
②dig -t mx gmail.com 查看gmail.com这个域名的邮件记录
[root@xiaoluo ~]# dig -t mx gmail.com; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6 <<>> -t mx gmail.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44633;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 4;; QUESTION SECTION: ;gmail.com. IN MX ;; ANSWER SECTION: gmail.com. 5 IN MX 40 alt4.gmail-smtp-in.l.google.com. gmail.com. 5 IN MX 30 alt3.gmail-smtp-in.l.google.com. gmail.com. 5 IN MX 10 alt1.gmail-smtp-in.l.google.com. gmail.com. 5 IN MX 5 gmail-smtp-in.l.google.com. gmail.com. 5 IN MX 20 alt2.gmail-smtp-in.l.google.com. // gmail.com的邮件服务器 ;; ADDITIONAL SECTION: alt3.gmail-smtp-in.l.google.com. 5 IN AAAA 2607:f8b0:400d:c02::1a alt1.gmail-smtp-in.l.google.com. 5 IN AAAA 2a00:1450:4010:c03::1b gmail-smtp-in.l.google.com. 5 IN AAAA 2607:f8b0:400e:c01::1a alt4.gmail-smtp-in.l.google.com. 5 IN AAAA 2607:f8b0:400c:c01::1a // gmail.com邮件服务器对应的IP地址 ;; Query time: 2003 msec ;; SERVER: 192.168.198.2#53(192.168.198.2) ;; WHEN: Mon Jun 3 20:47:32 2013;; MSG SIZE rcvd: 262
③dig -x 42.121.135.98 逆向解析 42.121.135.98 这个IP地址得到其域名 (博客园的IP)
[root@xiaoluo ~]# host www.cnblogs.com www.cnblogs.com has address 42.121.135.98[root@xiaoluo ~]# dig -x 42.121.135.98; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6 <<>> -x 42.121.135.98;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 22590;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0;; QUESTION SECTION: ;98.135.121.42.in-addr.arpa. IN PTR ;; AUTHORITY SECTION:121.42.in-addr.arpa. 5 IN SOA hidden-master.aliyun.com. hostmaster.aliyun-inc.com. 2013060300 7200 900 2592000 600;; Query time: 2004 msec ;; SERVER: 192.168.198.2#53(192.168.198.2) ;; WHEN: Mon Jun 3 20:51:27 2013;; MSG SIZE rcvd: 126
以上这些都是对DNS以及域名进行一些简单的知识介绍、总结(自己感觉总结的有点繁琐哈。。。),在下一篇文章里面将详细讲解Linux下如何配置我们自己的DNS服务器。。。