转自http://guoting.blog.51cto.com/8886857/1536612

DNS (Domail Name Server,域名服务)

一、DNS概述

    DNS 是一种 C/S 架构,实现域名解析。服务端监听在 UDP/53 和 TCP/53 号端口。主要主机名与 IP 地址之间的名称解析。

    所谓的名称解析:简单的来说是将一种名称转换为另一种名称。通常是用户名和 IP 地址之间的转换。它们之间是通过解析库来实现的。像 /etc/passwd 文件就是一种用户名和UID之间的一种解析库。

    在 Linux 操作系统中,服务端协议的实现是 bind 软件,客户端通过调用 共享库 向服务端发出请求,通过查询解析库来获得解析结果。

二、DNS的树状结构

  DNS最主要的实现方式是FQDN(Full Qualified Domail Name,完全限定主机名)向IP地址的解析。例如:当我问访问在互联网里访问  的时候,DNS 服务器就会将他解析成对应的 IP 地址来进行访问。

  实际在访问的主机名是  ,它是由 根域,一级域,二级域,主机名组成的。

 根域:  “.”是DNS域名的最顶端的域。这样的域名服务器全球只有13个。

 一级域:.com .net .cn .gov。

 二级域:一般是公司和组织的名称,向 goole,baidu等。

 主机名:一般式是某台主机的名称。

三、DNS服务器类型

  • 主DNS服务器:

    主要负责 DNS 域名解析。本服务器可以使一个权威服务器,负责一个区域的域名解析。主要靠解析库文件来完成名称的解析。

  • 从DNS服务器:

    是主服务器的一个热备,当主服务器出现故障时,会通过从服务器来解析。实现主从复制最主要的是解析库文件的同步,即区域传送。

    区域传送有完全区域传送(AXFR)和增量区域传送(IXFR)。

  • 缓存服务器:

    一般都是在本地或者是在局域网内。一是为了提高解析速度,二是为了减轻服务端的压力。

  • 交换服务器:

    一般用在子域授权的机制中用到这种服务器。在子域中访问父域的主机名是需要用到这种机制。

四、DNS查询过程

查询的方式有递归查询和迭代查询。

递归查询是客户端只需要发出一次请求,最后直接返回结果的这种查询;迭代查询就是只要查询到结果就返回,然后在由客户端根据查询到的结果再次发出查询请求的过程。在实际的过程中是递归查询和迭代查询是结合在一起来使用的。

在进行域名解析的时候,DNS查询是真正的顺序是:本地的  /etc/hosts 文件 -->  本地的DNS缓存  -->  本地局域网的DNS服务器  -->  迭代查询公共的DNS服务器。

五、服务介绍

    在 Linux 中DNS服务是由 bind 这个开源软件来提供的。在安装这个软件后,有后台守护进程来 named 控制,运行此进程的用户是系统用户 named。为了安全考虑,named 进程一般运行于 chroot 环境中,模拟的根在 /var/named/chroot 目录下。

1、相关文件

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

  • 主配置文件: /etc/named.conf  /etc/named.rfc1912.zones

  • 区域配置(解析库)文件:/var/named/ZONE_NAME.zone

2、配置文件的说明

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

#  /etc/named.conf# 在这个文件中主要定义(这些定义是全局范围内有效的):# 监听的IP地址和端口号# 区域文件的家目录# 是否允许递归查询# 查询请求options {      listen-on port 53 { 127.0.0.1; };      listen-on-v6 port 53 { ::1; };      directory       "/var/named";      allow-query     { localhost; };      recursion yes;}; # /etc/named.rfc1912.zones# 在这个文件安中主要定义的是 区域解析库文件# 一般的格式如下:zone "ZONE_NAME" IN {        属性定义;};# 常见的属性定义有:# type 指明服务器的类型 常见的有 master hint slave forword# file 指明区域文件的名称 # masters 在 type 为 slave 一起使用,指明主服务器的地址,常见的还有 allow-transfer { IP; };# 指明允许区域传送的地址,一般在主服务器端这是为从服务器端的 IP 地址,从服务器端设置为 none。 # forward only|first 指明转发服务器的类型,only 只做转发,转发后的查询结果狗接受;first # 指的是转发到的那台 DNS 服务器如果查询不到结果,自己会迭代查询。通常与 type 为forward时# 一起使用。通常还有 forwarders { ip; }; 指定转发的DNS服务器的名称。# 此时在服务端要设定 allow-recusion { ip; }; 允许递归的 IP 地址,此时 IP 地址是请求转发的 IP 地址,# 这种情况下一般是在子域授权的时候会使用。 # 其他常见的参数有:# all-update { ip; }; 允许更新 DNS 解析文件的 IP 地址 # file 来指明 zone 文件的名称。00 # ZNOE_NAME 一般是区域名,对于正向解析是 一般是域名,例如:guotign.com# 对于反向解析时,一般是网络地址逆序.in-addr.arpa 例如:16.172.in-addr.arpa # 其他常见的控制有 acl 和 view。acl ACL_NAME {     ip;    net; ...};

区域配置(解析库)文件:/var/named/ZONE_NAME.zone

 这个文件中定义了资源记录,常见的资源记录有:SOA NS A A6(AAAA) MX CNAME PTR # 这些资源定义的格式如下: Name     [TTL]     IN    RR_TYPE    RRDATA # SOA(Start Of AuthOrity,起始授权记录),任何解析库文件的第一个记录必须是 SOA # Name值一般为区域名,通常我们用 @ 来代替。RRDATA 是主服务器的 FQDN,也可以是当前区域的名称 @。# 例如: @        IN        SOA        ns.guoting.com.  admin.guoting.com. (            2014080601        ;serial number 解析库的序列号。主要用于主从复制            2H                ;refresh time  周期性同步时间间隔            5M                ;retry  time   重试时间间隔            1H                ;expire time   过期时长            1D                ;negetive answer ttl  否定答案同一缓存时长)  # NS(Name Server)# Name 是区域名称,一般也是 @ 来代替,如果此时是空白的话,就会继承上一个资源记录的 Name 的值# RRDATA 的值是主 DNS 的FQDN# 如果有多台 NS 服务器,每一台都必须有一个 NS 记录。# 例如:@    IN    NS    ns.guoting.com. # MX(Mail eXchanger,邮件交换记录)# Name 的值一般也是区域名称,RRDATA 邮件服务器的 FQDN 。# 一台邮件服务器对应一个 MX 记录,每个 MX 记录还有优先级的设定。数值越小所代表的优先级越高。# 例如:# 这里说明一下:主机名书写的2种方式 mail 或者是 mail.guoting.com.@    IN    MX    10    mail # A AAAA(A6) Address记录 # Name 一般是 FQDN;RRDATA 是对应的 IP 地址# 例如:mail    IN    A    192.168.10.23  # CNZME(Canonical Name正式名称)# Name 和 RRDATA 的值一般都是 FQDN。表示的是 Name 是 RRDATA 的别名。# 例如:mail2    IN    CNAME    mail 等价于:mail2.guoting.com.    IN    CNAME    mail.guoting.com. # PTR(PoinTeR 记录)# 这个记录主要是用于反向解析的时候# Name 是逆向 IP 地址加后缀 .in-addr.arpa. # RRDATA 是 FQDN# 例如:9.10    IN    PTR    ns.guoting.com.或者是:9.10.16.172.in-addr.arpa.    IN    PTR    ns.guoting.com # 常用到的 2 个内置变量# $TTL(time-to-live of the RR)设置资源记录的生存周期# $ORIGIN 设定默认区域名

上面是一些常见的资源记录,更多详细的的信息参照  。

六、相关工具

1、named-checkconf  named-checkzone  named-compilezone 

    这几个命令的主要作用是检查配置文件和解析库文件的语法格式的。

  • named-checkconf是用来检查主配置文件的语法格式的。

        用法:

            named-checkconf 

  • named-checkzone、named-compilezone是用来检查 zone 文件的语法格式的。

    用法:

        named-checkzone  zonename filename

        named-compilezone -o filename zonename filename # -o 会对zone 文件做一个备份

    例如:

        named-checkzone  "guoting.com"  /var/named/guoting.com.zone

        named-compilezone -o  guoting.bck "guoting.com"  /var/named/guoting.com.zone

2、客户端查询工具

    常见的客户端的查询工具有 host,dig,nslookup。

host -t {A|NS|CNAME|PTR|MX} type_name dns_server 例如:

[root@server named]# host -t A www.guoting.com 172.16.10.9Using domain server:Name: 172.16.10.9Address: 172.16.10.9#53Aliases:  www.guoting.com has address 172.16.10.16

dig -t {A|NS|CNAME|MX}  type_name @dns_server

逆向查询:dig -x IP @dns_server

dig 查询的信息比较详细,是我们一般的首选查询工具

nslookup是一种交互式的查询工具,这个工具在 windows 操作系统上也可以使用。

用server来指定DNS服务器的名称,set type=RR 来指定查询资源记录的名称,指定后直接查询对应的资源记录即可。

七、自建 DNS 服务器

    这里需要说明的是在这里所自建的DNS服务器实在本地局域网内的权威服务器。目的是解决本地局域网内的域名解析。

1、实现主从复制DNS服务器,实现正向和反向解析

    前提:主服务器和从服务器时间要同步,建议使用 ntp 服务器同步。

dns-master    192.168.3.73    主服务器

dns-slave      192.168.3.74    从服务器

在 192.168.3.73 主dns服务器:

1、安装软件

[root@dns-master ~]# yum install bind -y

2、修改配置文件/etc/named.conf

[root@dns-master ~]# egrep -v "^$|^//|^#|^[[:space:]]+#" /etc/named.conf options {	listen-on port 53 { 192.168.3.73; };	directory 	"/var/named";};zone "." IN {	type hint;	file "named.ca";};include "/etc/named.rfc1912.zones";

编辑配置文件/etc/named.rfc1912.zones

[root@dns-master ~]# tail -13 /etc/named.rfc1912.zones zone "lyao.com" IN {    type master;                                #区域类型    file "lyao.com.zone";                       #区域文件名称    allow-transfer { 192.168.3.74; };           #主从复制选项,指向的是从服务器地址    allow-update { none ;};};zone "168.192.in-addr.arpa" IN {    type master;    file "192.168.zone";    allow-transfer { 192.168.3.74; };    allow-update { none; };};

3、创建解析库文件

[root@dns-master ~]# cat /var/named/lyao.com.zone$TTL 3600$ORIGIN lyao.com.@    IN    SOA    ns.lyao.com.    admin.lyao.com. (201508031421 2H 5M 1H 1D)@   IN         NS     ns@   IN         NS     ns2@   IN         MX  10  mailns2	IN	A	192.168.3.74ns      IN	A       192.168.3.73mail    IN      A      	192.168.3.73www     IN	A       192.168.3.73web  	IN	CNAME  	www

3、创建解析库文件

[root@dns-master ~]# cat /var/named/192.168.zone$TTL 3600$ORIGIN 168.192.in-addr.arpa.@    IN    SOA    ns.lyao.com.    admin.lyao.com. (201508031425 2H 5M 1H 1D) @	IN      NS     ns.lyao.com.@	IN      NS     ns2.lyao.com.73.3    IN      PTR    ns.lyao.com.74.3    IN  	PTR    ns2.lyao.com.73.3    IN  	PTR    mail.lyao.com.73.3    IN      PTR    www.lyao.com.

编辑对应的解析库文件后,修改属组和权限

[root@dns-master ~]# chmod 644 /var/named/lyao.com.zone [root@dns-master ~]# chmod 644 /var/named/192.168.zone [root@dns-master ~]# chown .named /var/named/lyao.com.zone [root@dns-master ~]# chown .named /var/named/192.168.zone

4、启动服务

    启动服务之前需要对解析库文件进行对应的语法和完整性检查。

[root@dns-master ~]# /usr/sbin/named-checkconf [root@dns-master ~]# named-checkzone "lyao.com" /var/named/lyao.com.zone zone lyao.com/IN: loaded serial 3939535805OK[root@dns-master ~]# named-checkzone "168.192.in-addr.arpa" /var/named/192.168.zone zone 168.192.in-addr.arpa/IN: loaded serial 3939535809OK

完成这些之后,启动 named 进程。

[root@dns-master ~]# /etc/init.d/named startGenerating /etc/rndc.key:                                  [  OK  ]Starting named:                                            [  OK  ][root@dns-master ~]# netstat -tunlp |grep namedtcp        0      0 192.168.3.73:53             0.0.0.0:*                   LISTEN      1473/named          tcp        0      0 127.0.0.1:953               0.0.0.0:*                   LISTEN      1473/named          tcp        0      0 ::1:953                     :::*                        LISTEN      1473/named          udp        0      0 0.0.0.0:2983                0.0.0.0:*                               1473/named          udp        0      0 192.168.3.73:53             0.0.0.0:*                               1473/named

5、查询测试

[root@dns-slave ~]# host -t PTR 192.168.3.73 192.168.3.73Using domain server:Name: 192.168.3.73Address: 192.168.3.73#53Aliases: 73.3.168.192.in-addr.arpa domain name pointer mail.lyao.com.73.3.168.192.in-addr.arpa domain name pointer www.lyao.com.73.3.168.192.in-addr.arpa domain name pointer ns.lyao.com.[root@dns-slave ~]# host -t A www.lyao.com 192.168.3.73Using domain server:Name: 192.168.3.73Address: 192.168.3.73#53Aliases: www.lyao.com has address 192.168.3.73[root@dns-slave ~]# host -t A ns.lyao.com 192.168.3.73Using domain server:Name: 192.168.3.73Address: 192.168.3.73#53Aliases: ns.lyao.com has address 192.168.3.73[root@dns-slave ~]# host -t A ns2.lyao.com 192.168.3.73Using domain server:Name: 192.168.3.73Address: 192.168.3.73#53Aliases: ns2.lyao.com has address 192.168.3.74[root@dns-slave ~]# host -t A mail.lyao.com 192.168.3.73Using domain server:Name: 192.168.3.73Address: 192.168.3.73#53Aliases: mail.lyao.com has address 192.168.3.73

测试成功后,主服务器配置完成。

在 192.168.3.74 从dns服务器:

1、安装软件

[root@dns-slave ~]# yum install bind -y

2、修改配置文件

[root@dns-slave ~]# egrep -v "^/|^$|^#|^[[:space:]]+#" /etc/named.conf options {	listen-on port 53 { 192.168.3.74; };	directory 	"/var/named";};zone "." IN {	type hint;	file "named.ca";};include "/etc/named.rfc1912.zones";

编辑配置文件/etc/named.rfc1912.zones

[root@dns-slave ~]# tail -15 /etc/named.rfc1912.zones zone "lyao.com" IN {    type slave;    file "slaves/lyao.com.zone";    masters { 192.168.3.73; };            #主服务器地址    allow-transfer { none; };    allow-update { none; };};zone "168.192.in-addr.arpa" IN {    type slave;    file "slaves/192.168.zone";    masters { 192.168.3.73; };    allow-transfer { none; };    allow-update { none; };};

3、启动服务

[root@dns-slave ~]# /etc/init.d/named startGenerating /etc/rndc.key:                                  [  OK  ]Starting named:                                            [  OK  ]#启动完成后,检查 /var/named/slaves 目录下是否有对应的解析库文件[root@dns-slave ~]# ll /var/named/slaves/total 8-rw-r--r-- 1 named named 413 Aug  3 14:09 192.168.zone-rw-r--r-- 1 named named 424 Aug  3 14:09 lyao.com.zone

4、从服务器查询测试

[root@dns-master ~]# host -t A www.lyao.com 192.168.3.74Using domain server:Name: 192.168.3.74Address: 192.168.3.74#53Aliases: www.lyao.com has address 192.168.3.73[root@dns-master ~]# host -t PTR 192.168.3.73 192.168.3.74Using domain server:Name: 192.168.3.74Address: 192.168.3.74#53Aliases: 73.3.168.192.in-addr.arpa domain name pointer mail.lyao.com.73.3.168.192.in-addr.arpa domain name pointer www.lyao.com.73.3.168.192.in-addr.arpa domain name pointer ns.lyao.com.#解析正常

到此,为止主从复制的搭建过程就完成。

补充:

    在以后,如果主服务器的解析文件改变的时候,每次都需要修改 SOA 资源记录的序列号,然后使用 rndc reload重读配置文件。

    rndc(Rmote Name Domain Contol,远端域名控制)监听在 tcp/953 端口,实现通过远端来控制解析可文件的重读,配置文件的重读等功能。一般情况下,只在本地使用。

    常用命令:

  • rndc reconfig  重读主配置文件

  • rndc reload  重读解析库文件

  • rndc flush    刷新缓存

  • rndc status    查看 DNS 服务器状态信息

2、在主从服务的基础上扩展子域授权功能(只实现正向解析)

    当一个公司某一部门需要自己独立的域名时候,会用到这种功能。要求“父域”与“子域”可以相互解析。

实验架构如下

dns-master    192.168.3.73    主服务器

dns-slave     192.168.3.74    从服务器

dns-ops      192.168.3.41    子域dns

在 192.168.3.73 主dns服务器:

1、修改配置文件、区域解析文件为:

[root@dns-master ~]# egrep -v "^/|^$|^#|^[[:space:]]+#" /etc/named.conf options {	listen-on port 53 { 192.168.3.73; };	directory 	"/var/named";	allow-recursion	{ 192.168.3.41; };    # 允许192.168.3.41 递归查询};zone "." IN {	type hint;	file "named.ca";};

修改配置文件/var/named/lyao.com.zone

[root@dns-master ~]# cat /var/named/lyao.com.zone $TTL 3600$ORIGIN lyao.com.@    IN    SOA    ns.lyao.com.    admin.lyao.com. (201508031421 2H 5M 1H 1D)@   IN         NS     ns@   IN         NS     ns2@   IN         MX  10  mailops	IN	NS	ns.opsns.ops	IN	A	192.168.3.41ns2	IN	A	192.168.3.74ns      IN	A       192.168.3.73mail    IN      A      	192.168.3.73www     IN	A       192.168.3.73web  	IN	CNAME  	www

2、重读库解析文件

[root@dns-master ~]# rndc reloadserver reload successful

在 192.168.3.41 子域dns服务器:

1、安装软件

[root@dns-ops ~]# yum install bind -y

2、修改配置文件

[root@dns-ops ~]# egrep -v "^/|^$|^#|^[[:space:]]+#" /etc/named.conf options {	listen-on port 53 { 192.168.3.41; };	directory 	"/var/named";};zone "." IN {	type hint;	file "named.ca";};include "/etc/named.rfc1912.zones";

修改配置文件/etc/named.rfc1912.zones

[root@dns-ops ~]# tail -11 /etc/named.rfc1912.zones zone "ops.lyao.com" IN {    type master;    file "ops.lyao.com.zone";    allow-update { none; };};zone "lyao.com" IN {    type forward;    forward only;    forwarders { 192.168.3.73; };};

3、创建解析库文件

[root@dns-ops ~]# cat /var/named/ops.lyao.com.zone$TTL 3600$ORIGIN ops.lyao.com.@    IN    SOA    ns.ops.lyao.com.    admin.ops.lyao.com. (2015080315 2H 5M 1H 1D)@   IN         NS     ns@   IN         MX  10  mailns      IN   A       192.168.3.41mail     IN      A       192.168.1.10www      IN  A       192.168.1.90

编辑对应的解析库文件后,修改属组和权限

[root@dns-ops ~]# chmod 644 /var/named/ops.lyao.com.zone [root@dns-ops ~]# chown .named /var/named/ops.lyao.com.zone

4、启动服务

[root@dns-ops ~]# /etc/init.d/named startStarting named:                                            [  OK  ][root@dns-ops ~]# netstat -tunlp |grep namedtcp        0      0 192.168.3.41:53             0.0.0.0:*                   LISTEN      1592/named          tcp        0      0 127.0.0.1:953               0.0.0.0:*                   LISTEN      1592/named          tcp        0      0 ::1:953                     :::*                        LISTEN      1592/named          udp        0      0 192.168.3.41:53             0.0.0.0:*                               1592/named

测试

[root@dns-ops ~]# dig -t A www.ops.lyao.com @192.168.3.73; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6_6.3 <<>> -t A www.ops.lyao.com @192.168.3.73;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50981;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1;; QUESTION SECTION:;www.ops.lyao.com.		IN	A;; ANSWER SECTION:www.ops.lyao.com.	3600	IN	A	192.168.1.90        #已得到正确的结果;; AUTHORITY SECTION:ops.lyao.com.		3600	IN	NS	ns.ops.lyao.com.;; ADDITIONAL SECTION:ns.ops.lyao.com.	3600	IN	A	192.168.3.41;; Query time: 8 msec;; SERVER: 192.168.3.73#53(192.168.3.73);; WHEN: Mon Aug  3 14:56:33 2015;; MSG SIZE  rcvd: 83[root@dns-ops ~]# host -t A www.ops.lyao.com 192.168.3.73Using domain server:Name: 192.168.3.73Address: 192.168.3.73#53Aliases: www.ops.lyao.com has address 192.168.1.90[root@dns-ops ~]# host -t A www.ops.lyao.com 192.168.3.41Using domain server:Name: 192.168.3.41Address: 192.168.3.41#53Aliases: www.ops.lyao.com has address 192.168.1.90

至此,子域授权创建过程完毕。

3、实现视图功能

    视图主要的功能是当不同类的客户端解析不同的域名时,解析到的地址信息也是不同的。通常与acl一起使用。

目的192.168.3.74和192.168.3.41从192.168.3.73解析域名的时候得到不同的结果

1、编辑配置文件

acl our_net {        192.168.3.41;};view internal {match-clients { our_net; };        #当客户端IP地址是192.168.3.41解析这里的内容    zone    ....        ......};view external {        match-clients { any; };        zone "lyao.com" IN {                type master;                file "lyao.com.zone.internal";        #除192.168.3.41以外的解析这里的内容        };};

2、编辑配置文件

[root@dns-master ~]# cat /var/named/lyao.com.zone.internal$TTL 3600$ORIGIN lyao.com.@    IN    SOA    ns.lyao.com.    admin.lyao.com. (201508031421 2H 5M 1H 1D)@   IN         NS     ns@   IN         NS     ns2@   IN         MX  10  mailops     IN      NS      ns.opsns.ops  IN      A       192.168.3.41ns2     IN      A       192.168.3.74ns      IN      A       192.168.3.73mail    IN      A       192.168.3.73www     IN      A       192.168.9.73            #只修改了这一部分web     IN      CNAME   www#说明这里的配置文件写的是当192.168.3.41来解析其余的192.168.9.73

修改权限

[root@dns-master ~]# chmod 640 /var/named/lyao.com.zone.internal [root@dns-master ~]# chown .named /var/named/lyao.com.zone.internal

重启服务

[root@dns-master ~]# /etc/init.d/named restartStopping named:                                            [  OK  ]Starting named:                                            [  OK  ]

测试:在192.168.3.41上解析www.lyao.com应该得到的是192.168.3.73的结果

[root@dns-ops ~]# ip a |grep eth02: eth0: 
 mtu 1500 qdisc pfifo_fast state UP qlen 1000    inet 192.168.3.41/24 brd 192.168.3.255 scope global eth0[root@dns-ops ~]# host -t A www.lyao.com 192.168.3.73Using domain server:Name: 192.168.3.73Address: 192.168.3.73#53Aliases: www.lyao.com has address 192.168.3.73        #解析结果是192.168.3.73

在192.168.3.74上进行解析www.lyao.com,得到的结果应该是192.168.9.73

[root@dns-slave ~]# ip a |grep eth02: eth0: 
 mtu 1500 qdisc pfifo_fast state UP qlen 1000    inet 192.168.3.74/24 brd 192.168.3.255 scope global eth0[root@dns-slave ~]# host -t A www.lyao.com 192.168.3.73Using domain server:Name: 192.168.3.73Address: 192.168.3.73#53Aliases: www.lyao.com has address 192.168.9.73        #解析结果是192.168.9.73#到此DNS的视图功能配置完成

 总结:本文主要介绍了DNS的原理,以及如何自建主从复制,子域授权,视图等。更多的配置信息也可以阅读官方手册。地址: