AmazingCounters.com

DNS多样功能实现(主从、子域、转发、根实现、智能以及编译安装)

  前言:在实际生产环境中由于需求和环境不同,所需DNS实现功能也不同,本节介绍DNS实现主从、子域的配置、DNS转发和

智能DNS功能,另外补充了点儿与排错相关的内容。

 

1.搭建DNS主从服务器

搭建DNS主从服务器的目的就是为了实现容错。

yum   -y   install   bind

iptables  -F 关闭防火墙

setenforce  0  关闭selinux

systemctl enable    named

service  named   restart

ss  -ntl 查看53端口打开

一切OK后

vim /etc/named.conf

vim  /etc/named.rfc1912.zones

named-checkconf

rndc  reload

重新加载zone,将自动从主DNS那边加载数据zone

cat /var/named/slaves/heiye.com.slave.zone

对于从DNS服务器,centos7.X上为加密的,而centos6.x则为明文。

在另一台主机上测试:

到此主从DNS搭建完成!

在这种情况下,一旦主DNS发生故障,将自动利用DNS从服务器进行解析,实现了某种程度上的容错。

 

2. DNS子域的实现

子域授权:分布式数据库

正向解析区域子域方法:如果主机不多,则直接加子域的A记录即可,如果主机较多,则可单建一个独立子域。

vim  /etc/named.rfc1912.zones

vim /var/named/wuhan.heiye.com.zone 

$TTL 86400      ; 1 day
@               IN SOA  dns1   465925664.heiye.com. (
                                2017102002 ; serial
                                86400      ; refresh (1 day)
                                3600       ; retry (1 hour)
                                604800     ; expire (1 week)
                                10800      ; minimum (3 hours)
                                )
                        NS      dns1
dns1                    A       172.18.251.219
websev                  A       172.18.250.111
www                     CNAME   websev
                                            
View Code

用dig测试:

当然也可以把父域和子域分离在两台主机上,此时需在父域主机的zone里上定义wuhan  NS      dnsN       

                                    dns10      A     IP

之后在子域的主机上直接像定义父域那样定义zone就OK了,这样就实现的父子域分离,原理就像根域往下指派子域一样。

 

3.DNS转发功能的实现

当用户查询DNS服务器,当DNS数据库有相应的记录时则会回应用户,如果没有,则DNS会直接区询问根域,然后根域会一级一级的询问相应的子域

直到帮用户查询到相应记录,当然,当DNS没有对应记录时我们也可以让他把询问请求转发到我们指定的服务器上去查询。这就是DNS转发功能的实现

DNS转发功能的实现主要是方便优先共享DNS数据库资源,节省查询时间,而不必每次一级一级的递归去询问根,这样节省带宽流量的时间。

注意:被转发的服务器需要能够为请求者做递归,否则转发请求不予进行

(1) 全局转发: 对非本机所负责解析区域的请求,全转发给指定的服务器

  Options {

    forward first | only;

    forwarders { ip;};

  };

即 vim /etc/named.conf

加两行

first意思是如果请求不能得到响应,则DNS会向根一级级询问,而only如果不能响应就会报无法解析。

(2) 特定区域转发:仅转发对特定的区域的请求,比全局转发优先级高

vim /etc/named.rfc1912.zones

加个zone

  zone "ZONE_NAME" IN {

    type forward;

    forward first|only;

    forwarders { ip;};

  };

注意:关闭dnssec功能: dnssec-enable no; dnssec-validation no;

如果局域网网关防火墙设置了禁ping,那么无法通过dig向根递归查询,只能依靠内网指定的DNS作解析,同样114.114.114.114也用不了(坑!)

4.构造DNS根域的Internet的实现

每个DNS都知道根的地址,在文件/var/named/named.ca中

而named.ca文件则是由/etc/named.conf指定

因此只要把根主机中的/etc/named.conf中文件路径改了或者把named.ca中根地址改了,再覆盖到所有子域服务器根相应文件路径即可实现修改根地址。

而根主机上需指定自己为根!即在/etc/named.rfc1912.zones里定义zone时,ZONE_NAME为 “.” ,file 为“root.zone”,再把/etc/named.conf中关于

根文件路径那段删了,同时把根域下相应的如.com、.cn等的子域的A记录填上就OK了

5.智能DNS的实现

原理拓扑图如下:

bind view:

view:视图,一个bind服务器可定义多个view,每个view中可 定义一个或多个zone

     每个view用来匹配一组客户端

     多个view内可能需要对同一个区域进行解析,但使用不同的 区域解析库文件

格式: view   VIEW_NAME {

      match-clients { testacl; };

      zone “heiye.com” {

        type master;

        file “heiye.com.zone”;

      };

      include "/etc/named.rfc1912.zones"(二选一)

    };

注意: (1) 一旦启用了view,所有的zone都只能定义在view中

    (2) 仅在允许递归请求的客户端所在view中定义根区域

    (3) 客户端请求到达时,是自上而下检查每个view所服务 的客户端列表

 

下面这个时/etc/named.conf的底部,要把根zone删除,然后把include "/etc/named.rfc1912.zones"删除,之后定义view

配置/var/named/heiye.com.zone.wh 和/var/named/heiye.com.zone.bj

rndc  restart 重新加载zone或者重启服务

测试:

测试成功!

智能DNS设置起来比较麻烦,因为IP地址段太多也不能漏掉以致难以维护,解决方案有两个:

第一:加个otherview,把地址段设为any,即不在智能范围的走其中任一一个DNS服务器即可。

第二:CDN加速:相当与在zone的资源记录中加个别名,别名A记录指向CDN加速的厂商,让专业的CDN厂家帮你快速智能解析。

CDN: Content Delivery Network -------服务商:蓝汛,网宿,帝联等

智能DNS: dnspod 、dns.la

6.编译安装DNS

二进制安装就是已经编译好了的程序,你只要下载解包(安装)它们以后 就马上可以使用

编译安装则是源代码包里面包括了程序原始的程序代码 你需要编译以后才可以运行源码安装与二进制发行版本相比,如果我们选择了通过源代码

进行编译安装,那么在安装过程中我们能够对该软件

所做的调整将会更多更灵活一些。因为通过源代码编译我们可以:
a) 针对自己的硬件平台选用合适的编译器来优化编译后的二进制代码;
b) 根据不同的软件平台环境调整相关的编译参数;
c) 针对我们特定应用场景选择需要什么组件不需要什么组件;
d) 根据我们的所需要存储的数据内容选择只安装我们需要的字符集;
e) 同一台主机上面可以安装多个该软件服务;
f) 等等其他一些可以根据特定应用场景所作的各种调整。
在源码安装给我们带来更大灵活性的同时,同样也给我们带来了可能引入的隐患:
a) 对编译参数的不够了解造成编译参数使用不当可能使编译出来的二进制代码不够稳定;
b) 对自己的应用环境把握失误而使用的优化参数可能反而使系统性能更差;
c) 还有一个并不能称之为隐患的小问题就是源码编译安装将使安装部署过程更为复杂,所花费的
时间更长;

过程:源码->二进制文件->rpm->安装

二进制格式的包名字很长,都带有版本号、适应平台、适应的硬件类型等,而源码格式仅仅就是一个版本号的tar包。

实际的生产环境绝大多数还是源码编译安装,经多次测试,基于源码编译安装的软件服务性能要明显高于rpm或二进制安装!

在一个没有装bind的系统上下载bind本次编译使用bind-9.11.0-P1.tar

tar  xvf   bind-9.11.0-P1.tar.gz  解压缩

yum -y groupinstall "development tools"装开发包组

useradd -r -m -d /var/named -s /sbin/nologin named

cd bind-9.11.0-P1/

./configure --prefix=/app/bind9 --sysconfdir=/etc/bind9    --without-openssl

make -j 4&& make install

dig -t ns . @172.18.0.1  >/var/named/named.ca 

vim /etc/profile.d/env.sh

. /etc/profile.d/env.sh

vim /etc/bind9/named.conf

vim /var/named/test.com.zone

$TTL 1d
@    IN  SOA  dns1. admin (                                                                 
                                2016061801
                                1h
                                5m
                                7d
                                1d
                                        )
        IN    NS    dns1.
dns1.  IN  A   172.18.250.128
www         IN  A   6.6.6.6

vim /etc/man_db.conf   

. /etc/man_db.conf

named-checkconf
named-checkzone "test.com" /var/named/test.com.zone

named -u named -f -g -d 3

到此,DNS编译的初步环境已经搭建完毕,如果没有问题的话,可以在不同主机上简单测试一下

后续完善:配置rndc

cd /app/bind9/sbin/

rndc-confgen -r /dev/urandom >/etc/bind9/rndc.conf

vim /etc/bind9/rndc.conf

cp 其中下面的服务器的那段,然后把那段发送到相应的named.conf 后面

options{
        directory "/var/named/";
};
zone  "." {
        type hint;
        file "named.ca";
};
zone "test.com" {
        type master;
        file "test.com.zone";
};
key "rndc-key" {
       algorithm hmac-md5;                                                                 
       secret "ZlhJrIU3tJd7JaPgtSTWpw==";
};
 
controls {
       inet 127.0.0.1 port 953
               allow { 127.0.0.1; } keys { "rndc-key"; };                              
};

rndc是个很强大的工具,

rndc  reload

rndc status

压力测试:

cd /root/bind-9.11.0-P1/contrib/queryperf/  

./configure
make -j 4

vim /app/test.txt

./queryperf -d /app/test.txt

打开日志功能:

rndc querylog

rndc status

queryperf -d test.txt -s 127.0.0.1

wc -l /var/log/message

 

7.DNS排错

dig  A example.com

; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> A example.com

;; global options: +cmd • ;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30523

...

SERVFAIL:The nameserver encountered a problem while processing the query.----可使用dig +trace排错,可能是网络和防火墙导致

 

NXDOMAIN:The queried name does not exist in the zone. ----可能是CNAME对应的A记录不存在导致

REFUSED:The nameserver refused the client's DNS request due to policy restrictions.----可能是DNS策略导致

NOERROR不代表没有问题,也可以是过时的记录

查看是否为权威记录,flags:aa标记判断

被删除的记录仍能返回结果,可能是因为*记录存在 • 如:*.example.com. IN A 172.25.254.254  泛域名解析

注意“.”的使用 • 避免CNAME指向CNAME记录,可能产生回环   test.example.com. IN CNAME lab.example.com.

                            lab.example.com. IN CNAME test.example.com.

正确配置PTR记录,许多服务依赖PTR,如sshd,MTA

正确配置轮询round-robin记录

做实验时遇到的坑:

1.关闭防火墙!
2.默认网关只有一个,不然跨网关通信时,路由不知道选哪个网关会导致不能跨网段通信!

3.DNS绝大多数故障是由于配置文件语法的问题。甚至有时候连named-checkconf和named-checkzone也检查不出来,所以我把重要且容易出错的源码

贴上,这样以后只需稍做修改即可使用!

4.另外:除了上述介绍的DNS工具外,还有像dlint(详细的语法检查和排错工具)、dnstop(交互式查看S和D的)、whosi(精确查找DNS包括地址和传真

)、VisualRoute(高度集成的可视化强大工具),有兴趣可以了解下。

5.补充:关于/dev/random和/dev/urandom的区别:dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为

空的随机字节数据流。很多解密程序与安全应用程序(如SSH Keys,SSL Keys等)需要它们提供的随机数据流。这两个设备的差异在于:/dev/random

random  pool依赖于系统中断,因此在系统的中断数不足时,/dev/random设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断

充分够用,/dev/random设备可以保证数据的随机性。/dev/urandom不依赖系统的中断,也就不会造成进程忙等待,但是数据的随机性也不高。在cat

的过程中发现,/dev/random产生的速度比较慢,有时候还会出现较大的停顿,而/dev/urandom的产生速度很快,基本没有任何停顿。

 

posted @ 2017-10-21 21:30  黑夜繁星  阅读(2756)  评论(0编辑  收藏  举报
AmazingCounters.com