注:理论很重要,所以笔者希望博友能把DNS的工作原理理解清楚,这样才能够真正理解DNS是什么?理论虽然枯燥,但很重要,配置很简单,好了,废话少说,书归正传:
       相信大家通过笔者关于“互联网域名解析系统DNS的工作原理及相关服务配置”基本了解了DNS工作原理和简单的配置,下面将介绍高级配置,在配置之前我们
来回顾下关于DNS一些常识及一些文件的配置格式。

       DNS所使用的协议及端口:TCP/53  UDP/53
DNS域名服务器主要用于解析FQDN和IP地址之间的转换;

       FQDN-IP:正向解析(A记录)
       IP-FQDN:反向解析(PTR指针)
rndc的controls语句

 

  1.    controls语句限定了rndc和正在运行的named进程之间如何进行交互,系统管理员可以用rndc向named进程发送信号并控制它。  
  2. rndc可以连接并控制启动和停止named进程、转储named状态、将named转入调试模式。rndc是一个网络程序,如果配置不当或不正确,来自互联网上的用  
  3. 都可以连接并控制DNS服务,所以在配置rndc时,一定要谨慎!!  
  4. controls语法:  
  5.     controls {  
  6.         inet ip_addr port ip-port allow { address_match_list } keys { key_list };  
  7.     };  
  8. rndc用来于named通信的端口默认为953, 
  9. 下面我们会通过rndc-confgen命令生成rndc和named之间使用验证配置rndc,实现远程控制DNS服务


如何设置根服务器的线索呢,格式为:

  1. zone "." IN {  
  2.     type hint;  
  3.     file "path"      ##path指根服务器的区域文件,默认为"/var/named/named.ca" 
  4. };  
  5. ”hint(线索)“是一个列出根域(".")服务器的DNS记录的集合.需要用它们为一个递归的、有缓存的named提供一个位置,从这个位置开始搜索其他站点的域  
  6. 信息。没有根搜索,named只知道自己所属的域,还有这个域的子域。 

如何设置一个转发区呢,格式为:

  1. zone "domain_name" IN {  
  2.       type forward;  
  3.       forwarders only | first;  
  4.       forwarders { ip_addr;ip_addr,......};  
  5.       }; 

我们知道如何配置一个区的主服务器的格式:

  1. zone "Domain_Name"  IN {  
  2.     type "master";  
  3.     file "path";       
  4.     allow-query { addr_match_list; };  
  5.     allow-transfer { my_slave ; };  
  6.     allow-update { add_match_list; };
  7. .......... 
  8. }; 

那如何配置一个区的从服务器的格式呢,是这个样子滴:

  1. zone "Domain_Name" IN  {  
  2.     type slave;  
  3.     file "slave/path";  
  4.     masters {  ip_addr; };  
  5.     allow-transfer { addr_match_list; };  
  6.   .......
  7. };   

 VIEW语句的介绍:

  1. 通过view语句可以完成DNS的智能解析功能,并且灵活控制哪些客户机能看到哪个view视图的访问控制列表。语法:  
  2.     view view-name {  
  3.         match-clients { address_match_list };  
  4.         match-destinations { address_match_list };  
  5.         match-recursive-only yes|no 
  6.         view_option;...  
  7.         zone_statement;...  
  8.     };  
  9. 其实说白了,view视图是根据match_clients提供的查询报文的IP地址进行过滤,一般用于让一个站点的DNS数据分为内外不同的结果,下面  
  10. 我们会通过模拟外网和内网实现view,并让DNS提供智能解析。  

那么接下来不就是配置正向区域文件及反向区域文件对吧,格式还记得吗?
正向(A)解析区域文件格式:

  1. $TTL time(默认为秒)  
  2. @       IN      SOA     ns1.example.com.    admin.example.com. (  
  3.                         序列号  
  4.                         更新时间  
  5.                         重试时间  
  6.                         过期时间  
  7.                         非权威相应TTL时间 )  
  8.             IN  NS      ns1  
  9.             IN  MX  5   mail  
  10. ns1         IN  A       172.16.88.1  
  11. www         IN  A       172.16.88.1  
  12. mail        IN  A       172.16.88.5 

反向(PTR)区域配置文件格式

  1. $TTL time(默认为秒)  
  2. @       IN      SOA     ns1.example.com.    admin.example.com. (  
  3.                         序列号  
  4.                         更新时间  
  5.                         重试时间  
  6.                         过期时间  
  7.                         非权威相应TTL时间 )  
  8.             IN  NS      ns1  
  9. 1           IN  PTR     ns1.example.com.  
  10. 1           IN  PTR     www.example.com.  
  11. 5           IN  PTR     mai.example.com. 

递归和非递归服务器的区别,来一块来回想下它们之间的区别:

  1. 递归服务器工作模式:  
  2. 当客户端发送DNS查询请求时,递归服务器仅返回真实的答案或者错误消息(它自己跟踪这些推荐的服务器,免除了客户端这项任务)  
  3. 非递归服务器工作模式:  
  4. 当客户端发送DNS查询请求时,非递归服务器器会查询缓存文件,如果有客户端发送的请求结果,那么就将结果返回给客户端,否则,它并不直接返回答案给客户端,  
  5. 而是推荐一个其他域的权威性服务器,所以发送请求的客户端自己去查询相应的域权威服务。 

下面就来介绍下关于子域授权的概念及如何实现子域的授权

  1. 我们知道DNS是以分布式进行完成域名和IP地址解析的,进行子域授权其实就是在主域的基础上划分子域,并将权限赋予子域的某台服务器,实现层次管理而已。  
  2. 创建子域,其实就是在原来权威结构(只是赋予给了本地例如"example.com")权威结构内:  
  3. 实现步骤如下:  
  4. 选择本地环境中唯一的域名、确定两台或更多主机作为新域的服务器、与父域(example.com)取得协调。  
  5. 注:父域在执行授权之前,应该核查确定子域的域名服务器已启动并正常运行。如果子域域名服务器没有启动,可能会造成父域在授权时产生"授权失败等信息" 

下面就来配置如何实现子域授权:(example.com为例实现子域授权)

  1. 域:example.com   
  2. 主DNS相关记录信息:  
  3. 主DNS服务器:ns1.example.com(172.16.88.1/16)  
  4. www.example.com(172.16.88.1/16)   ##提供web服务器  
  5. mail.example.com(172.16.88.5/16) ##提供E-mail服务器  
  6.  
  7. 子域:fin.example.com   
  8. 子域DNS服务器:ns.fin.example.com(172.16.88.20/16)  
  9. 子域相关DNS记录:  
  10. www.fin.example.com(172.16.88.20/16)     ##提供web服务器  
  11. mail.fin.example.com(172.16.88.21/16)    ##提供fin.example.com域内的E-mail电子邮件收发  
  12. ftp.fin.example.com(172.16.88.22/16)     ##提供FTP服务器,实现资源共享  

下面我们就来操作下如何在example.com域内实现子域授权:
查看当前系统是否安装bind-libs和bind-utils软件包,如果安装则使用rpm -e卸载。这里我们采用的是bind97版本,所以我使用yum来安装。


Seq1:编辑正向区域文件,并添加如下内容并保存退出

  1. # vim /var/named/example.com.zone  
  2. $TTL time(默认为秒)  
  3. @       IN      SOA     ns1.example.com.    admin.example.com. (  
  4.                         2013041201  
  5.                         1H  
  6.                         5M  
  7.                         7D  
  8.                         3D )  
  9.             IN  NS      ns1  
  10.             IN  MX  5   mail  
  11. ns1         IN  A       172.16.88.1  
  12. www         IN  A       172.16.88.1  
  13. mail        IN  A       172.16.88.5  
  14. fin         IN  NS      ns.fin     ##在这里我们添加了一个子域(fin.example.com)并给出了相应的A记录  
  15. ns.fin      IN  A       172.16.88.20 

Seq2:到172.16.88.20这台主机上配置fin.example区域,并将DNS(/etc/resolv.conf)的nameserver改为172.16.88.1即可

  1. # rpm -e bind-libs bind-utils  
  2. 这里我们使用的bind97版本,所以在这里我们将系统默认安装bind-libs和bind-utils软件包卸载,并通过YUM来安装bind97版本的软件包  
  3. # yum install bind97 bind-utils -y  
  4. # mv /etc/named.conf /etc/named.conf.bak  
  5. 这里我们采用手动配置named.conf主配置文件,所以把bind97版软件安装所产生的配置文件给予重命名:  
  6. # vim /etc/named.conf  
  7. options {  
  8.         directory "/var/named" ;              ##指明区域文件保存的位置  
  9. };  
  10. zone "." IN                                   ##定义根区域文件名称  
  11.         type hint;  
  12.         file "named.ca";                      ##默认存放在/var/named/named.ca  
  13. };  
  14. zone "localhost" IN {  
  15.         type master;  
  16.         file "named.localhost";                
  17. };  
  18. zone "0.0.127.in-addr.arpa" IN {  
  19.         type master;  
  20.         file "named.loopback";  
  21. };  
  22. zone "fin.example.com" IN {                       ##定义fin.example.com正向区域配置文件  
  23.         type master;                           ##类型为master(主DNS)  
  24.         file "fin.example.com.zone";              ##fin.example.com域正向区域配置文件存放名称(/var/named/fin.example.com.zone)  
  25. };  
  26. 注:然后执行将named.conf配置文件的属组及权限分别更改为named和640即可:  
  27. # chgrp named /etc/named.conf && chmod 640 /etc/named.conf 

Seq3:创建fin.example.comz正向区域配置文件

  1. # vim /var/named/fin.example.com.zone  
  2. $TTL 86400  
  3. @       IN      SOA     ns.fin.example.com.     admin.fin.example.com. (  
  4.                         2013041201  
  5.                         1H  
  6.                         5M  
  7.                         7D  
  8.                         3D )  
  9.             IN  NS      ns  
  10.             IN  MX 5    mail  
  11. ns          IN  A       172.16.88.20  
  12. www         IN  A       172.16.88.20  
  13. mail        IN  A       172.16.88.21  
  14. ftp         IN  A       172.16.88.22  
  15. 注:因为在这里我们采用的是手动配置区域数据文件,所以别忘记更改属组为named及权限为640噢 

Seq4:这样一个基于example.com域名授权的fin.example.com就完成,下面我们就可以进行测试:
在主DNS服务器上测试(172.16.88.1)

然后到子域fin.example.com查询www.fin.example.com的A记录

 
下面我们用windows分别使用主DNS和子域查询www.fin.example.com的A记录

下一个问题,如何同view视图实现DNS智能解析:(内网和外网)
说明:将来自172.16.0.0/16和127.0.0.0/8的网段的IP为内网的主机,其它网络的IP或未知IP均为外网的主机,所以我们使用acl来定义控制列表
在配置之前我们需要对eth0配置第二IP地址:

  1. # vim /etc/named.conf  
  2. options {  
  3.     directory "/var/named";  
  4. };  
  5.  
  6. acl internal {            ##定义acl列表,当来自172.16.0.0/16和127.0.0.0/8的网段均为内网用户  
  7.     172.16.0.0/16;  
  8.     127.0.0.0/8;  
  9. };  
  10.     view "internal" {                          ##定义内网主机所使用的解析区域文件  
  11.         match-clients { internal; };  
  12.         recurion yes;  
  13.         zone "example.com" IN {  
  14.             type masters;  
  15.             file "internal.example.com.zone";  
  16.         };  
  17.     };  
  18.       
  19.     view "external" {                           ##定义外网主机所使用的解析区域文件  
  20.         match-clients { any; };  
  21.         recurion yes;  
  22.         zone "example.com";  
  23.             type master;  
  24.             file "external.example.com.zone";  
  25.         };  
  26.     }; 

Seq2:使用named-checkconf来检测主配置文件是否有存在语法错误
# named-checkconf  /etc/named.conf

Seq3:分别创建电信网和联通网所需要的区域数据文件:
内网(internal)用户访问example.com域服务器所使用的正向解析区域文件:

  1. # vim  /var/named/internal.example.com.zone  
  2. $TTL  86400  
  3. @   IN  SOA ns1.example.com.    admin.example.com. (  
  4.             2013041201  
  5.             1H  
  6.             5M  
  7.             7D  
  8.             3D )  
  9.         IN  NS  ns1  
  10.         IN  MX  5   mail  
  11. ns1     IN  A   172.16.88.1  
  12. mail    IN  A   172.16.88.5  
  13. www     IN  A   172.16.88.1 

外网(external)用户访问example.com域服务器所使用的正向解析区域数据文件

  1. # vim  /var/named/external.example.com.zone  
  2. $TTL  86400  
  3. @       IN      SOA     ns1.example.com.        admin.example.com. (  
  4.                         2013041201  
  5.                         1H  
  6.                         5M  
  7.                         7D  
  8.                         3D )  
  9.         IN      NS      ns1  
  10.         IN      MX  5   mail  
  11. ns1     IN      A       172.16.88.1  
  12. www     IN      A       192.168.0.1  
  13. mail    IN      A       192.168.0.5 

Seq4:将internal和external所使用的解析区域数据文件的属组及权限分别改为named和640:

  1. # chgrp named  internal.example.com.zone  external.example.com.zone  
  2. # chmod 640  internal.example.com.zone  external.example.com.zone 

Seq5:使用named-checkzone分别检测internal和external所使用的区域数据文件是否存在语法错误
# named-checkzone "example.com" /var/named/internal.example.com.zone
# named-checkzone "example.com" /var/named/external.example.com.zone

Seq6:使用named进程,并将执行开机自动启动
# service named restart && chkconfig named on

Seq7:分别在172.16.0.0/16和192.168.0.0/24网段上进行测试,并查看结果
现在172.16.0.0/16主机进行测试:

 然后再192.168.0.0/24网络主机上进行测试: