DNS服务器原理
19.1 什么是DNS
主机名自动解析为 IP 就很重要!那就是 DNS。
19.1.1 用网络主机名取得IP的历史渊源
单一档案处理上网的年代: /etc/hosts
利用某些特定的档案将主机名与 IP 作一个对应, 如此一来,我们就可以透过主机名来取得该主机的 IP。 就是/etc/hosts 这个档案的用途了
缺憾:
- ip数量太多时,该档案会大到不像
- 主机名与IP的对应无法自动于所有计算机内更新
导致,客户端计算机每次都得要重新下载一次档案才能顺利联网;
分布式,阶层式主机名管理架构:DNS系统
DNS(Domain Name System),
我们不需要知道主机的IP,只要知道该主机的名称,就能够轻易的连上该主机了。
- DNS 利用类似树状目录的架构,将主机名的管理分配在不同层级的 DNS 服务器当中,经由分层管理, 所以每一部 DNS 服务器记忆的信息就不会很多
- 若有 IP 异动时也相当容易修改!因为你如果已经申请到主机名解析的授权, 那么在你自己的 DNS服务器中,就能够修改全世界都可以查询到的主机名了!而不用透过上层 ISP 的维护呢! 自己动手当然是最快的
DNS 与 BIND
DNS 是一种因特网的通讯协议名称, 至于 Bind 则是提供这个 DNS 服务的软件
DNS 有关的 FQDN、 Hostname 与 IP 的查询流程,正解与反解、合法授权的 DNS 服务器之意义,以及 Zone 等等的知识。
完整主机名:Fully Qualified Domain Name(FQDN)
第一个与 DNS 有关的主机名概念,就是『主机名与领域名 (hostname and domainname)』的观念,以及由这两者组成的完整主机名 Fully Qualified Domain Name, FQDN。
DNS 是以树状目录分阶层的方式来处理主机名,那我们知道树状目录中, 那个目录可以记录文件名。领域名底下还可以记录各个主机名, 组合起来才是完整的主机名 (FQDN)
我们知道目录树的最顶层是根目录 (/),那么 DNS 既然也是阶层式的,最顶层是啥呢?每一层的 domain name 与 hostname 又该怎么分?
例子:www.ksu.edu.tw;
在上面的例子当中,由上向下数的第二层里面,那个 .tw 是 domain name ,而 com,edu, gov 则是主机的名称,而在这个主机的名称之管理下,还有其他更小网域的主机,所以在第三层的时候,基本上,那个 edu.tw 就变成了 domain name 了!而昆山科大与成大的 ksu, ncku 则成为了 hostname .
以此类推,最后得到我们的主机那个 www 是主机名,而 domain name 是由ksu.edu.tw 那个名字所决定的!自然,我们的主机就是让管理 ksu.edu.tw 这个domain name 的 DNS 服务器所管理的啰!
注意:
并不是以小数点 (.) 区分 domain name 与 hostname !某些时刻 domain name 所管理的 hostname 会含有小数点。
19.1.2 DNS的主机名对应IP的查询流程
简单了解 FQDN 的 domain name 与 hostname 之后,接下来我们要谈一谈这个DNS 的:
(1)阶层架构是怎样?
(2)查询原理是怎样?
总是要先知道架构才能知道如何查询主机名的!所以底下我们先来介绍一下整体的 DNS 阶层架构。
DNS 的阶层架构与 TLD
上面列子:将最上层到昆山科大 (ksu) 时,之间的各层绘制如下图:
在整个 DNS 系统的最上方一定是 . (小数点) 这个 DNS 服务器 (称为 root),最早以前它底下管理的就只有:
(1)com, edu, gov, mil, org, .net 这种特殊领域
(2)以国家为分类的第二层的主机名了
这两者称为 Top Level Domains (TLDs),顶级域名;
授权与分层负责
向上层ISP申请域名的授权例如:
台湾地区最上层的领域名是以 .tw 为开头,管理这个领域名的机器 IP 是在台湾,但是 .tw 这部服务器必须向 root (.) 注册领域名查询授权才行
那么每个国家之下记录的主要下层有哪些领域呢?基本上就是原先 root 管理的那六大类。 不过,由于各层 DNS 都能管理自己辖下的主机名或子领域,
因此,我们的 .tw 可以自行规划自己的子领域名喔! 例如目前台湾 ISP 常提供的 .idv.tw 的个人网站就是一例。
每个上一层的 DNS 服务器所记录的信息,其实只有其下一层的主机名而已! 至于再下一层,则直接『授权』给下层的某部主机来管理;
这样设计的好处就是:
每部机器管理的只有下一层的 hostname 对应 IP 而已,所以减少了管理上的困扰!而下层 Client 端如果有问题,只要询问上一层的 DNS server;
通过DNS查询主机名IP的流程
DNS类似树状的主机名管理:
首先,当你在浏览器的网址列输入 http://www.ksu.edu.tw 时,你的计算机就会依据相关设定 (在 Linux 底下就是利用 /etc/resolv.conf 这个档案) 所提供的 DNS的 IP 去进行联机查询了。由于目前最常见的 DNS 服务器就属 Hinet 的 168.95.1.1这个 DNS,所以我们就拿他来做例子 hinet 的这部服务器会这样工作:
1. 收到用户的查询要求,先查看本身有没有纪录,若无则向 . 查询:由于 DNS 是阶层式的架构,每部主机都会管理自己辖下的主机名解译而已。因为 hinet 并没有管理台湾学术网络的权力, 因此就无法直接回报给客户端。此时 168.95.1.1 就会向最顶层,也就是 . (root) 的服务器查询相关 IP 信息。
2. 向最顶层的 . (root) 查询:168.95.1.1 会主动的向 . 询问 www.ksu.edu.tw 在哪里呢?但是由于 . 只记录了 .tw 的信息 (因为台湾只有 .tw 向 . 注册而已),此时 . 会告知『我是不知道这部主机的 IP 啦,不过,你应该向 .tw 去询问才对,我这里不管! 我跟你说 .tw 在哪里吧!』
3. 向第二层的 .tw 服务器查询:168.95.1.1 接着又到 .tw 去查询,而该部机器管理的又仅有 .edu.tw, .com.tw, gov.tw... 那几部主机,经过比对后发现我们要的是 .edu.tw 的网域,所以这个时候 .tw 又告诉 168.95.1.1 说:『你要去管理 .edu.tw 这个网域的主机那里查询,我有他的 IP !』
4. 向第三层的 .edu.tw 服务器查询:同理可证, .edu.tw 只会告诉 168.95.1.1 ,应该要去 .ksu.edu.tw 进行查询,这里只能告知 .ksu.edu.tw 的 IP 而已。
5. 向第四层的 .ksu.edu.tw 服务器查询:等到 168.95.1.1 找到 .ksu.edu.tw 之后, .ksu.edu.tw 说:『没错!这部主机名是我管理的~ 我跟你说他的 IP 是...所以此时 168.95.1.1 就能够查到 www.ksu.edu.tw 的 IP 啰!
6. 记录暂存内存并回报用户:
查到了正确的 IP 后, 168.95.1.1 的 DNS 机器总不会在下次有人查询www.ksu.edu.tw 的时候再跑一次这样的流程吧! 很远很累的!而且也很耗系统的资源与网络的带宽,所以呢, 168.95.1.1 这个 DNS 会很聪明的先记录一份查询的结果在自己的暂存内存当中,以方便响应下一次的相同要求啊! 最后则将结果回报给 client 端!当然啦,那个记忆在 cache 当中的数据,其实是有时间性的,当过了 DNS 设定记忆的时间 (通常可能是 24 小时),那么该记录就会被释放喔!
整个分寸查询的流程就是这样,总是得要先经过 . 根来向下一层进行查询,最终总是能得到答案的。
分层的好处是:
- 主机名修改的仅需要自己的DNS更动即可,不需要通知其他人。
- 只要主机名经过上层合法的DNS服务器设定,就可以在Internet上面被查询到,这样维护简单,机动性也很高
- DNS服务器对主机名解析结果的快取时间
- 每次查询到的结果都会储存在 DNS 服务器的高速缓存中,以方便若下次有 相同需求的解析时,能够快速的响应。通常是10分钟到三天之内。
- 可持续向下授权(子领域名授权)
- 没层只管当前层的子层地址在哪。
命令 dig+ trace ,查看到DNS的搜寻过程!
[root@www ~]# dig +trace www.ksu.edu.tw ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-16.P1.el5 <<>>+trace www.ksu.edu.tw ;; global options: printcmd . 486278 IN NS a.root-servers.net. . 486278 IN NS b.root-servers.net. ....(底下省略).... # 上面的部分在追踪 . 的服务器,可从 a ~ m.root-servers.net. ;; Received 500 bytes from 168.95.1.1#53(168.95.1.1) in 22 ms tw. 172800 IN NS ns.twnic.net. tw. 172800 IN NS a.dns.tw. tw. 172800 IN NS b.dns.tw. ....(底下省略).... # 上面的部分在追踪 .tw. 的服务器,可从 a ~ h.dns.tw. 包括 ns.twnic.net. ;; Received 474 bytes from 192.33.4.12#53(c.root-servers.net) in 168 ms edu.tw. 86400 IN NS a.twnic.net.tw. edu.tw. 86400 IN NS b.twnic.net.tw. # 追踪 .edu.tw. 的则有 7 部服务器 ;; Received 395 bytes from 192.83.166.11#53(ns.twnic.net) in 22 ms ksu.edu.tw. 86400 IN NS dns2.ksu.edu.tw. ksu.edu.tw. 86400 IN NS dns3.twaren.net. ksu.edu.tw. 86400 IN NS dns1.ksu.edu.tw. ;; Received 131 bytes from 192.83.166.9#53(a.twnic.net.tw) in 22 ms www.ksu.edu.tw. 3600 IN A 120.114.100.101 ksu.edu.tw. 3600 IN NS dns2.ksu.edu.tw. ksu.edu.tw. 3600 IN NS dns1.ksu.edu.tw. ksu.edu.tw. 3600 IN NS dns3.twaren.net. ;; Received 147 bytes from 120.114.150.1#53(dns2.ksu.edu.tw) in 14 ms
DNS 端口号:53;
这里,DNS开始以udp传输,若未查到完整信息,则重新以TCP传输;
所以DNS,daemon,会同时启动tcp,udp的port 53,;
19.1.3 合法DNS的关键:申请领域查询授权
与其他服务器不同,DNS服务器的架设有合法与不合法之说。
向上层领域注册取得合法的领域查询授权
如果需要架设DNS,而且是可以连上Internet上面的DNS时,就必须要透过上层DNS服务器的授权。
所以, 要让你的主机名对应 IP 且让其他计算机都可以查询的到,你有
两种方式:
1. 上层 DNS 授权领域查询权,让你自己设定 DNS 服务器;
2. 直接请上层 DNS 服务器来帮你设定主机名对应!
拥有领域查询权后,所有的主机名信息都以自己为准,与上层无关。
DNS,记录的信息非常的多,重点有两个:
- 记录服务器所在的NS(NameServer)标志
- 记录主机名对应的A(Address)标志
我们在网络上面查询到的最终结果,都是查询IP的,因此最终的标志要找到的是A这个记录才对。
注册的.vbird.org 记录在ISP的DNS服务器名为dns.vbird.org,该笔记录其实是NS,并非A。
虽然在 godaddy 服务器内有记录一笔『要查询 .vbird.org 时,请到dns.vbird.org (NS) 去查,这个管理者的 IP 是 140.116...』,
但是这笔记录只是告诉我们要去下一个服务器找, 并不是最终的 A (IP Address) 的答案,所以还得要继续往下找 (随时记得图 19.1-4 的查询流程)。
此时,有几种结果会导致dns.vbird.org的IP找不到,或最终IP与godaddy记录的不同结果:
- dns.vbird.org 服务器挂点时
- 如果 dns.vbird.org 这部主机宕机,那么在上图显示『查询』箭头的步骤会被中断,因此就会出现『联机不到dns.vbird.org 的 IP』的结果。
- dns.vbird.org 服务器内的数据库忘记补上数据时
- 在自己的服务器数据库中,忘记加上 dns.vbird.org 的记录时,最终的结果还是会显示『找不到该服务器的 IP』
- dns.vbird.org 服务器内的数据库数据编写不一致时
- 如果是在鸟哥自己服务器的数据库内的 dns.vbird.org 所记录的 IP 与godaddy 的不同,最终的结果会以鸟哥记录的为准。
总之,在ISP上面填写的主机名只是一个参考用的,最终还是要在你自己服务器当中设定好才行。
由此可见,DNS查询不是简单的从上层获得下层IP,然后一级级的往下查询。DNS肯定有更加健全的查询算法,通过上层设定的参考,最终由本层设定决定。
疑问?????
???????
既然上层仅作参考,实际起作用的是下层自己的设定。那么当上层godaddy设置了dns.vbird.org->NS(140.116.111.12),而本层dns.vbird.org设置了dns.vbird.org->A(150.120.111.12)。那么在从根走到godaddy之后,是如何确定dns.vbird.org,即在godaddy拿到的是假地址,是如何走到dns.vbird.org的。
19.1.4 主机名交由ISP 代管还是自己设定DNS服务器。
需要架设DNS的时机:
- 主机数量庞大
- 需要经常修改server名称。
19.1.5 DNS数据库的记录:正解,反解,Zone得意义
- 从主机名查询到 IP 的流程称为:正解
- 从 IP 反解析到主机名的流程称为:反解
- 不管是正解还是反解,每个领域的记录就是一个区域 (zone)
正解的设定权以及DNS正解zone记录的标志
符合上层NDS所给予的领域范围,即可申请正解DNS服务器;
正解zone通常标志:
- SOA:就是开始验证 (Start of Authority) 的缩写,相关资料本章后续小节说明;
- NS:就是名称服务器 (NameServer) 的缩写,后面记录的数据是 DNS 服务器的意思;
- A:就是地址 (Address) 的缩写,后面记录的是 IP 的对应 (最重要);
反解的设定权以及 DNS 反解 zone 记录的标志
能够设定反解的就只有 IP 的拥有人,亦即你的 ISP 才有权力设定反解的。
那你向 ISP 取得的 IP 能不能自己设定反解呢?答案是不行!
除非你取得的是整个 class C 以上等级的 IP 网段,那你的 ISP 才有可能给你 IP 反解授权。
否则,若有反解的需求,就得要向你的直属上层 ISP 申请才行。
反解zone通常标志:
- SOA:就是开始验证 (Start of Authority) 的缩写,相关资料本章后续小节说明;
- NS:就是名称服务器 (NameServer) 的缩写,后面记录的数据是 DNS 服务器的意思;
- PTR:就是指向 (PoinTeR) 的缩写,后面记录的数据就是反解到主机名啰
每部DNS都需要的正解zone:hint
hint:
根目录在哪里的记录;
所以说,一部简单的正解 DNS 服务器,基本上就要有两个 zone 才行,一个是hint ,一个是关于自己领域的正解 zone。
19.1.6 DNS数据库的类型:hint,master/slave架构
hint:.(root)基本数据库类型;
master,slave 是两种基本类型,用来解决DNS服务器主从结构,数据同步问题的。
master
- 要管理员自己手动去修改与设定;并且重启后才生效;
- 一般来说,我们说的DNS设定,就是指设定这种数据库的类型
- 给slave的DNS提供数据库内容
slave
- 必须与master相互搭配
- 只支持一主多从
- 更改master之后,slave自动更新
master/slave的查询优先权?
在 DNS 系统当中,领域名的查询是『先抢先赢』的状态;
Master / Slave 数据的同步化过程
基本上,不论 Master 还是 Slave 的数据库,都会有一个代表该数据库新旧的『序号』,这个序号数值的大小,是会影响是否要更新的动作。
更新的两种方式:
- master主动告知
- Master 在修改了数据库内容,并且加大数据库序号后, 重新启动 DNS 服务,那 master 会主动告知 slave 来更新数据库,
- slave主动提出
- Slave 会定时的向 Master 察看数据库的序号, 当发现 Master 数据库的序号比 Slave 自己的序号还要大 (代表比较新),那么 Slave 就会开始更新