DNS从入门到管理(一)
-
DNS概念
-
DNS三步法
-
反向解析
-
主从DNS服务器的实现
-
子域授权
-
智能DNS
-
压力测试与DNS排错
DNS概述
DNS(Domain
Name
System,域名系统),域名和IP地址相互映射的一个分布式数据库,通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析。而DNS的主要作用,就是域名解析,将主机名解析成IP地址。DNS这种机制能够完成从域名(FQDN)到主机识别IP地址之间的转换,在DNS诞生之前,这个功能主要是通过本地的一个hosts文件来记录域名和IP的对应关系,但hosts文件只能作用于本机,不能同步更新至所有主机,且当hosts文件很庞大时难以管理,因此,一个分布式、分层次的主机名管理架构DNS便应用而生。
FQDN(Full
Qualified Domain
Name)亦即完整主机名,完整主机名由主机名与域名构成。DNS同根文件系统一样是一个倒置的树状结构,最顶层的叫做根服务器,主要负责顶级域名的管理,常见的顶级域名有.com、.cn、.net、.org、.edu、.gov、.mil等,顶级域名则负责管理其下面的二级域名,如baidu.com,qq.com等,二级域名服务器则负责对应的主机名称或其三级域名解析,依次类推,根服务器管理顶级域名,顶级域名管理二级域名,二级域名管理三级域名或直接解析主机名,如此便形成了一个倒置的树状结构。
由此可见,每一级只负责对应下级的域的管理,而全球共有13个根节点服务器,10台位于美国,其余3台分别在英国、瑞典和日本,在这13台根服务器当中有1台为主根服务器放置在美国,其余12台为辅根服务器,所有的根服务器均由美国政府授权的互联网域名与号码分配机构ICANN组织统一管理,负责全球互联网域名根服务器、域名体系和IP地址等的管理。
hosts
hsots: 只能作正向解析,优先级比DNS高,hosts文件一般用于测试,或者用于局域网里面, 在局域网里面,也可以用nis。
解析类型
正向解析:FQDN --> IP,即把主机名解析为IP地址 反向解析: IP --> FQDN,即把IP地址解析为主机名
泛域名解析:避免用户写错名称时给出错误答案,可通过泛域名解析进行解析至某特定地址。
$GENERATE 1-254 HOST$ A 1.2.3.$
查询类型
递归查询:递归查询一般是客户机与服务器之间的查询,即客户机只发送一次请求, 其他的工作将由上层服务器去解决,最后一层一层地反馈结果到客户端。 迭代查询:迭代查询一般是DNS服务器与DNS服务器之间的查询,即最开始的DNS服务 器负责发起请求,其他涉及到的DNS服务器只负责响应即可,然后一直查找到目标DNS 服务器,并将结果返回给客户端。
zone: DNS数据库
DNS的解析过程当中涉及到DNS数据库,此数据库又分为正解与反解,正解即从主机名 到IP,反解即从IP到主机名,无论正解还是反解,每个域名所对应的解析记录我们称 之为zone(域)
RR: 资源记录
RR(Resource Record), 这些记录的类型有:A, AAAA, PTR, SOA, NS, CNAME, MX SOA:Start Of Authority,起始授权记录;一个区域解析库有且仅能有一个SOA记录,必须位于解析库的第一条记录 A:internet Address,作用,FQDN --> IP AAAA: FQDN --> IPv6 PTR: PoinTeR,IP --> FQDN NS: Name Server,专用于标明当前区域的DNS服务器 CNAME:Canonical Name,别名记录 MX:Mail eXchanger,邮件交换器
主从DNS服务器
DNS也是一个网络服务,因此就有对应的端口号,其端口号为53号,通常DNS在查询时是以UDP/53来查询,而在主从同步时是以TCP/53来同步。为了克服网络中的单点故障问题,DNS服务器一般会有主DNS服务器与从DNS服务器。
主DNS服务器:管理和维护所负责解析的域内解析库的服务器
从DNS服务器:从主服务器或从服务器“复制”(区域传输)解析库副本
主从在同步时有两种机制:
push: 主服务器push给从服务器pull:从服务器pull主服务器
push: 推机制,主服务器有变,则主动推送给从服务器,瞬间完成。
pull: 拉机制,从服务器定期地同步主服务器,即刷新时间间隔。如果刷新时间失败,则在重试时间间隔再次同步。
一次完整的DNS查询
Client
–>hosts文件–>DNS Service Local Cache –> DNS Server
(recursion) –> Server Cache –> iteration(迭代) –> 根–>
顶级域名DNS–>二级域名DNS…
如下场景:
Client: liansir——>www.qq.com Liansir上网时会自动获取一个DNS地址,此DNS地址是liansir所在小区或电信提供一个DNS服务器,而此DNS上一般没有qq.com所对应的主机与IP的对应关系,即没有www主机所对应的IP,(存放www主机所对应IP的DNS服务器称为权威服务器)
此时,liansir自动获取的DNS会去找根域,(每个DNS软件上面都有全球的根服务器的地址),根域会将自己子域.com的IP地址给liansir自动获取的DNS, 于是此DNS又去请求.com,并说我要找www.qq.com,而.com也是非权威服务器,于是将其子域qq.com的地址发送给liansir自动获取的DNS,从而liansir用户得到qq.com的地址,并成功访问www.qq.com
而当liansir访问过www.qq.com之后,其本地就会有缓存,故而在短期之内访问www.qq.com时并不会再去访问根域。同样地,那个电信DNS服务器也会保存相应的缓存,从而提高访问速度。
其实,这个电信DNS服务器就是一个缓存服务器。
问题:如果liansir本地有qq.com的子域的DNS, 其如何访问qq.com? 父域是知道子域的DNS地址的,但子域是不记录父域的DNS地址的。故而此种情况还是要经过根域进而查询的!
递归查询:客户端向第一个DNS服务器发送的请求,最后由此DNS服务器给客户端结果。“负责到底的一种行为” 迭代查询:根域与各DNS服务器之间的查询,“给你一个最好的结果但不是最终结果”。
DNS是一种机制,一种协议,实现这种机制的常用工具为bind, BekerleyInternatName Domain, ISC (www.isc.org),目前为使用最广泛的DNS服务器软件。
DNS三步法
DNS的服务器软件除了bind之外,还有bind-chroot(bind主目录禁锢程序,就是将bind程序禁锢在家目录当中,centos 6之后的系统默认禁锢在/var/named/目录下);
DNS的配置文件主要有:
/etc/named.conf, /etc/named.rfc1912.zones: DNS的主配置文件; /var/named: 该目录为DNS数据库文件存放的目录,每一个域文件都存放在这里; /etc/rc.d/init.d/named: 为DNS服务的服务脚本
一台物理服务器可同时为多个区域提供解析,并且该DNS服务器上必须要有根区域文件named.ca;rndc(remote
name domain
controller)服务可为DNS提供辅助性的管理功能,该服务监听在主机TCP的953号端口,默认与bind安装在同一主机上,且只能通过127.0.0.1来连接DNS服务的named进程。
-
安装bind并启动named服务
[root@centos6 ~]#yum -y install bind
关闭防火墙并设置为开机不允许启动
[root@centos6 ~]#iptables -F [root@centos6 ~]#chkconfig iptables off [root@centos6 ~]#chkconfig --list iptables iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off [root@centos6 ~]#
CentOS 7为如下设置:
~]#systemctl is-enabled firewalld #查看防火墙是否开启 ~]#systemctl disable firewalld
启动named服务
[root@centos6 ~]#service named start Starting named: [ OK ]
Centos 7相关命令:
[root@centos7-min ~]#systemctl enable named [root@centos7-min ~]#systemctl disable named [root@centos7-min ~]#systemctl start named [root@centos7-min ~]#systemctl status named
-
创建域(zone)
首先编辑/etc/named.conf文件,本文以添加liansir99.com域为例。
在修改/etc/named.conf文件时,最好先备份:cp -p /etc/named.conf /etc/named.conf.bak
options { listen-on port 53 { 127.0.0.1; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; allow-query { localhost; }; recursion yes; dnssec-enable yes; dnssec-validation yes; logging { channel default_debug { file "data/named.run"; severity dynamic; };};zone "." IN { type hint; file "named.ca";};include "/etc/named.rfc1912.zones";include "/etc/named.root.key";
常见的修改选项:
listen-on port 53 { localhost; }; localhost:相当于一个变量,代表本机所有IP allow-query { localhost; }; 只允许本机查询 allow-query { any; }; any表示任何主机,也可写成一个网段
注意:任何服务程序如果期望其能够通过网络被其它主机访问,至少应该监听在一个能与外部主机通信的IP地址上。
缓存名称服务器的配置:监听外部地址即可;
dnssec: 建议关闭dnssec,设为no
创建域zone数据库文件
区域定义:本机能够为哪些zone进行解析,就要定义哪些zone;
zone "ZONE_NAME" IN {};
其中zone的格式为:
zone "ZONE_NAME" IN {type {master|slave|hint|forward}; file "ZONE_NAME.zone"; };
type:
该zone的类型,主要类型有:
hint:根 master:主DNSslave: 从DNSforward: 专用于转发
创建zone:
[root@centos6 ~]#vim /etc/named.rfc1912.zones zone "liansir99.com" IN { type master; file "liansir99.com.zone"; }; "/etc/named.rfc1912.zones" 47L, 1005C written
创建zone的数据库文件:
[root@centos6 /var/named]#vim liansir99.com.zone $TTL 86400 @ IN SOA ns1.liansir99.com. admin.liansir99.com. ( 2016100401 1H 5M 7D 1D) @ NS ns1.liansir99.com. @ MX 10 mail.liansir99.com. @ NS slave.liansir99.com. ns1 A 10.1.1.1 slave A 10.1.1.4 www A 10.1.1.2 www A 10.1.1.3 mail A 10.1.1.5 ftp A 10.1.1.4 web CNAME ftp
-
修改解析库文件的属主属组并重启DNS服务
[root@centos6 /var/named]#chown named.named liansir99.com.zone [root@centos6 /var/named]#chmod 640 liansir99.com.zone [root@centos6 /var/named]#service named restart Stopping named: . [ OK ] Starting named: [ OK ] [root@centos6 /var/named]#
如果没有报错信息,则说明配置正常,若有相关报错,则查看系统日志/var/log/messages.
也可进行语法检测:
[root@centos6 ~]#named-checkconf [root@centos6 /var/named]#named-checkzone "liansir99.com" ./liansir99.com.zone zone liansir99.com/IN: loaded serial 2016100401 OK [root@centos6 /var/named]#
-
测试
[root@centos6 ~]#rndc reload server reload successful [root@centos6 ~]# [root@centos6 ~]#dig www.liansir99.com @10.1.1.1 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6 <<>> www.liansir99.com @10.1.1.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 27361;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0;; QUESTION SECTION: ;www.liansir99.com. IN A ;; ANSWER SECTION: www.liansir99.com. 86400 IN CNAME websrv.liansir99.com. ;; AUTHORITY SECTION: liansir99.com. 86400 IN SOA ns1.liansir99.com. admin.liansir99.com. 2016100401 3600 300 604800 86400 ;; Query time: 1 msec ;; SERVER: 10.1.1.1#53(10.1.1.1) ;; WHEN: Wed Oct 5 17:16:20 2016 ;; MSG SIZE rcvd: 102 [root@centos6 ~]#
查看53端口是否正常开启:
找一客户端,修改其/etc/resolv.conf文件,将nameserver指向主DNS10.1.1.1
注:重启服务后失效,可在网卡配置文件里面修改
在客户端上ping
在Windows上添加dns条目:
OK,我们再在DNS服务端开启httpd功能:
[root@centos6 ~]#service httpd status httpd (pid 6499) is running... [root@centos6 ~]#cat /var/www/html/index.html welcome liansir99.com [root@centos6 ~]#
在客户端上links:
[root@rhel5.4 ~]#dig -t A www.liansir99.com @10.1.1.1; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5 <<>> -t A www.liansir99.com @10.1.1.1 ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31319 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 1 ;; QUESTION SECTION: ;www.liansir99.com. IN A ;; ANSWER SECTION: www.liansir99.com. 86400 IN A 10.1.1.3www.liansir99.com. 86400 IN A 10.1.1.2;; AUTHORITY SECTION: liansir99.com. 86400 IN NS ns1.liansir99.com. ;; ADDITIONAL SECTION: ns1.liansir99.com. 86400 IN A 10.1.1.1 ;; Query time: 12 msec ;; SERVER: 10.1.1.1#53(10.1.1.1) ;; WHEN: Tue Oct 4 21:45:11 2016 ;; MSG SIZE rcvd: 101 [root@rhel5.4 ~]#
可看出DNS是用了53号端口进行网络服务的,那此处其走的是TCP还是UDP呢?分别屏蔽TCP与UDP53端口,然后dig。
[root@centos6 ~]#iptables -A INPUT -p tcp --dport 53 -j REJECT
[root@centos6 ~]#iptables -F [root@centos6 ~]#iptables -A INPUT -p udp --dport 53 -j REJECT
此由可知,DNS在一般情况下是用UDP进行查询的,谁叫人家UDP天生快人一步呢!至此,一个极简风格的DNS便配置完成了!步骤其实就不多,首先修改主配置文件/etc/named.con, 然后在主配置文件/etc/named.rfc1912.zones里面添加zone条目,最后在/var/named/目录下创建相关zone的解析库并重启name即可!
资源记录RR小结:
资源记录定义的格式: 语法:name [TTL] IN rr_type value 注意: (1) TTL可从全局继承 (2) @可用于引用当前区域的名字 (3) 同一个名字可以通过多条记录定义多个不同的值;此时DNS服务器会以轮询方式 响应 (4) 同一个值也可能有多个不同的定义名字;通过多个不同的名字指向同一个值进 行定义;此仅表示通过多个不同的名字可以找到同一个主机
反向解析
-
创建反向区域:反向区域也得指明主从
-
创建反向区域数据库
在反向解析中,邮件服务要求比较高,要一一对应。对于区域数据而言,SOA与NS是必须要添加的!
[root@rhel5.4 ~]#dig -x 10.1.1.1 # 等价于dig -t PTR 5.1.1.10.in-addr.arpa ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5 <<>> -x 10.1.1.1;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4864;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; QUESTION SECTION: ;1.1.1.10.in-addr.arpa. IN PTR ;; ANSWER SECTION:1.1.1.10.in-addr.arpa. 86400 IN PTR ns1.1.10.in-addr.arpa. ;; AUTHORITY SECTION:1.10.in-addr.arpa. 86400 IN NS ns1.liansir99.com. ;; ADDITIONAL SECTION: ns1.liansir99.com. 86400 IN A 10.1.1.1 ;; Query time: 15 msec ;; SERVER: 10.1.1.1#53(10.1.1.1) ;; WHEN: Tue Oct 4 23:26:01 2016 ;; MSG SIZE rcvd: 104 [root@rhel5.4 ~]#
反向区域也就是个纸老虎,两三步亦搞定,首先添加反向zone条目,然后创建反向区域数据库,最后修改反向解析库文件的权限与属主属组并重启DNS服务!
主从DNS服务器的实现
主从DNS服务器的实现,其实也不难,我们在上面实现的就是一个主DNS,接着我们实现从DNS即可,主从DNS的相关介绍请查卷DNS概述。
主从DNS服务器实现的步骤:
-
主授权从:allow-transfer与从服务器的NS记录
主服务器需要在bind的主配置文件/etc/named.conf或/etc/named.rfc191.zones的每个zone的定义中设置允许哪些从服务器来同步信息,不然谁都可以成为主的从服务器,这是一件多么可怕的事!
至于添加从服务器的NS记录,也不难理解,添加了NS记录,就得有解析NS的A记录,不然怎么解析去。
-
修改从服务器的主配置文件/etc/named.conf
-
在/etc/named.rfc1912.zones里面添加从DNS的zone条目
注意:主从的域名必须完全一致!文件名无所谓!
-
重启主从服务器的named进程,通过观察日志文件/var/log/mmessages或者查看从服务器上的解析库文件是否进行了同步。
注:从DNS服务器的数据解析库文件不需要定义,因为要从主服务器上同步过来。
设置好Windows的主DNS服务器,刷新其缓存:
C:\Users\Administrator>ipconfig /flushdns Windows IP Configuration Successfully flushed the DNS Resolver Cache.
nslookup的交互式查询与直接查询:
在linux上:
那么,反向区域的从服务器如何配置呢?正向的从都会了,还不会反向的从呼?依葫芦画瓢呗!
反向区域的从服务器
在主服务器上:
当然可以直接在主服务器的/etc/named.conf文件中直接指明:
在从服务器上添加反向的zone条目:
从服务器的allow-transfer要修改为none:
rndc reload 即可实现反向区域的主从同步!
由此可知,不管是正向的主从还是反向的主从,我们的思路是类似的:在主DNS服务器上修改/etc/named.conf文件并添加正向或反向的zone条目,指定从服务器的IP地址,写好正向和反向的解析库文件;在从DNS服务器上,只需修改/etc/named.conf文件并添加正向或反向的zone条目,最后重启DNS服务即可实现正向或反向的主从同(得到主DNS的解析库文件)。
我们用同样的端口测试方法可得到DNS的主从同步时用的是TCP/53.
子域授权
在DNS查询的过程中,DNS解析请求发送到指定的DNS服务器后,其会一级一级去查找域名进行解析,此处的每一级就是一个域,且每个域都为上级域的子域。
所谓子域授权,因为本级域只负责解析该级域名,对于下一级域名的解析便告知对应的DNS服务器地址,具体的解析权交给下级完成。
授权原理就是在本域名服务器上的正向解析库文件中定义子域对应的DNS服务器的主机名及其A记录即可。另外,子域还需要定义其对应子域的解析库文件,这样才能对子域进行解析。
子域的实现有两种方法:子域与父域在同一服务器上;子域与父域在不同的服务器上。
子域与父域在同一主机上的前提上子域与父域的访问量并不大,父域也无需对子域进行授权;而子域与父域如果在不同主机上,则父域要对子域进行授权。
子域与父域在同一服务器上的实现
方法一:
-
修改/etc/named.conf文件
-
添加子域的zone条目:vim /etc/named.rfc1912.zones
-
创始解析库文件
-
重启服务
[root@rhel5.4 ~]#dig www.game.liansir99.com ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5 <<>> www.game.liansir99.com ;; global options: printcmd;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56590 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 2 ;; QUESTION SECTION: ;www.game.liansir99.com. IN A ;; ANSWER SECTION: www.game.liansir99.com. 86400 IN A 10.1.1.3 www.game.liansir99.com. 86400 IN A 10.1.1.2 ;; AUTHORITY SECTION: game.liansir99.com. 86400 IN NS ns2.game.liansir99.com. game.liansir99.com. 86400 IN NS ns1.liansir99.com. ;; ADDITIONAL SECTION: ns1.liansir99.com. 86400 IN A 10.1.1.1 ns2.game.liansir99.com. 86400 IN A 10.1.1.1 ;; Query time: 14 msec;; SERVER: 10.1.1.1#53(10.1.1.1) ;; WHEN: Wed Oct 5 02:54:28 2016 ;; MSG SIZE rcvd: 140 [root@rhel5.4 ~]#
过程:电信DNS服务器–>.(根)–> .com–>liansir99.com—>game.liansir99.com
注:在/etc/named.rfc1912.zones这个文件里面,其认为liansir99.com与game.liansir99.com是平级的!所以,我们可以直接数据解析库中实现本机的子域。
方法二:
直接在资源记录中实现子域:
创建子域的zone:
创建解析库文件并重启服务:
测试:
[root@rhel5.4 ~]#dig www.study.liansir99.com ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5 <<>> www.study.liansir99.com;; global options: printcmd;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30814 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 2 ;; QUESTION SECTION: ;www.study.liansir99.com. IN A ;; ANSWER SECTION: www.study.liansir99.com. 86400 IN A 10.1.1.3 www.study.liansir99.com. 86400 IN A 10.1.1.2 ;; AUTHORITY SECTION: study.liansir99.com. 86400 IN NS ns2.study.liansir99.com. study.liansir99.com. 86400 IN NS ns1.liansir99.com. ;; ADDITIONAL SECTION: ns1.liansir99.com. 86400 IN A 10.1.1.1 ns2.study.liansir99.com. 86400 IN A 10.1.1.1 ;; Query time: 30 msec ;; SERVER: 10.1.1.1#53(10.1.1.1) ;; WHEN: Wed Oct 5 03:22:13 2016 ;; MSG SIZE rcvd: 141 [root@rhel5.4 ~]#
子域与父域在不同服务器上的实现
[root@centos6 ~]#yun -y install bind-chroot [root@centos6 ~]#service named restart Stopping named: [ OK ] Starting named: [ OK ] [root@centos6 ~]#
bind-chroot的安装使得DNS的数据库文件搬家:
[root@centos6 ~]#cd /var/named/chroot/ [root@centos6 /var/named/chroot]#ls dev etc usr var
在父域服务器上委派子域:在zone的解析库里面添加相应的子域NS记录并关闭dnssec
在/etc/named.conof里面关掉devsec相关选项。(只能no,不能注释掉,注释掉默认为yes)
在子域服务器上:也可以选择安装bind-chroot,并启动named服务。
[root@auto-centos7 ~]#yum -y install bind bind-chroot [root@auto-centos7 ~]#systemctl start named
-
修改主配置文件/etc/named.conf里面的相关内容并添加zone条目(或/etc/named.rfc1912.zones里面创建zone条目)
[root@auto-centos7 ~]#vim /etc/named.conf zone "music.liansir99.com" IN { type master; file "music.liansir99.com.zone"; }; [root@auto-centos7 ~]#named-checkconf
-
创建解析库文件
别忘了修改属主属组与权限:
[root@auto-centos7 /var/named]#chown named.named music.liansir99.com.zone [root@auto-centos7 /var/named]#chmod 640 music.liansir99.com.zone [root@auto-centos7 /var/named]#
-
rndc reload 父域与子域服务器
在子域上自查:
在父域上自查:
在其它主机上检测:
本文《DNS从入门到管理(一)》前半部分主要讲述了DNS及其相关的基本概念,后面以实验的形式给出一个最基本的DNS是怎么实现的,接着实现了DNS的反向解析、主从DNS服务器,最后介绍了子域授权。
2016.10.6
原创文章,作者:Liansir,如若转载,请注明出处:http://www.178linux.com/49999