1、DNS 概述

1.1、DNS的出现及演化

    网络出现的早期是使用IP地址通讯的,那时就几台主机通讯。但是随着接入网络主机的增多,这种数字标识的地址非常不便于记忆,UNIX上就出现了建立一个叫做hosts的文件(Linux和Windows也继承保留了这个文件)。这个文件中记录着主机名称和IP地址的对应表。这样只要输入主机名称,系统就会去加载hosts文件并查找对应关系,找到对应的IP,就可以访问这个IP的主机了。

    但是后来主机太多了,无法保证所有人都能拿到统一的最新的hosts文件,就出现了在文件服务器上集中存放hosts文件,以供下载使用。互联网规模进一步扩大,这种方式也不堪重负,而且把所有地址解析记录形成的文件都同步到所有的客户机似乎也不是一个好办法。这时DNS系统出现了,随着解析规模的继续扩大,DNS系统也在不断的演化,直到现今的多层架构体系。

1.2、DNS是什么

    DNS(Domain Name System),即域名系统。它使用层次结构的命名系统,将域名和IP地址相互映射,形成一个分布式数据库系统。

域名层次系统

    DNS采用CS架构,服务器端工作在UDP协议端口53和TCP协议端口53上。

    FQDN(Fully Qualified Domain Name)完全限定域名,它是使用DNS的树状层级结构的完全路径域名来表示一个准确位置对应的主机。

    提供正向解析(FQDN-->IP)和反向解析(IP-->FQDN)的功能。

    目前DNS已经成为了互联网通讯的基础服务。

1.3、互联网DNS访问模型

    DNS服务器采用分布式数据结构保存着海量的名称,那么用户如何快速的在互联网上访问哪台服务器或者哪些服务器就能找到待解析的数据呢?

域名访问_副本

客户机发起对www.kernel.org的解析请求

(1)客户机首先查看查找本地hosts文件,如果有则返回,否则进行下一步

(2)客户机查看本地缓存,是否存在本条目的缓存,如果有则直接返回,不再向外发出请求,否则进行下一步,转发。

(3)将请求转发本地DNS服务器。

(4)查看域名是否本地解析,是则本地解析返回,否则进行下一步。

(5)本地DNS服务器首先在缓存中查找,有则返回,无则进行下一步。

(6)向全球某一个根域服务器发起DNS请求,根域返回org域的地址列表。

(7)使用某一个org域的IP地址,发起DNS请求,org域返回kernel域服务器地址列表。

(8)使用某一个kernel域IP地址,发起DNS请求,kernel域返回www.kernel.org主机的IP地址,本地DNS服务收到后,返回给客户机。

以上客户机和本地DNS服务器直接的查询方式,称为递归查询。

本地DNS服务器多次重复查询的方式,称为迭代查询。

 

1.4、DNS的分类:

主DNS服务器:就是一台存储着原始资料的DNS服务器。

从DNS服务器:使用自动更新方式从主DNS服务器同步数据的DNS服务器。也成辅助DNS服务器。

缓存服务器:不负责本地解析,采用递归方式转发客户机查询请求,并返回结果给客户机的DNS服务器。同时缓存查询回来的结果,也叫递归服务器。

转发器:这台DNS发现非本机负责的查询请求时,不再向根域发起请求,而是直接转发给指定的一台或者多台服务器。自身并不缓存查询结果。

1.5、一些术语和概念

权威DNS服务器:它是负责对某区域能够进行解析,并在父区域中存储着NS记录的主或者从服务器。

权威应答AA(Authoritative Answer):权威服务器给出的最终答案是就是权威答案,并用协议中的某个标志位表示。

授权:就是上一级将它的子域的管理授权给某一个特定的组织和机构,子域的记录信息就直接由该组织或机构管理的权威服务器进行存储和解析。在上一级中需要保留指向子域的记录,这种记录就称为胶水记录(Glue Record)。

 

1.6、RR(Resource Record)资源记录

DNS层级结构中,不管是节点还是叶子节点都是资源,对这些资源中的某一个的标识使用一定格式的多字段的一条记录来表示,这条记录就是资源记录RR。RR的标准记录在RFC 1034中。

1.6.1、RR的组成:

owner name所属名称
typeRR的类型
TTL缓存RR的秒数(time-to-live)
class表示一个协议或者一族协议,常用IN表示Internet
RDATA记录数据

1.6.2、RR中IN类(class)常见类型(type)

SOA区域授权起始记录,区域文件第一条记录,而且一个区域文件只能有一条
NS域的授权名称服务器
MX域的邮件交换器,要跟着一个优先级值,越小越高
AIPV4主机地址
AAAAIPV6主机地址
PTR解析IP的指针
CNAME权威(正式)名称,定义别名记录

1.6.3、常用指令

1、$TTL

TTL 可以在SOA之前使用该指令,给出TTL秒数的32位整数值。

2、$ORIGIN

设定域名,它必须出现在任何一行省略书写的RR记录前。当一个区域文件第一次被读取时,隐含这个命令的值为<zone_name>.(必须是跟着一个半角句号),如果不设置它,就必须在区域文件中书写FQDN。

例如

$ORIGIN kernel.org.

www     CNAME    web-server

就等同于

www.kernel.org.    CNAME    web-server.kernel.org.

3、@符号

@符号等价于$ORIGIN。

 

1.6.4、SOA的RDATA格式

MNAME授权主机FQDN或者当前区域的名称
RNAME邮箱地址,@用.替代
SERIAL区域传送使用的版本号,格式为yyyymmddnn
REFRESH从服务器去同步主服务器时间间隔
RETRY刷新失败重试时间间隔
EXPIRE从服务器过期时长
MINIMUM否定答案过期时长

百度的SOA

a.shifen.com.        579    IN    SOA    dns.baidu.com. sa.baidu.com.  (    
                      1408010001 ; serial number    
                      5 ; refresh 5s    
                      5 ; retry 5s    
                      86400 ; expire 1d    
                      3600 ;min TTL 1h    
)

1.6.5、NS的RDATA格式

NSDName:DNS的FQDN

baidu.com.        64899    IN    NS    ns2.baidu.com.    
baidu.com.        64899    IN    NS    ns4.baidu.com.    
baidu.com.        64899    IN    NS    dns.baidu.com.    
baidu.com.        64899    IN    NS    ns7.baidu.com.    
baidu.com.        64899    IN    NS    ns3.baidu.com.

1.6.6、MX的RDATA格式

PREFERENCE:优先级,越小越高

EXCHANGE:邮件服务器FQDN

baidu.com.        7200    IN    MX    20 jpmx.baidu.com.    
baidu.com.        7200    IN    MX    20 mx50.baidu.com.    
baidu.com.        7200    IN    MX    10 mx.n.shifen.com.    
baidu.com.        7200    IN    MX    20 mx1.baidu.com.

1.6.7、CNAME的RDATA格式

CNAME:权威名称,FQDN

www.baidu.com.        1154    IN    CNAME    www.a.shifen.com.

www.a.shifen.com是正式名称,而www.baidu.com是别名

1.6.8、A的RDATA格式

ADDRESS:IP V4地址

www.baidu.com.        1154    IN    CNAME    www.a.shifen.com.    
www.a.shifen.com.    36    IN    A    111.13.100.92    
www.a.shifen.com.    36    IN    A    111.13.100.91

1.6.9、PTR的RDATA格式

7.100.in-addr.arpa.    IN     PTR    www.example.com.

 


2、BIND实现DNS服务

2.1、BIND是什么

1984年,加州大学伯克利分校的几个学生完成了Unix名称服务的实现,起名叫做Berkeley Internet Name Domain(BIND)。目前,它是互联网上使用最为广泛的DNS服务软件。

bind的发行版一般包含三个部分:域名服务器、域名解析器库、软件测试工具。


2.2、DNS实验

下面就安装bind来完成整个DNS的实验

2.2.1、前提:时间同步

在生产环境中,所有的服务器需要使用同一的时钟,一般会指向同一个时间源。时间源采用某种方式取得可靠准确的时间。

客户机可以使用ntp服务或者在crontab中配置ntpdate完成来完成时间同步。

2.2.2、环境准备

本文介绍了2种安装方式,源代码编译安装需要依赖众多开发库,请使用yum安装。将CentOS光盘挂载到/media/cdrom,配置本地yum源备用。配置yun请参看博主博文 《Linux的程序安装和包管理》,此类博文很多,这里不再赘述。使用下面的语句安装开发环境。

两台服务器分别安装了CentOS 6.5,地址分别为192.168.60.133(源码安装)、192.168.60.134、192.168.60.171。

# yum groupinstall "Development tools" "Server Platform Development"


2.2.3、安装BIND

2.2.3.1、rpm安装bind(192.168.60.171和192.168.60.134)

默认bind的库和工具已经安装,但是服务器软件没有安装,可以使用yum -y install bind 。

安装成功生成一下目录和文件:

服务脚本:/etc/rc.d/init.d/named

主配置文件:/etc/named.conf

区域解析库文件:/etc/named.rfc1912.zones

服务根目录:/var/named/

从服务器使用的区域解析库目录:/var/named/slaves,权限特殊

服务脚本使用的文件:

pid目录:/var/run/named/,在其下创建named.pid文件,使用时创建符号链接到其父目录中,即/var/run/named.pid,由服务脚本产生。

锁文件:/var/lock/subsys/named,由服务脚本产生。

以上这些目录和文件,是rpm安装的时候创建的,而且对这些文件和目录的权限做了很好的限定。对于配置文件的配置,下面将逐一实例介绍,部分解释在上面。

 

2.2.3.2、源代码安装(192.168.60.133上)

下载bind的源码,官网下载地址http://www.isc.org/downloads/bind/,本次使用版本为bin-9.10.0-P2.tar.gz。


(1)安装

configure的一些变量

    --prefix :默认在/usr/local

    --sysconfdir:默认在--prefix指定的目录下,如果--prefix为空,就为/etc

    --localstatedir:默认在--prefix指定的目录下,如果--prefix为空,就为/var

    --enable-threads:启用多线程

    --disable-chroot:不支持chroot

# ./configure --prefix=/usr/local/named9.10 --sysconfdir=/etc/named9.10 --enable-threads --disable-chroot
# make && make install
# ln -s /etc/named9.10/ /etc/named

安装完成  


(2)配置

编辑主配置文件/etc/named/named.conf

options {
    directory     "/var/named";
    recursion yes;     
}
zone "." IN {   
    type hint;
    file "named.ca";
}
include "/etc/named/named.rfc1912.zones";


生成/etc/named/named.rfc1912.zones文件,内容如下:

注意,此配置文件中,file中定义的是路径都是相对于上文中directory的路径 /var/named 的。  

zone "." IN {
	type hint;
	file "named.ca";
};
zone "localhost.localdomain" IN {
	type master;
	file "named.localhost";
	allow-update { none; };
};
zone "localhost" IN {
	type master;
	file "named.localhost";
	allow-update { none; };
};
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
	type master;
	file "named.loopback";
	allow-update { none; };
};
zone "1.0.0.127.in-addr.arpa" IN {
	type master;
	file "named.loopback";
	allow-update { none; };
};
zone "0.in-addr.arpa" IN {
	type master;
	file "named.empty";
	allow-update { none; };
};


建立运行根目录/var/named,准备基本的Zone文件,根、localhost正反向解析

# mkdir /var/named    
# cd /var/named/     
# touch named.ca named.localhost named.loopback named.empty


在/var/named目录中准备好这4个文件    
named.ca,可以使用dig -t NS . @a.root-servers.net > named.ca 生成。但是要注意的是,dig命令是安装了bind之后才有的,而且某些情况下,查询根的NS记录的命令返回结果可能没有A记录和AAAA记录,有可能被拦截。 named.ca内容如下:  

; <<>> DiG 9.5.0b2 <<>> +bufsize=1200 +norec NS . @a.root-servers.net
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34420
;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 20

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;.				IN	NS

;; ANSWER SECTION:
.			518400	IN	NS	M.ROOT-SERVERS.NET.
.			518400	IN	NS	A.ROOT-SERVERS.NET.
.			518400	IN	NS	B.ROOT-SERVERS.NET.
.			518400	IN	NS	C.ROOT-SERVERS.NET.
.			518400	IN	NS	D.ROOT-SERVERS.NET.
.			518400	IN	NS	E.ROOT-SERVERS.NET.
.			518400	IN	NS	F.ROOT-SERVERS.NET.
.			518400	IN	NS	G.ROOT-SERVERS.NET.
.			518400	IN	NS	H.ROOT-SERVERS.NET.
.			518400	IN	NS	I.ROOT-SERVERS.NET.
.			518400	IN	NS	J.ROOT-SERVERS.NET.
.			518400	IN	NS	K.ROOT-SERVERS.NET.
.			518400	IN	NS	L.ROOT-SERVERS.NET.

;; ADDITIONAL SECTION:
A.ROOT-SERVERS.NET.	3600000	IN	A	198.41.0.4
A.ROOT-SERVERS.NET.	3600000	IN	AAAA	2001:503:ba3e::2:30
B.ROOT-SERVERS.NET.	3600000	IN	A	192.228.79.201
C.ROOT-SERVERS.NET.	3600000	IN	A	192.33.4.12
D.ROOT-SERVERS.NET.	3600000	IN	A	128.8.10.90
E.ROOT-SERVERS.NET.	3600000	IN	A	192.203.230.10
F.ROOT-SERVERS.NET.	3600000	IN	A	192.5.5.241
F.ROOT-SERVERS.NET.	3600000	IN	AAAA	2001:500:2f::f
G.ROOT-SERVERS.NET.	3600000	IN	A	192.112.36.4
H.ROOT-SERVERS.NET.	3600000	IN	A	128.63.2.53
H.ROOT-SERVERS.NET.	3600000	IN	AAAA	2001:500:1::803f:235
I.ROOT-SERVERS.NET.	3600000	IN	A	192.36.148.17
J.ROOT-SERVERS.NET.	3600000	IN	A	192.58.128.30
J.ROOT-SERVERS.NET.	3600000	IN	AAAA	2001:503:c27::2:30
K.ROOT-SERVERS.NET.	3600000	IN	A	193.0.14.129
K.ROOT-SERVERS.NET.	3600000	IN	AAAA	2001:7fd::1
L.ROOT-SERVERS.NET.	3600000	IN	A	199.7.83.42
M.ROOT-SERVERS.NET.	3600000	IN	A	202.12.27.33
M.ROOT-SERVERS.NET.	3600000	IN	AAAA	2001:dc3::35

;; Query time: 147 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Mon Feb 18 13:29:18 2008
;; MSG SIZE  rcvd: 615


named.localhost 内容如下: 

$TTL 1D     
@    IN SOA    @ rname.invalid. (
                         0    ; serial                         
                         1D    ; refresh                         
                         1H    ; retry                         
                         1W    ; expire                         
                         3H )    ; minimum
         NS    @         
         A    127.0.0.1         
         AAAA    ::1


named.loopback 内容如下:  

$TTL 1D     
@    IN SOA    @ rname.invalid. (
                         0    ; serial
                         1D    ; refresh
                         1H    ; retry
                         1W    ; expire
                         3H )    ; minimum
     NS    @
     A    127.0.0.1         
     AAAA    ::1         PTR    localhost.

   
named.empty 内容如下:  

$TTL 3H     
@    IN SOA    @ rname.invalid. (
                         0    ; serial                         
                         1D    ; refresh                         
                         1H    ; retry                         
                         1W    ; expire                         
                         3H )    ; minimum         
        NS    @         
        A    127.0.0.1         
        AAAA    ::1


检查配置文件  

# named-checkconf      
# named-checkzone "localhost" named.localhost
zone localhost/IN: loaded serial 0     
OK     
# named-checkzone "localhost.localdomain" named.localhost
zone localhost.localdomain/IN: loaded serial 0     
OK
# named-checkzone "1.0.0.127.in-addr.arpa" named.loopback      zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0     
OK     
# named-checkzone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" named.loopback      
zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0     
OK


可以开始测试运行named了,由于是编译安装,并没有提供服务脚本,不能使用service启动named。


(3)工作环境配置

    1)导出环境变量  
在/etc/profile.d下创建文件named9.10.sh    

PATH=/usr/local/named9.10/bin:/usr/local/named9.10/sbin:$PATH     
export PATH

重启会话连接,echo $PATH,返回如下:  

/usr/lib64/qt-3.3/bin:/usr/local/named9.10/bin:/usr/local/named9.10/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

这样就把bind提供的众多命令加入到了搜索路径中了,方便使用    

    2)帮助文件导出

编辑/etc/man.config,添加下面的语句。    

MANPATH /usr/local/named9.10/share/man

    3)增加系统用户和组    

# groupadd -g 53 -r named     
# useradd -M -g named -r -u 53 named


(4)第一次启动

使用-g选项,让服务运行于前台,便于查错  

# named -g -u named

发现几个问题  

09-Aug-2014 03:29:52.385 couldn't mkdir '/usr/local/named9.10/var/run/named': Permission denied    
09-Aug-2014 03:29:52.385 generating session key for dynamic DNS    
09-Aug-2014 03:29:52.385 couldn't mkdir '/usr/local/named9.10/var/run/named': Permission denied    
09-Aug-2014 03:29:52.385 could not create /usr/local/named9.10/var/run/named/session.key    
09-Aug-2014 03:29:52.385 failed to generate session key for dynamic DNS: permission denied
09-Aug-2014 03:29:52.419 configuring command channel from '/etc/named9.10/rndc.key'   
09-Aug-2014 03:29:52.419 couldn't add command channel ::1#953: file not found

权限问题,执行下面语句

# chown -R named:named /usr/local/named9.10/var/    
# mkdir /var/named/slaves     
# chown -R :named /var/named/     
# chown named:named /var/named/slaves     
# chmod -R o-rwx /var/named/     
# chown :named /etc/named9.10/

开始测试

# dig -t A localhost @192.168.60.133
; <<>> DiG 9.10.0-P2 <<>> -t A localhost @192.168.60.133    
;; global options: +cmd     
;; Got answer:     
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46079     
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:    
; EDNS: version: 0, flags:; udp: 4096   
  
;; QUESTION SECTION:     
;localhost.            IN    A

;; ANSWER SECTION:    
localhost.        86400    IN    A    127.0.0.1

;; AUTHORITY SECTION:    
localhost.        86400    IN    NS    localhost.

;; ADDITIONAL SECTION:    
localhost.        86400    IN    AAAA    ::1

;; Query time: 2 msec    
;; SERVER: 192.168.60.133#53(192.168.60.133)
;; WHEN: Sat Aug 09 04:50:22 CST 2014     
;; MSG SIZE  rcvd: 96


服务启动成功。

以上配置好之后,基本达到了和rpm安装同样的状态,可以开始试验内容

 

3、实验

3.1、实验的内容

主从复制(区域传送)、子域授权、转发器、视图

 

3.2、主从复制(区域传送)

主从复制

(1)建立主DNS服务器

修改named.rfc1912.zone文件,在尾部添加

zone "example.org" IN {
    type master;
    file "example.org.zfile";
    allow-update { 127.0.0.1; };
    allow-transfer { 192.168.60.171; };
};

提供正向解析文件

在/var/named/下新建文件example.org.zfile,属主数组为named,权限640  

$TTL 1H     
@       IN SOA ns1 admin (
             2014080101 3600 600 86400 3600 )
             IN NS ns1             
             IN NS ns2             
             IN MX 10 mail
             
ns1    IN A 192.168.60.133     
ns2    IN A 192.168.60.171     
mail   IN A 192.168.60.200     
www    IN A 192.168.60.110
# chown named:named example.org.zfile
# chmod 640 example.org.zfile
# named-checkzone "example.org" example.org.zfile
zone example.org/IN: loaded serial 2014080101
OK

  

提供反向解析文件    

在主配置文件中,追加以下内容    

zone "60.168.192.in-addr.arpa" IN {
         type master;         
         file "60.168.192.in-addr.arpa.ptrfile";         
         allow-update { 127.0.0.1; };         
         allow-transfer { 192.168.60.171; };     
};

 

# cp -p example.org.zfile 60.168.192.in-addr.arpa.ptrfile
$TTL 1H     
@       IN SOA ns1.example.com. admin.example.com. (
             2014080101 3600 600 86400 3600 )
             IN NS ns1.example.com.             
             IN NS ns2.example.com.     
             
100 IN PTR ns1.example.com.     
101 IN PTR ns2.example.com.     
110 IN PTR www.example.com.     
200 IN PTR mail.example.com.

 
(2)RNDC

使用rndc(remote name domain controller)对named进行控制操作。默认工作TCP的953号端口,不安全,建议本地使用。

常用命令 :   
    reload 在线重新装载配置文件和zone文件    
    reload zone  重新加载指定的zone    
    stop [-p] 安全停止named。使用-p返回pid    
    flush 清除DNS缓存    
    status 显示服务器状态

# rndc-confgen -r /dev/urandom > /etc/named/rndc.conf    
# chgrp named /etc/named/rndc.conf     
# chmod 440 /etc/named/rndc.conf

 
打开rndc.conf,将下面部分追加到/etc/named/named.conf尾部(要去除前面的#,即注释)

key "rndc-key" {
    algorithm hmac-md5;         
    secret "I+gGCDDZ5OzuYTIj+bDu6g==";     
};
controls {
    inet 127.0.0.1 port 953             
        allow { 127.0.0.1; } keys { "rndc-key"; };     
};


(3)启动DNS服务    

# named -u named     
# rndc status     
version: 9.10.0-P2 <id:d23ac043>     
boot time: Fri, 08 Aug 2014 22:28:17 GMT     
last configured: Fri, 08 Aug 2014 22:28:17 GMT     
CPUs found: 2     
worker threads: 2     
UDP listeners per interface: 2     
number of zones: 103     
debug level: 0     
xfers running: 0     
xfers deferred: 0     
soa queries in progress: 0     
query logging is OFF     
recursive clients: 0/0/1000     
tcp clients: 0/100     
server is up and running


使用以下命令测试

# dig -t SOA example.org @192.168.60.133    
# dig -t MX example.org @192.168.60.133     
# dig -t A www.example.org @192.168.60.133
# dig -x 192.168.60.110  @192.168.60.133
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -x 192.168.60.110 @192.168.60.133    
;; global options: +cmd     
;; Got answer:     
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51009     
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0

;; QUESTION SECTION:    
;110.60.168.192.in-addr.arpa.    IN    PTR

;; ANSWER SECTION:    
110.60.168.192.in-addr.arpa. 3600 IN    PTR    www.example.com.

;; AUTHORITY SECTION:    
60.168.192.in-addr.arpa. 3600    IN    NS    ns1.example.com.     
60.168.192.in-addr.arpa. 3600    IN    NS    ns2.example.com.

;; Query time: 4 msec    
;; SERVER: 192.168.60.133#53(192.168.60.133)     
;; WHEN: Fri Aug  8 17:06:25 2014     
;; MSG SIZE  rcvd: 110

 

(4)建立从DNS服务器(rpm安装的,192.168.60.171)

从服务器的主配置文件中,将这两句改为如下,或者注释掉。  

listen-on port 53 { any; };     
allow-query     { any; };

在/etc/named.rfc1912.zones中

zone "example.org" IN {
    type slave;
    file "slaves/example.org.zone";
    masters { 192.168.60.133; };
    allow-transfer { none; };
};

启动服务

# service named start

查看/var/named/slaves/,已经存在文件example.org.zone了,内容为:    

# cat example.org.zone      
$ORIGIN .     
$TTL 3600    ; 1 hour     
example.org        IN SOA    ns1.example.org. admin.example.org. (
         2014080101 ; serial          
         3600       ; refresh (1 hour)   
         600        ; retry (10 minutes)
         86400      ; expire (1 day)
         3600       ; minimum (1 hour)  )
                    NS    ns1.example.org. 
                    NS    ns2.example.org.
                    MX    10 mail.example.org.
$ORIGIN example.org.     
mail           A    192.168.60.200     
ns1            A    192.168.60.133     
ns2            A    192.168.60.171     
www            A    192.168.60.110

检查是否能够解析 

# dig -t A www.example.org @192.168.60.171
; <<>> DiG 9.10.0-P2 <<>> -t A www.example.org @192.168.60.171    
;; global options: +cmd     
;; Got answer:     
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36324     
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:    
; EDNS: version: 0, flags:; udp: 4096     

;; QUESTION SECTION:     
;www.example.org.        IN    A

;; ANSWER SECTION:    
www.example.org.    3600    IN    A    192.168.60.110

;; AUTHORITY SECTION:    
example.org.        3600    IN    NS    ns2.example.org.     
example.org.        3600    IN    NS    ns1.example.org.

;; ADDITIONAL SECTION:    
ns1.example.org.    3600    IN    A    192.168.60.133     
ns2.example.org.    3600    IN    A    192.168.60.171

;; Query time: 4 msec    
;; SERVER: 192.168.60.171#53(192.168.60.171)
;; WHEN: Sat Aug 09 08:16:32 CST 2014     
;; MSG SIZE  rcvd: 128

 

3.3、子域授权及转发器

子域授权转发

假设子域为tech.example.org  

在父域172.168.60.133中的example.org.zfile添加胶水记录   

$TTL 1H     
@       IN SOA ns1 admin ( 
            2014080105 3600 600 86400 3600)             
        IN NS ns1             
        IN NS ns2             
        IN MX 10 mail     
        
tech    IN NS ns.tech     
ns.tech IN A 192.168.60.134

ns1     IN A 192.168.60.133    
ns2     IN A 192.168.60.171     
mail    IN A 192.168.60.200     
www     IN A 192.168.60.110

子域172.168.60.134中的/etc/named.rfc1912.zones中追加  

zone "tech.example.org" IN {
    type master;         
    file "tech.example.org.zone";
};

在/var/named下创建zone文件tech.example.org.zone  

$TTL 3600     
@ IN SOA ns admin (  
        2014080201 3600 600 86400 3600)
         IN NS ns
         
ns     IN A 192.168.60.134
www    IN A 192.168.60.190

启动子域(rpm安装的)  

# service named start

重新装载父域配置文件    

# rndc reload

测试成功,解析有子域提供,返回非权威答案   

# dig -t A www.tech.example.org @192.168.60.133
; <<>> DiG 9.10.0-P2 <<>> -t A www.tech.example.org @192.168.60.133    
;; global options: +cmd     
;; Got answer:     
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34877     
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:    
; EDNS: version: 0, flags:; udp: 4096     
;; QUESTION SECTION:     
;www.tech.example.org.        IN    A

;; ANSWER SECTION:    
www.tech.example.org.    3600    IN    A    192.168.60.190

;; AUTHORITY SECTION:    
tech.example.org.    3600    IN    NS    ns.tech.example.org.

;; ADDITIONAL SECTION:    
ns.tech.example.org.    3580    IN    A    192.168.60.134

;; Query time: 1 msec    
;; SERVER: 192.168.60.133#53(192.168.60.133)     
;; WHEN: Sat Aug 09 09:46:25 CST 2014     
;; MSG SIZE  rcvd: 98


3.4、转发器配置

见子域授权图

3.4.1、完全转发

这里有一个问题,使用子域的DNS服务,无法知晓父域,所有的非本域解析统统要去找根域。 

为了解决这个问题,可以将子域配置成为转发器,除了子域本身以外的解析,全部转发父域服务器。

在/etc/named.conf中添加forward和forwarders。    

options {
    listen-on port 53 { any; };         
    listen-on-v6 port 53 { ::1; };         
    directory     "/var/named";         
    dump-file     "/var/named/data/cache_dump.db";             
    statistics-file "/var/named/data/named_stats.txt";             
    memstatistics-file "/var/named/data/named_mem_stats.txt";         
    allow-query     { any; };          
    
    // write here     
    forward only;        
    forwarders { 192.168.60.133; };
};

logging {
    channel default_debug {
        file "data/named.run";
        severity dynamic;
    };
};

zone "." IN {
    type hint;
    file "named.ca";
};

include "/etc/named.rfc1912.zones";

开始测试,本地转发www.example.org的解析请求给父域,返回非权威答案

# dig -t A www.example.org @192.168.60.134
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t A www.example.org @192.168.60.134    
;; global options: +cmd     
;; Got answer:     
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38054     
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:    
;www.example.org.        IN    A

;; ANSWER SECTION:    www.example.org.    3354    IN    A    192.168.60.110

;; AUTHORITY SECTION:    
example.org.        3354    IN    NS    ns1.example.org.     
example.org.        3354    IN    NS    ns2.example.org.

;; ADDITIONAL SECTION:    
ns1.example.org.    3354    IN    A    192.168.60.133     
ns2.example.org.    3354    IN    A    192.168.60.171

;; Query time: 0 msec    
;; SERVER: 192.168.60.134#53(192.168.60.134)     
;; WHEN: Sat Aug  9 02:42:26 2014     
;; MSG SIZE  rcvd: 117

3.4.2、区域转发

当然这里还可以配置区域转发,对example.org定义为一个区域,里面配置forward和forwarders。  

在/etc/named.conf中移除forward和forwarders两句。

在/etc/named.rfc1912.zones中追加   

zone "example.org" IN {
    type forward;
    forward only;
    forwarders { 192.168.60.133; };
};

使用rndc reload重新装载配置文件    

# dig -t A www.example.org @192.168.60.134

测试成功。  

 

3.5、view视图

视图

不同IP段的客户端,DNS分析判断后返回不同的结果。

将来自172.168.60.133的请求访问是intra_view,其他的IP的请求都访问inter_view。  

这次使用acl访问控制列表,在192.168.60.133上/etc/named/named.conf中,在起始行添加   

acl intranet { 192.168.60.133; 127.0.0.1; };

重新修改/etc/named/named.rfc1912.zones,定义2个视图   

view "intra_view" {
	match-clients { intranet; };
	
	zone "." IN {
		type hint;
		file "named.ca";
	};
	
	zone "localhost.localdomain" IN {
		type master;
		file "named.localhost";
		allow-update { none; };
	};
	
	zone "localhost" IN {
		type master;
		file "named.localhost";
		allow-update { none; };
	};
	
	zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
		type master;
		file "named.loopback";
		allow-update { none; };
	};
	
	zone "1.0.0.127.in-addr.arpa" IN {
		type master;
		file "named.loopback";
		allow-update { none; };
	};
	
	zone "0.in-addr.arpa" IN {
		type master;
		file "named.empty";
		allow-update { none; };
	};
	
	zone "example.org" IN {
		type master;
		file "example.org.zfile";
		allow-update { 127.0.0.1; };
		allow-transfer { 192.168.60.171; };
	};
	
	zone "60.168.192.in-addr.arpa" IN {
		type master;
		file "60.168.192.in-addr.arpa.ptrfile";
		allow-update { 127.0.0.1; };
		allow-transfer { 192.168.60.171; };
	};
};

	view inter_view {
		match-clients { any; };
		zone "test.com" IN {
		type master;
		file "test.com.zone";
	};
};

新增/var/named/test.com.zone文件   

$TTL 1H     
@       IN SOA ns1 master (
            2014080101 3600 600 86400 3600)
        IN NS ns1
        IN MX 10 mail
 
ns1    IN A 172.16.200.100     
mail   IN A 172.16.200.200     
www    IN A 172.16.200.110

开始测试   

本机192.168.60.133上测试   

# dig -t A www.example.org @192.168.60.133
; <<>> DiG 9.10.0-P2 <<>> -t A www.example.org @192.168.60.133    
;; global options: +cmd     
;; Got answer:     
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46433     
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:    
; EDNS: version: 0, flags:; udp: 4096     

;; QUESTION SECTION:     
;www.example.org.        IN    A

;; ANSWER SECTION:    
www.example.org.    3600    IN    A    192.168.60.110

;; AUTHORITY SECTION:    
example.org.        3600    IN    NS    ns1.example.org.     
example.org.        3600    IN    NS    ns2.example.org.

;; ADDITIONAL SECTION:    
ns1.example.org.    3600    IN    A    192.168.60.133     
ns2.example.org.    3600    IN    A    192.168.60.171

;; Query time: 2 msec    
;; SERVER: 192.168.60.133#53(192.168.60.133)     
;; WHEN: Sat Aug 09 18:40:14 CST 2014     
;; MSG SIZE  rcvd: 128

# dig -t A www.test.com @192.168.60.133
无法解析,此处省略

在192.168.60.134上测试  

# dig -t A www.test.com @192.168.60.133
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t A www.test.com @192.168.60.133    
;; global options: +cmd     
;; Got answer:     
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5917     
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:    
;www.test.com.            IN    A

;; ANSWER SECTION:    
www.test.com.        3600    IN    A    172.16.200.110

;; AUTHORITY SECTION:    
test.com.        3600    IN    NS    ns1.test.com.

;; ADDITIONAL SECTION:    
ns1.test.com.        3600    IN    A    172.16.200.100

;; Query time: 2 msec    
;; SERVER: 192.168.60.133#53(192.168.60.133)     
;; WHEN: Sat Aug  9 04:21:18 2014     
;; MSG SIZE  rcvd: 80

# dig -t A www.example.org @192.168.60.133
解析不到,此处省略

 

    综上,DNS是一个非常重要的基础性服务,有很多的概念,标准内容也非常多。不仅用于互联网解析,也可以用在企业内建网络中。常用的就有主从复制、子域授权、转发和视图几种模式。要熟悉这些基础概念和应用场景,就能利用它对整个局域网乃至互联网的访问进行优化。

 

参考资料

维基百科

https://en.wikipedia.org/wiki/List_of_DNS_record_types

域名标准规格

http://tools.ietf.org/html/rfc1035

BIND手册

http://www.isc.org/downloads/bind/doc/bind-9-9/

DNS资料

http://dns-learning.twnic.net.tw/dns/toc.html

https://www.cnnic.net.cn/