Linux下搭建DNS服务器

注:本文主要侧重DNS的配置,原理的话会另发一篇文章~

一、DNS(域名系统)作用和原理

1、  DNS的作用:

正向解析:根据域名查找对应的IP地址

反向解析:根据IP地址找对应的域名

 

2、  DNS的工作模式:

  • 递归查询

  • 迭代查询

 

3、  域名结构

分层式的结构,且上层只管理下层域名,便于管理维护。

 


二、BIND服务简介

1Linux下常用的DNS服务是BINDBerkeleyInternet Name Domain

官方站点:

软件包:bind-9.8.2-0.17.rc1.el6.x86_64 (还有更新的版本)

服务名:named

端口号:udp 53  (少数情况会用到tcp53

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

默认的区域文件:/etc/named.rfc1912.zones

保存DNS解析记录的数据文件位于:/var/named/

 

 

2、主域名服务器和从域名服务器

主域名服务器:

特定DNS区域的权威域名服务器,具有唯一性

负责维护该区域内所有域名->IP地址的映射记录

 

从域名服务器:

也称为辅助域名服务器

其维护的域名->IP地址记录来源于主域名服务器


*实验环境的Linux发行版本是:RHEL6.4

三、搭建主DNS服务器

1、  修改DNS主配置文件/etc/named.conf

options {

       listen-on port 53 { 172.16.100.111; };   #指定哪个IP和端口对外提供DNS服务(ipv4

       listen-on-v6 port 53 { ::1; };      #指定哪个IP和端口对外提供DNS服务(ipv6

       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; };             #指定对哪些地址提供地址解析服务

       recursion yes;                        #是否开启递归功能

 

       dnssec-enable yes;                    #安全选项,防止dns劫持

       dnssec-validation yes;

       dnssec-lookaside auto;

 

       /* Path to ISC DLV key */

       bindkeys-file "/etc/named.iscdlv.key";

 

       managed-keys-directory "/var/named/dynamic";

};

 

logging {

       channel default_debug {

              file"data/named.run";   #日志文件存放位置。file后面跟的是相对路径,相对/var/named/

              severity dynamic;

       };

};

 

zone"." IN {

       type hint;

       file "named.ca";                #指定根域文件,该文件有全球13台根DNS的记录

};

include"/etc/named.rfc1912.zones";     #该文件为默认的区域文件

include "/etc/named.root.key";

2、配置区域文件

zone "wsh.com" IN {                #wsh.com的正向区域

       type master;              #指定该DNS的类型(master or slave

       file"wsh.com.localhost";  #指定该区域的正向解析数据文件,需要在/var/named/                                            录下自己创建这个文件,一般复制named.localhost板,之后                                       进行修改。

       allow-update { none; };

};

 

zone "1.16.172.in-addr.arpa" IN {            #wsh.com的反向区域

       type master;                  #指定该DNS的类型(master or slave

       file"wsh.com.empty";          #指定该区域的反向解析数据文件,需要/var/named/目录                                            下自己创建这个文件,一般复named.empty模板,之后进                                            行修改。

       allow-update { none; };

};

 

3、配置正向数据文件

SOA:起始授权机构。这个记录表明了谁是这个域的所有者。也表明了DNS服务器之间的关系,比如主从DNS之间配置同步的时间间隔等。

 

NS记录:表明谁对这个区域有解释权,即谁是该区域的权威DNS。大家都知道电信和网通都有很多的DNS服务器。这些服务器为我们上公网做域名解析提供了很多方便。但是这些DNS服务器有一个有意思的地方是这些DNS不存放任何区域,它们被称为缓存DNS服务器。它们会缓存大量的解析地址,这样就会让你解析的时候选择它们会觉得很快。它们在查询的时候就会查询NS记录,通过这个记录就知道谁在负责。还有一种情况来说明NS记录的作用,比如你先在万网申请了一个域名ABC.COM。一般情况是万网的域名服务器替你来解析如WWW.ABC.COM这样的主机记录,如果你想自己架设一个DNS服务器,让这台服务器从今往后替代万网的DNS服务器解析,那么你就需要在你的DNS上设置NS记录,然后将万网域名管理系统中的NS记录改成你的DNS IP。这样以后就是你自己的DNS服务器负责提供解析了。即使万网的DNS服务器出现故障,别人仍然可以找到你。

 

MX记录:邮件交换记录。后面的数字表明邮件服务器的优先级,数字越小,优先级越高(网络中可能存在多台邮件服务器)。

 

A记录:域名所对应的IP地址。域名部分只需写为wwwmail等形式,实际表示的域名需加上SQA指定的域,即www表示的域名为www.wsh.com.

 

4、配置反向数据文件

PTR:反向解析记录。IP部分只写主机位(因为区域文件中定义了反向解析的网络位)

5、启动服务

service named start


四、搭建从DNS服务器

1、  修改主DNS的主配置文件

options {

       listen-on port 53 { 172.16.100.111; };

       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; };

       allow-transfer  { 172.16.1.102; };           #指定从DNS

       recursion yes;

 

 

2、  配置从DNS的主配置文件

options {

       listen-on port 53 {172.16.1.102; };

       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; };

       recursion yes;

 

3、  配置DNS区域文件

zone "wsh.com" IN {

       type slave;                               #类型设为slave

       file "slaves/wsh.com.localhost";          #指定从主DNS同步的正向数据文件

       allow-update { none; };

       masters { 172.16.1.101; };                #指定主DNS

};

 

zone "1.16.172.in-addr.arpa" IN {

       type slave;                                #类型设为slave

       file "slaves/wsh.com.empty";               #指定从主DNS同步的正向数据文件

       allow-update { none; };

       masters { 172.16.1.101; };                 #指定主DNS

};

 

4、  重启从DNSnamed服务

service named restart

#重启完后发现/var/named/slaves目录有了主DNS上的正向数据文件和反向数据文件,即成功同步。

#主从DNS的同步周期由SOA记录的参数决定,到达更新周期,会自动更新。或者重启服务器完成手动更新。 


五、分离解析DNS服务器

1、应用场景如下图:

需求:

现在内网有一台WEB服务器和DNS服务器对外提供服务,要求内网PC访问www.wsh.com的时候域名能解析成内网IP,而公网PC访问www.wsh.com时解析成公网IP

 

解决方法:

对于以上的场景解决方法可以在DNS上做分离解析。

 

2、  DNS分离解析配置步骤

1)  修改主配置文件/etc/named.conf

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; };

       recursion yes;

                                     ……

#zone "." IN {

#       type hint;

#       file"named.ca";

#};

 

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

#include "/etc/named.root.key";

#注释掉以上几行

view lan {

       match-clients{ 172.16.1.0/24; };    #如果客户端的源IP匹配的话,则会调取以下参数                                                   (根 域文件、区域文件),如不匹配继续匹配下                                              view

       zone "." IN {

       type hint;

       file "named.ca";

       };

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

};

 

view wan {

       match-clients { any; };       #如果客户端的源IP匹配的话,则会调取以下参数(根                                                域文件、区域文件)

       zone "." IN {

       type hint;

       file "named.ca";

       };

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

};

 

2)  配置区域文件

[root@localhost ~ ]# vim /etc/named.lan.zones

zone "wsh.com" IN {

       type master;

       file "wsh.lan.local";

       allow-update { none; };

};

zone "1.16.172.in-addr.arpa" IN {

       type master;

       file "wsh.lan.empty";

       allow-update { none; };

};

 

[root@localhost ~ ]# vim /etc/named.wan.zones

zone "wsh.com" IN {

       type master;

       file "wsh.wan.local";

       allow-update { none; };

};

zone "200.200.200.in-addr.arpa"IN {

       type master;

       file "wsh.wan.empty";

       allow-update { none; };

};

 

3)  配置正向数据文件和反向数据文件

内网解析的正向数据文件和反向数据文件:

[root@localhost named]# vim wsh.lan.local

 

[root@localhost named]# vim wsh.lan.empty

 

外网解析的正向数据文件和反向数据文件:

[root@localhost named]# vim wsh.wan.local

 

[root@localhost named]# vim wsh.wan.empty

*至此,分离解析DNS配置完毕,可进行测试。

 

、常见报错

1、客户端解析时,在DNS上用tcpdump抓包,发现serfail的报错

原因:发现数据文件的所有者和所属组都是root,导致其他用户没有读权限

解决方法:把数据文件的所属组改为named!