基础服务之DNS

guiyun affiliate

一、 理论基础

DNS的演进

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

 

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

DNS的概述

DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数字串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析。DNS协议运行在UDP协议之上,使用端口号53。

 

DNS它是由域名解析器和域名服务器组成的。域名服务器是指保存有该网络中的所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。其中域名必须对应一个IP地址,一个IP地址可以有多个域名,而IP地址不一定有域名。域名系统采用类似目录树的等级结构。将域名映射为IP地址的过程就称为“域名解析”。

DNS的原理

 当网站上线后,可以直接在浏览器中输入IP地址访问上线后的网站,也可以输入域名访问网站,虽然看到的内容是一样,但是调用的过程是不一样的。输入IP地址是直接从主机上调用内容,输入域名是通过域名解析服务器指向对应的主机的IP地址,再从主机调用网站的内容。

DNS的解析流程

image.png

首先,用户在浏览器输入地址www.163.com敲回车之后,浏览器并没有发起DNS请求,而是先查询本机的DNS缓存中是否有该域名对应的地址,有的话直接访问该地址,没有的话查询本机的hosts文件,有的话直接访问该地址,也不会发起DNS请求,但一般情况下本机的hosts文件是空的。

 

(1)经过两次本机内部的查询之后发现并没有该域名对应的IP地址,客户端正式向本地的DNS服务器发起DNS查询请求。

 

(2)本地的DNS服务器收到这个查询请求后,会查询自己的缓存以及自己的资源记录中是否有该域名对应的IP地址,如果在自己的缓存以及自己的资源记录中依然没有该域名对应的IP地址,此时本地的DNS服务器会把请求发送到其中一台根域名服务器(全球共13台)。

 

(3)根域名服务器收到这个查询请求后,会发送一个回复说,.com的域名解析服务我已经委派给.com这台域名服务器了,我给你.com域名服务器的IP地址,你去找它吧。此时本地的DNS服务器就进入了迭代查询过程。

 

(4)本地的DNS服务器收到回复后,再次把查询请求发送给.com域名服务器。

 

(5)负责.com域名解析服务的服务器收到查询请求后,会发送一个回复说,163.com这台主域名服务器应该会知道答案,我给你163.com域名服务器的IP地址,你去找它吧。

 

(6)本地的DNS服务器收到回复后,再次把查询请求发送给163.com域名服务器。

 

(7)负责163.com域名解析服务的服务器收到查询请求后,会查询自己的资源记录中是否有该域名对应的IP地址,如果有的话直接返回该域名对应的IP地址给本地的DNS服务器。

 

(8)本地的DNS服务器收到回复后,会将这条记录回复给用户,同时将该条记录写入到自己的缓存中,以便其它用户查询。

DNS的记录类型

A记录

地址记录,用来指定域名的IPv4地址,用户可以在此设置子域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器。

要点说明:

  指向的目标主机地址类型只能使用IP地址。

  A用来指定域名的IPv4地址。

  AAAA用来指定域名的IPv6地址。

CNAME记录

别名记录,用来将域名指向另一个域名,再由另一个域名提供IP地址。

要点说明:

  CNAME的目标主机地址只能使用主机名,不能使用IP地址。

  主机名前不能有任何其它前缀,例如:http://等是不被允许的。

  A记录优先于CNAME记录,如果一个域名同时存在A记录和CNAME记录,则CNAME记录不生效。

MX记录

邮件交换记录,用来将以该域名为结尾的电子邮件指向对应的邮件服务器以进行解析。

要点说明:

● MX记录可以使用主机名或IP地址。

● MX记录可以通过设置优先级实现主辅服务器设置,“优先级”中的数字越小表示优先级别越高,也可以使用相同优先级达到负载均衡的目的。

NS记录

解析服务器记录,用来表明由哪台服务器对该域名进行解析。

要点说明:

  NS记录优先于A记录,如果一个域名同时存在NS记录和A记录,则A记录不生效。

  “优先级”中的数字越小表示优先级别越高。

TXT记录

文本记录,用户可以填写任何东西,长度限制255。绝大多数的TXT记录是用来做SPF记录(反垃圾邮件)。

PTR记录

反向记录,用于IP地址查询域名。

SOA记录

起始授权记录,表示一个授权区的开始。

DNS的查询模式

递归查询

递归查询(Recursion),通过一次查询得到的结果叫做递归查询,PC与DNS服务器之间就叫做递归查询。

迭代查询

迭代查询(Iteration),自身通过反查多次查询得到的结果叫做迭代查询,DNS查询域名的过程就是迭代查询。

详细图解

image.png

DNS的服务器类型

主域名服务器

主域名服务器(Primary Name Server)是特定的DNS区域的官方服务器,对于某个指定区域,主域名服务器是唯一存在的,其管理的域名解析记录具有权威性。主域名服务器需要在本地设置所管理域名的地址数据库文件。主域名服务器是DNS的主要成员,对Internet中域名数据的发布和查找起着非常重要的作用。主域名服务器总是地址数据的初始来源,主域名服务器对域中的域名有最高权限,并因为它们是区域间传送区域数据库文件的唯一来源,就具有向任何一个需要其数据的服务器发布区域信息的功能。

从域名服务器

从域名服务器(Secondary Name Server)也称辅助域名服务器,其主要功能是提供主域名服务器的备份,通常与主域名服务器同时提供服务,对于客户端来说,从域名服务器提供与主域名服务器完全相同的功能。但是从域名服务器提供的地址解析记录并不是由自己决定的,而是取决于对应的主域名服务器。当主域名服务器中的地址数据库文件发生变化时,从域名服务器中的地址数据库文件也会发生相应的变化。

缓存域名服务器

缓存域名服务器可运行域名服务器软件,但是没有域名数据库软件。一旦它从某个远程服务器获得每次域名服务器查询的回答,就会放在高速缓存中,以后查询相同的信息时不再进行查询直接给予回答。所有的域名服务器都按这种方式使用高速缓存中的信息。

转发域名服务器

转发域名服务器是指当本地DNS服务器无法对客户端的解析请求进行本地解析时,可以允许本地DNS服务器转发客户端发送的查询请求到其它的DNS服务器,可能会存在一个或多个转发服务器,它们会按顺序进行请求,直到请求得到回答为止。

DNS的命令规范

包含字符

  26个英文字母。

  “0,1,2,3,4,5,6,7,8,9”十个数字。

  “_”英文中的连词符。

组合规则

  在域名中,不区分英文之母的大小写。

  一个域名的长度是有一定限制的,最多63个字节长度。

  域名命名见名知义,例如:gzyt_5611_api.keywa.com,gzyt表示广州亚太机房;5611表示地址192.168.56.11;api表示接口服务器。

DNS的查询工具

DIG

dig是域信息搜索器的简称(Domain Information Groper),可以查询域名相关的任务,返回整个解析过程的详细信息,类似traceroute命令。

[root@linux-node1 ~]# dig @8.8.8.8 www.baidu.com +trace

 

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> @8.8.8.8 www.baidu.com +trace

; (1 server found)

;; global options: +cmd

.                       4289    IN      NS      a.roots.net.

.                       4289    IN      NS      b.roots.net.

.                       4289    IN      NS      c.roots.net.

.                       4289    IN      NS      d.roots.net.

.                       4289    IN      NS      e.roots.net.

.                       4289    IN      NS      f.roots.net.

.                       4289    IN      NS      g.roots.net.

.                       4289    IN      NS      h.roots.net.

.                       4289    IN      NS      i.roots.net.

.                       4289    IN      NS      j.roots.net.

.                       4289    IN      NS      k.roots.net.

.                       4289    IN      NS      l.roots.net.

.                       4289    IN      NS      m.roots.net.

;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 720 ms

 

com.                    172800  IN      NS      i.gtlds.net.

com.                    172800  IN      NS      c.gtlds.net.

com.                    172800  IN      NS      e.gtlds.net.

com.                    172800  IN      NS      l.gtlds.net.

com.                    172800  IN      NS      j.gtlds.net.

com.                    172800  IN      NS      h.gtlds.net.

com.                    172800  IN      NS      g.gtlds.net.

com.                    172800  IN      NS      k.gtlds.net.

com.                    172800  IN      NS      d.gtlds.net.

com.                    172800  IN      NS      a.gtlds.net.

com.                    172800  IN      NS      f.gtlds.net.

com.                    172800  IN      NS      m.gtlds.net.

com.                    172800  IN      NS      b.gtlds.net.

;; Received 491 bytes from 199.7.91.13#53(199.7.91.13) in 638 ms

 

baidu.com.              172800  IN      NS      dns.baidu.com.

baidu.com.              172800  IN      NS      ns2.baidu.com.

baidu.com.              172800  IN      NS      ns3.baidu.com.

baidu.com.              172800  IN      NS      ns4.baidu.com.

baidu.com.              172800  IN      NS      ns7.baidu.com.

;; Received 201 bytes from 192.55.83.30#53(192.55.83.30) in 4380 ms

 

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

a.shifen.com.           1200    IN      NS      ns2.a.shifen.com.

a.shifen.com.           1200    IN      NS      ns1.a.shifen.com.

a.shifen.com.           1200    IN      NS      ns3.a.shifen.com.

a.shifen.com.           1200    IN      NS      ns5.a.shifen.com.

a.shifen.com.           1200    IN      NS      ns4.a.shifen.com.

;; Received 228 bytes from 61.135.165.235#53(61.135.165.235) in 50 ms


NSLOOKUP

nslookup是一个监测网络中DNS服务器是否能正确实现域名解析的命令行工具,在Windows和Linux均可以使用。

[root@linux-node1 ~]# nslookup www.baidu.com 8.8.8.8

Server:         8.8.8.8

Address:        8.8.8.8#53

 

Non-authoritative answer:

www.baidu.com   canonical name = www.a.shifen.com.

Name:   www.a.shifen.com

Address: 14.215.177.39

Name:   www.a.shifen.com

Address: 14.215.177.38

HOST

host是常用的分析域名查询工具,可以用来测试域名系统工作是否正常。

[root@linux-node1 ~]# host www.baidu.com 8.8.8.8

Using domain server:

Name: 8.8.8.8

Address: 8.8.8.8#53

Aliases:

 

www.baidu.com is an alias for www.a.shifen.com.

www.a.shifen.com has address 14.215.177.38

www.a.shifen.com has address 14.215.177.39


一、 BIND部署

BIND简介

Bind是Berkeley Internet Name Domain Service的简写,它是一款实现DNS服务器的开放源码软件。Bind原本是美国DARPA资助伯克利大学开设的一个研究生课题,后来经过多年的变化发展,已经成为世界上使用最为广泛的DNS服务器软件,目前Internet上半数以上的DNS服务器有都是用Bind来架设的。

部署规划

序号

主机名

IP

操作系统

备注

1

linux-node1

192.168.56.11

CentOS Linux release 7.2.1511(最小化安装)

主DNS

2

linux-node2

192.168.56.12

CentOS Linux release 7.2.1511(最小化安装)

从DNS

3

linux-node3

192.168.56.13

CentOS Linux release 7.2.1511(最小化安装)

从DNS

4

linux-node4

192.168.56.14

CentOS Linux release 7.2.1511(最小化安装)

主LVS+Keepalived

5

linux-node5

192.168.56.15

CentOS Linux release 7.2.1511(最小化安装)

备LVS+Keepalived

部署架构

image.png

单机部署

安装bind软件

[root@linux-node1 ~]# yum -y install bind bind-utils bind-devel bind-chroot

[root@linux-node1 ~]# rpm -qa bind bind-utils bind-devel bind-chroot

bind-9.9.4-51.el7_4.2.x86_64

bind-devel-9.9.4-51.el7_4.2.x86_64

bind-chroot-9.9.4-51.el7_4.2.x86_64

bind-utils-9.9.4-51.el7_4.2.x86_64

 

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

[root@linux-node1 ~]# cp -a /etc/named.conf /etc/named.conf_$(date +%F)

[root@linux-node1 ~]# vim /etc/named.conf

options {  //全局配置选项

  version "1.1.1";  //回答针对服务器版本的请求时的内容,缺省返回的是服务器的真实版本

  listen-on port 53 {any;};  //监听所有匹配地址列表中所允许的端口,如果没有设定端口,默认使用53

  directory "/var/named/chroot/etc/";  //服务配置文件工作目录

  pid-file "/var/named/chroot/var/run/named/named.pid";  //进程PID文件,如果没有设定,默认/var/run/named.pid

  allow-query {any;};  //设定哪个主机可以进行查询,默认是允许所有主机进行查询

  dump-file "/var/named/chroot/var/log/named_dump.db";  //执行rndc dumpdb命令,存放数据库文件路径

  statistics-file "/var/named/chroot/var/log/named_stats";  //执行rndc stats命令,存放统计信息文件路径

  zone-statistics yes;  //收集所有域的统计信息

  memstatistics-file "/var/named/chroot/var/log/mem_stats";  //内存使用统计文件路径

  empty-zones-enable no;  //不允许空域

  forwarders {114.114.114.114;202.96.128.86;};  //设定转发,如果没有记录则转发去请求

};

 

key "rndc-key" {  //使用rndc可以在不停止bind服务工作的情况下进行数据更新,使修改后的配置文件生效

  algorithm hmac-md5;  //认证算法HMAC-MD5

  secret "Adf9P7a3C42Da0bba574C1abAa138E59";

};

 

controls {  //访问控制

  inet 127.0.0.1 port 953 allow {127.0.0.1;} keys {"rndc-key";};  //连接127.0.0.1的 953端口重新加载bind服务

};

 

logging {  //日志配置选项

  channel warning {

    file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m;

    severity warning;

    print-category yes;

    print-severity yes;

    print-time yes;

  };

  channel general_dns {

    file "/var/named/chroot/var/log/dns_log" versions 10 size 100m;

    severity info;

    print-category yes;

    print-severity yes;

    print-time yes;

  };

  category default {

    warning;

  };

  category queries {

    general_dns;

  };

};

 

include "/var/named/chroot/etc/view.conf";  //把其它的文件包含到配置文件中

 

编辑/etc/rndc.key,默认不存在此文件

[root@linux-node1 ~]# vim /etc/rndc.key

key "rndc-key" {

  algorithm hmac-md5;

  secret "Adf9P7a3C42Da0bba574C1abAa138E59";

};

[root@linux-node1 ~]# ls -l /etc/rndc.key

-rw-r--r-- 1 root root 87 Mar 26 16:30 /etc/rndc.key

 

编辑/etc/rndc.conf,默认不存在此文件

[root@linux-node1 ~]# vim /etc/rndc.conf

key "rndc-key" {

  algorithm hmac-md5;

  secret "Adf9P7a3C42Da0bba574C1abAa138E59";

};

 

options {

  default-key "rndc-key";

  default-server 127.0.0.1;

  default-port 953;

};

[root@linux-node1 ~]# ls -l /etc/rndc.conf

-rw-r--r-- 1 root root 175 Mar 26 16:33 /etc/rndc.conf

 

编辑/var/named/chroot/etc/view.conf

[root@linux-node1 ~]# vim /var/named/chroot/etc/view.conf

view "View" {  //zone的标记说明

  zone "keywa.com" {  //定义一个zone

    type  master;  //定义的是主域名服务器

    file  "keywa.com.zone";  //zone对应的文件,和view.conf同级目录

    allow-transfer {  //设置哪台主机允许和本地bind服务进行域传输,允许主机192.168.56.12、192.168.56.13

      192.168.56.12;

      192.168.56.13;

    };

    notify  yes;  //当修改域后,发送消息通知主机192.168.56.12、192.168.56.13

    also-notify {

      192.168.56.12;

      192.168.56.13;

    };

  };

};

 

编辑/var/named/chroot/etc/keywa.com.zone

[root@linux-node1 ~]# vim /var/named/chroot/etc/keywa.com.zone

$ORIGIN keywa.com.

$TTL  3600        ; 1 Hour

@               IN      SOA  keywa.com. root.keywa.com. (

                        2018032701      ; serial

                        900             ; refresh (15 Minutes)

                        600             ; retry (10 Minutes)

                        86400           ; expire (1 Day)

                        3600            ; minimum (1 hour)

                        )

 

; NS Records

                IN      NS    ns1.keywa.com.

; MX Records

 

; A Records

ns1             IN      A     192.168.56.11

; CNAME Records

要点说明:

其中TTL和ORIGIN等标签在bind中叫做指令。zone文件中所有指令都是以一个$开始,指令主要用来表示zone文件中的一些控制信息。

  $ORIGIN:指令表示该zone文件用来描述的域名称。

  $TTL:指令表示一个资源记录在其它DNS服务器中的缓存时间。

  SOA资源记录:它定义了一个域的全局特性,必须是出现在zone文件中的第一个资源记录,而且一个zone文件中必须只有一个SOA资源记录。SOA记录包括zone的名字,一个技术联系人和各种不同的超时值。

  Serial:数值serial代表这个zone的序列号,供Slave DNS判断是否从Master DNS获取新数据。每次zone文件更新,都需要修改serial数值(建议:格式为YYYYMMMDDnn,其中nn代表修订号)

  Refresh:数值refresh代表Slave DNS多长时间与Master DNS进行serial核对。

  Retry:数值retry代表Slave DNS试图从Master DNS服务器获取新数据时,如果Master DNS未响应,那么多长时间后Slave DNS再次主动尝试连接Master DNS。

  Expire:数值expire代表记录逾期时间,当Slave DNS一直未能成功与Master DNS取得联系,那到这里就放弃retry,同时这里的数据也将标识为过期。

  Minimum: 最小预设TTL值,如果前面没有用$TTL来定义,就会以这里为准。

 

修改目录权限

[root@linux-node1 ~]# chown -R named:named /var/named/

[root@linux-node1 ~]# ls -ld /var/named/

drwxr-x--- 6 named named 133 Mar 26 14:54 /var/named/

 

配置文件语法检测

[root@linux-node1 ~]# named-checkconf  //检测主配置文件语法,默认是/etc/named.conf

[root@linux-node1 ~]# named-checkzone keywa.com /var/named/chroot/etc/keywa.com.zone  //检测zone文件语法

zone keywa.com/IN: loaded serial 2018032701

OK

 

编辑控制脚本

[root@linux-node1 ~]# vim /usr/lib/systemd/system/named.service

[Unit]

Description=Berkeley Internet Name Domain (DNS)

Wants=nss-lookup.target

Wants=named-setup-rndc.service

Before=nss-lookup.target

After=network.target

After=named-setup-rndc.service

 

[Service]

Type=forking

Environment=NAMEDCONF=/etc/named.conf

EnvironmentFile=-/etc/sysconfig/named

Environment=KRB5_KTNAME=/etc/named.keytab

PIDFile=/var/named/chroot/var/run/named/named.pid

 

ExecStartPre=/bin/bash -c 'if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi'

ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS

 

ExecReload=/bin/sh -c '/usr/sbin/rndc reload > /dev/null 2>&1 || /bin/kill -HUP $MAINPID'

 

ExecStop=/bin/sh -c '/usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID'

 

PrivateTmp=true

 

[Install]

WantedBy=multi-user.target

 

启动bind服务,并设置开机自启动

[root@linux-node1 ~]# systemctl start named

[root@linux-node1 ~]# systemctl status named

[root@linux-node1 ~]# systemctl enable named

Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service.

[root@linux-node1 ~]# ps -ef|grep "named"|grep -v "grep"

named      2201      1  0 17:21 ?        00:00:00 /usr/sbin/named -u named -c /etc/named.conf

[root@linux-node1 ~]# netstat -tnlup|grep "53"|grep -v "grep"

tcp        0      0 192.168.56.11:53        0.0.0.0:*               LISTEN      2201/named

tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      2201/named

tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      2201/named

udp        0      0 192.168.56.11:53        0.0.0.0:*                           2201/named

udp        0      0 127.0.0.1:53            0.0.0.0:*                           2201/named

主从部署

安装bind软件

[root@linux-node2 ~]# yum -y install bind bind-utils bind-devel bind-chroot

[root@linux-node2 ~]# rpm -qa bind bind-utils bind-devel bind-chroot

bind-9.9.4-51.el7_4.2.x86_64

bind-devel-9.9.4-51.el7_4.2.x86_64

bind-chroot-9.9.4-51.el7_4.2.x86_64

bind-utils-9.9.4-51.el7_4.2.x86_64

 

编辑主配置文件/etc/named.conf,和Master主配置文件尽量保持一致

[root@linux-node2 ~]# cp -a /etc/named.conf /etc/named.conf_$(date +%F)

[root@linux-node2 ~]# vim /etc/named.conf

options {

  version "1.1.1";

  listen-on port 53 {any;};

  directory "/var/named/chroot/etc/";

  pid-file "/var/named/chroot/var/run/named/named.pid";

  allow-query {any;};

  dump-file "/var/named/chroot/var/log/named_dump.db";

  statistics-file "/var/named/chroot/var/log/named_stats";

  zone-statistics yes;

  memstatistics-file "/var/named/chroot/var/log/mem_stats";

  empty-zones-enable no;

  forwarders {114.114.114.114;202.96.128.86;};

};

 

key "rndc-key" {

  algorithm hmac-md5;

  secret "Adf9P7a3C42Da0bba574C1abAa138E59";

};

 

controls {

  inet 127.0.0.1 port 953 allow {127.0.0.1;} keys {"rndc-key";};

};

 

logging {

  channel warning {

    file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m;

    severity warning;

    print-category yes;

    print-severity yes;

    print-time yes;

  };

  channel general_dns {

    file "/var/named/chroot/var/log/dns_log" versions 10 size 100m;

    severity info;

    print-category yes;

    print-severity yes;

    print-time yes;

  };

  category default {

    warning;

  };

  category queries {

    general_dns;

  };

};

 

include "/var/named/chroot/etc/view.conf";

 

编辑/etc/rndc.key,默认不存在此文件

[root@linux-node2 ~]# vim /etc/rndc.key

key "rndc-key" {

  algorithm hmac-md5;

  secret "Adf9P7a3C42Da0bba574C1abAa138E59";

};

[root@linux-node2 ~]# ls -l /etc/rndc.key

-rw-r--r--. 1 root root 87 Mar 28 09:21 /etc/rndc.key

 

编辑/etc/rndc.conf,默认不存在此文件

[root@linux-node2 ~]# vim /etc/rndc.conf

key "rndc-key" {

  algorithm hmac-md5;

  secret "Adf9P7a3C42Da0bba574C1abAa138E59";

};

 

options {

  default-key "rndc-key";

  default-server 127.0.0.1;

  default-port 953;

};

[root@linux-node2 ~]# ls -l /etc/rndc.conf

-rw-r--r--. 1 root root 175 Mar 28 09:23 /etc/rndc.conf

 

编辑/var/named/chroot/etc/view.conf

[root@linux-node2 ~]# vim /var/named/chroot/etc/view.conf

view "SlaveView" {  //zone的标记说明

  zone "keywa.com" {  //定义一个zone

    type  slave;  //定义的是从域名服务器

    masters {192.168.56.11;};  //指定主DNS服务器地址

    file  "slave.keywa.com.zone";  //zone对应的文件,和view.conf同级目录,不需要手工创建文件,会自动同步过来

  };

};

 

修改目录权限

[root@linux-node2 ~]# chown -R named:named /var/named/

[root@linux-node2 ~]# ls -ld /var/named/

drwxr-x---. 6 named named 4096 Mar 28 09:10 /var/named/

 

配置文件语法检测

[root@linux-node2 ~]# named-checkconf

 

编辑控制脚本

[root@linux-node2 ~]# vim /usr/lib/systemd/system/named.service

[Unit]

Description=Berkeley Internet Name Domain (DNS)

Wants=nss-lookup.target

Wants=named-setup-rndc.service

Before=nss-lookup.target

After=network.target

After=named-setup-rndc.service

 

[Service]

Type=forking

Environment=NAMEDCONF=/etc/named.conf

EnvironmentFile=-/etc/sysconfig/named

Environment=KRB5_KTNAME=/etc/named.keytab

PIDFile=/var/named/chroot/var/run/named/named.pid

 

ExecStartPre=/bin/bash -c 'if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi'

ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS

 

ExecReload=/bin/sh -c '/usr/sbin/rndc reload > /dev/null 2>&1 || /bin/kill -HUP $MAINPID'

 

ExecStop=/bin/sh -c '/usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID'

 

PrivateTmp=true

 

[Install]

WantedBy=multi-user.target

 

启动bind服务,并设置开机自启动

[root@linux-node2 ~]# systemctl start named

[root@linux-node2 ~]# systemctl status named

[root@linux-node2 ~]# systemctl enable named

Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service.

[root@linux-node2 ~]# ps -ef|grep "named"|grep -v "grep"

named      2184      1  0 18:03 ?        00:00:00 /usr/sbin/named -u named -c /etc/named.conf

[root@linux-node2 ~]# netstat -tnlup|grep "53"|grep -v "grep"

tcp        0      0 192.168.56.12:53        0.0.0.0:*               LISTEN      2184/named

tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      2184/named

tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      2184/named

udp        0      0 192.168.56.12:53        0.0.0.0:*                           2184/named

udp        0      0 127.0.0.1:53            0.0.0.0:*                           2184/named

 

重新加载Master bind服务

[root@linux-node1 ~]# rndc reload

WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf)

server reload successful

[root@linux-node1 ~]# tail -10 /var/named/chroot/var/log/dns_log

28-Mar-2018 10:10:21.132 queries: info: client 192.168.56.12#21396 (keywa.com): view View: query: keywa.com IN SOA -E (192.168.56.11)

28-Mar-2018 10:10:21.133 queries: info: client 192.168.56.12#53292 (keywa.com): view View: query: keywa.com IN AXFR -T (192.168.56.11)

28-Mar-2018 10:26:07.392 queries: info: client 192.168.56.13#14503 (keywa.com): view View: query: keywa.com IN SOA -E (192.168.56.11)

28-Mar-2018 10:26:07.392 queries: info: client 192.168.56.13#38546 (keywa.com): view View: query: keywa.com IN AXFR -T (192.168.56.11)

 

检查主从同步是否正常,Mater zone文件serial数值加1

[root@linux-node1 ~]# vim /var/named/chroot/etc/keywa.com.zone

$ORIGIN keywa.com.

$TTL  3600        ; 1 Hour

@               IN      SOA  keywa.com. root.keywa.com. (

                        2018032702      ; serial

                        900             ; refresh (15 Minutes)

                        600             ; retry (10 Minutes)

                        86400           ; expire (1 Day)

                        3600            ; minimum (1 hour)

                        )

 

; NS Records

                IN      NS    ns1.keywa.com.

; MX Records

 

; A Records

ns1             IN      A     192.168.56.11

; CNAME Records

[root@linux-node1 ~]# named-checkzone keywa.com /var/named/chroot/etc/keywa.com.zone

zone keywa.com/IN: loaded serial 2018032702

OK

[root@linux-node1 ~]# rndc reload

WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf)

server reload successful

 

[root@linux-node2 ~]# ls -l /var/named/chroot/etc/slave.keywa.com.zone  //切记要关闭iptables和selinux,否则会同步失败

-rw-r--r--. 1 named named 193 Mar 28 11:04 /var/named/chroot/etc/slave.keywa.com.zone

[root@linux-node2 ~]# file /var/named/chroot/etc/slave.keywa.com.zone  //类型为数据文件,不支持手动编辑修改

/var/named/chroot/etc/slave.keywa.com.zone: data

添加记录

A记录

编辑/var/named/chroot/etc/keywa.com.zone,添加A记录并serial数值加1

[root@linux-node1 ~]# vim /var/named/chroot/etc/keywa.com.zone

$ORIGIN keywa.com.

$TTL  3600        ; 1 Hour

@               IN      SOA  keywa.com. root.keywa.com. (

                        2018032703      ; serial

                        900             ; refresh (15 Minutes)

                        600             ; retry (10 Minutes)

                        86400           ; expire (1 Day)

                        3600            ; minimum (1 hour)

                        )

 

; NS Records

                IN      NS    ns1.keywa.com.

; MX Records

 

; A Records

ns1             IN      A     192.168.56.11

a               IN      A     192.168.56.11

; CNAME Records

[root@linux-node1 ~]# named-checkzone keywa.com /var/named/chroot/etc/keywa.com.zone

zone keywa.com/IN: loaded serial 2018032703

OK

[root@linux-node1 ~]# rndc reload

WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf)

server reload successful

[root@linux-node1 ~]# host -t A a.keywa.com 192.168.56.12

Using domain server:

Name: 192.168.56.12

Address: 192.168.56.12#53

Aliases:

 

a.keywa.com has address 192.168.56.11

CNAME记录

编辑/var/named/chroot/etc/keywa.com.zone,添加CNAME记录并serial数值加1

[root@linux-node1 ~]# vim /var/named/chroot/etc/keywa.com.zone

$ORIGIN keywa.com.

$TTL  3600        ; 1 Hour

@               IN      SOA  keywa.com. root.keywa.com. (

                        2018032704      ; serial

                        900             ; refresh (15 Minutes)

                        600             ; retry (10 Minutes)

                        86400           ; expire (1 Day)

                        3600            ; minimum (1 hour)

                        )

 

; NS Records

                IN      NS    ns1.keywa.com.

; MX Records

 

; A Records

ns1             IN      A     192.168.56.11

a               IN      A     192.168.56.11

; CNAME Records

cname           IN      CNAME a.keywa.com.

[root@linux-node1 ~]# named-checkzone keywa.com /var/named/chroot/etc/keywa.com.zone

zone keywa.com/IN: loaded serial 2018032704

OK

[root@linux-node1 ~]# rndc reload

WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf)

server reload successful

[root@linux-node1 ~]# host -t CNAME cname.keywa.com 192.168.56.12

Using domain server:

Name: 192.168.56.12

Address: 192.168.56.12#53

Aliases:

 

cname.keywa.com is an alias for a.keywa.com.

MX记录

编辑/var/named/chroot/etc/keywa.com.zone,添加MX记录并serial数值加1

[root@linux-node1 ~]# vim /var/named/chroot/etc/keywa.com.zone

$ORIGIN keywa.com.

$TTL  3600        ; 1 Hour

@               IN      SOA  keywa.com. root.keywa.com. (

                        2018032705      ; serial

                        900             ; refresh (15 Minutes)

                        600             ; retry (10 Minutes)

                        86400           ; expire (1 Day)

                        3600            ; minimum (1 hour)

                        )

 

; NS Records

                IN      NS    ns1.keywa.com.

; MX Records

                IN      MX    5    mail.keywa.com.

; A Records

ns1             IN      A     192.168.56.11

a               IN      A     192.168.56.11

mail            IN      A     192.168.56.11

; CNAME Records

cname           IN      CNAME a.keywa.com.

[root@linux-node1 ~]# named-checkzone keywa.com /var/named/chroot/etc/keywa.com.zone

zone keywa.com/IN: loaded serial 2018032705

OK

[root@linux-node1 ~]# rndc reload

WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf)

server reload successful

[root@linux-node1 ~]# host -t MX keywa.com 192.168.56.12

Using domain server:

Name: 192.168.56.12

Address: 192.168.56.12#53

Aliases:

 

keywa.com mail is handled by 5 mail.keywa.com.

NS记录

编辑/var/named/chroot/etc/keywa.com.zone,添加NS记录并serial数值加1

[root@linux-node1 ~]# vim /var/named/chroot/etc/keywa.com.zone

$ORIGIN keywa.com.

$TTL  3600        ; 1 Hour

@               IN      SOA  keywa.com. root.keywa.com. (

                        2018032706      ; serial

                        900             ; refresh (15 Minutes)

                        600             ; retry (10 Minutes)

                        86400           ; expire (1 Day)

                        3600            ; minimum (1 hour)

                        )

 

; NS Records

                IN      NS    ns1.keywa.com.

                IN      NS    ns2.keywa.com.

; MX Records

                IN      MX    5    mail.keywa.com.

; A Records

ns1             IN      A     192.168.56.11

ns2             IN      A     192.168.56.12

a               IN      A     192.168.56.11

mail            IN      A     192.168.56.11

; CNAME Records

cname           IN      CNAME a.keywa.com.

[root@linux-node1 ~]# named-checkzone keywa.com /var/named/chroot/etc/keywa.com.zone

zone keywa.com/IN: loaded serial 2018032706

OK

[root@linux-node1 ~]# rndc reload

WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf)

server reload successful

[root@linux-node1 ~]# host -t NS keywa.com 192.168.56.12

Using domain server:

Name: 192.168.56.12

Address: 192.168.56.12#53

Aliases:

 

keywa.com name server ns2.keywa.com.

keywa.com name server ns1.keywa.com.

PTR记录

Master节点编辑/var/named/chroot/etc/view.conf

[root@linux-node1 ~]# vim /var/named/chroot/etc/view.conf

view "View" {

  zone "keywa.com" {

    type  master;

    file  "keywa.com.zone";

    allow-transfer {

      192.168.56.12;

      192.168.56.13;

    };

    notify  yes;

    also-notify {

      192.168.56.12;

      192.168.56.13;

    };

  };

 

  zone "168.192.in-addr.arpa" {

    type  master;

    file  "168.192.zone";

    allow-transfer {

      192.168.56.12;

      192.168.56.13;

    };

    notify  yes;

    also-notify {

      192.168.56.12;

      192.168.56.13;

    };

  };

};

 

Master节点编辑/var/named/chroot/etc/168.192.zone

[root@linux-node1 ~]# vim /var/named/chroot/etc/168.192.zone

$TTL  3600        ; 1 Hour

@               IN      SOA  keywa.com. root.keywa.com. (

                        2018032701      ; serial

                        900             ; refresh (15 Minutes)

                        600             ; retry (10 Minutes)

                        86400           ; expire (1 Day)

                        3600            ; minimum (1 hour)

                        )

 

; NS Records

                IN      NS    ns1.keywa.com.

                IN      NS    ns2.keywa.com.

; PTR Records

11.56           IN      PTR   a.keywa.com.

 

Slave节点编辑/var/named/chroot/etc/view.conf

[root@linux-node2 ~]# vim /var/named/chroot/etc/view.conf

view "SlaveView" {

  zone "keywa.com" {

    type  slave;

    masters {192.168.56.11;};

    file  "slave.keywa.com.zone";

  };

 

  zone "168.192.in-addr.arpa" {

    type  slave;

    masters {192.168.56.11;};

    file  "slave.168.192.zone";

  };

};

 

修改文件权限

[root@linux-node1 ~]# chown named:named /var/named/chroot/etc/168.192.zone

[root@linux-node1 ~]# ls -l /var/named/chroot/etc/168.192.zone

-rw-r--r-- 1 named named 548 Mar 28 14:23 /var/named/chroot/etc/168.192.zone

 

配置文件语法检测

[root@linux-node1 ~]# named-checkconf

[root@linux-node1 ~]# named-checkzone 168.192 /var/named/chroot/etc/168.192.zone

zone 168.192/IN: loaded serial 2018032701

OK

 

重新加载bind服务

[root@linux-node1 ~]# rndc reload

WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf)

server reload successful

[root@linux-node1 ~]# host -t PTR 192.168.56.11 192.168.56.12

Using domain server:

Name: 192.168.56.12

Address: 192.168.56.12#53

Aliases:

 

11.56.168.192.in-addr.arpa domain name pointer a.keywa.com.

负载均衡

编辑/var/named/chroot/etc/keywa.com.zone,添加A记录并serial数值加1

[root@linux-node1 ~]# vim /var/named/chroot/etc/keywa.com.zone

$ORIGIN keywa.com.

$TTL  3600        ; 1 Hour

@               IN      SOA  keywa.com. root.keywa.com. (

                        2018032707      ; serial

                        900             ; refresh (15 Minutes)

                        600             ; retry (10 Minutes)

                        86400           ; expire (1 Day)

                        3600            ; minimum (1 hour)

                        )

 

; NS Records

                IN      NS    ns1.keywa.com.

                IN      NS    ns2.keywa.com.

; MX Records

                IN      MX    5    mail.keywa.com.

; A Records

ns1             IN      A     192.168.56.11

ns2             IN      A     192.168.56.12

a               IN      A     192.168.56.11

a               IN      A     192.168.56.12

mail            IN      A     192.168.56.11

; CNAME Records

cname           IN      CNAME a.keywa.com.

[root@linux-node1 ~]# named-checkzone keywa.com /var/named/chroot/etc/keywa.com.zone

zone keywa.com/IN: loaded serial 2018032707

OK

[root@linux-node1 ~]# rndc reload

WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf)

server reload successful

[root@linux-node1 ~]# host -t A a.keywa.com 192.168.56.12  //仅有轮询算法,不支持健康检查,功能较弱

Using domain server:

Name: 192.168.56.12

Address: 192.168.56.12#53

Aliases:

 

a.keywa.com has address 192.168.56.11

a.keywa.com has address 192.168.56.12

智能视图

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

[root@linux-node1 ~]# vim /etc/named.conf

options {

  version "1.1.1";

  listen-on port 53 {any;};

  directory "/var/named/chroot/etc/";

  pid-file "/var/named/chroot/var/run/named/named.pid";

  allow-query {any;};

  dump-file "/var/named/chroot/var/log/named_dump.db";

  statistics-file "/var/named/chroot/var/log/named_stats";

  zone-statistics yes;

  memstatistics-file "/var/named/chroot/var/log/mem_stats";

  empty-zones-enable no;

  forwarders {114.114.114.114;202.96.128.86;};

};

 

key "rndc-key" {

  algorithm hmac-md5;

  secret "Adf9P7a3C42Da0bba574C1abAa138E59";

};

 

controls {

  inet 127.0.0.1 port 953 allow {127.0.0.1;} keys {"rndc-key";};

};

 

logging {

  channel warning {

    file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m;

    severity warning;

    print-category yes;

    print-severity yes;

    print-time yes;

  };

  channel general_dns {

    file "/var/named/chroot/var/log/dns_log" versions 10 size 100m;

    severity info;

    print-category yes;

    print-severity yes;

    print-time yes;

  };

  category default {

    warning;

  };

  category queries {

    general_dns;

  };

};

 

acl GUANGZHOU {

   192.168.56.12;

};

 

acl SHENZHEN {

   192.168.56.13;

};

 

include "/var/named/chroot/etc/view.conf";

 

编辑/var/named/chroot/etc/view.conf,清空之前的配置,否则配置不生效

[root@linux-node1 ~]# vim /var/named/chroot/etc/view.conf

view "GuangZhouView" {

  match-clients  {GUANGZHOU;};

  zone "keywa.cc" {

    type  master;

    file  "guangzhou.keywa.cc.zone";

    allow-transfer {

      192.168.56.12;

      192.168.56.13;

    };

    notify  yes;

    also-notify {

      192.168.56.12;

      192.168.56.13;

    };

  };

};

 

view "ShenZhenView" {

  match-clients  {SHENZHEN;};

  zone "keywa.cc" {

    type  master;

    file  "shenzhen.keywa.cc.zone";

    allow-transfer {

      192.168.56.12;

      192.168.56.13;

    };

    notify  yes;

    also-notify {

      192.168.56.12;

      192.168.56.13;

    };

  };

};

 

编辑/var/named/chroot/etc/guangzhou.keywa.cc.zone

[root@linux-node1 ~]# vim /var/named/chroot/etc/guangzhou.keywa.cc.zone

$ORIGIN keywa.cc.

$TTL  3600        ; 1 Hour

@               IN      SOA  keywa.cc. root.keywa.cc. (

                        2018032701      ; serial

                        900             ; refresh (15 Minutes)

                        600             ; retry (10 Minutes)

                        86400           ; expire (1 Day)

                        3600            ; minimum (1 hour)

                        )

 

; NS Records

                IN      NS    ns1.keywa.cc.

                IN      NS    ns2.keywa.cc.

; MX Records

 

; A Records

ns1             IN      A     192.168.56.11

ns2             IN      A     192.168.56.12

a               IN      A     192.168.56.11

; CNAME Records

 

 

编辑/var/named/chroot/etc/shenzhen.keywa.cc.zone

[root@linux-node1 ~]# vim /var/named/chroot/etc/shenzhen.keywa.cc.zone

$ORIGIN keywa.cc.

$TTL  3600        ; 1 Hour

@               IN      SOA  keywa.cc. root.keywa.cc. (

                        2018032701      ; serial

                        900             ; refresh (15 Minutes)

                        600             ; retry (10 Minutes)

                        86400           ; expire (1 Day)

                        3600            ; minimum (1 hour)

                        )

 

; NS Records

                IN      NS    ns1.keywa.cc.

                IN      NS    ns2.keywa.cc.

; MX Records

 

; A Records

ns1             IN      A     192.168.56.11

ns2             IN      A     192.168.56.12

a               IN      A     192.168.56.12

; CNAME Records

 

修改文件权限

[root@linux-node1 ~]# chown named:named /var/named/chroot/etc/guangzhou.keywa.cc.zone

[root@linux-node1 ~]# chown named:named /var/named/chroot/etc/shenzhen.keywa.cc.zone

[root@linux-node1 ~]# ls -l /var/named/chroot/etc/guangzhou.keywa.cc.zone

-rw-r--r-- 1 named named 674 Mar 28 16:01 /var/named/chroot/etc/guangzhou.keywa.cc.zone

[root@linux-node1 ~]# ls -l /var/named/chroot/etc/shenzhen.keywa.cc.zone

-rw-r--r-- 1 named named 674 Mar 28 16:02 /var/named/chroot/etc/shenzhen.keywa.cc.zone

 

配置文件语法检测

[root@linux-node1 ~]# named-checkconf

[root@linux-node1 ~]# named-checkzone keywa.cc /var/named/chroot/etc/guangzhou.keywa.cc.zone

zone keywa.cc/IN: loaded serial 2018032701

OK

[root@linux-node1 ~]# named-checkzone keywa.cc /var/named/chroot/etc/shenzhen.keywa.cc.zone

zone keywa.cc/IN: loaded serial 2018032701

OK

 

重新加载bind服务

[root@linux-node1 ~]# rndc reload

WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf)

server reload successful

[root@linux-node2 ~]# host -t A a.keywa.cc 192.168.56.11

Using domain server:

Name: 192.168.56.11

Address: 192.168.56.11#53

Aliases:

 

a.keywa.cc has address 192.168.56.11

[root@linux-node3 ~]# host -t A a.keywa.cc 192.168.56.11

Using domain server:

Name: 192.168.56.11

Address: 192.168.56.11#53

Aliases:

 

a.keywa.cc has address 192.168.56.12

高可用部署

安装ipvsadm、keepalived软件

[root@linux-node4 ~]# yum -y install ipvsadm keepalived

[root@linux-node4 ~]# rpm -qa ipvsadm keepalived

ipvsadm-1.27-7.el7.x86_64

keepalived-1.3.5-1.el7.x86_64

 

查看是否加载ip_vs模块

[root@linux-node4 ~]# ipvsadm

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@linux-node4 ~]# lsmod|grep "ip_vs"|grep -v "grep"

ip_vs                 140944  0

nf_conntrack          105745  1 ip_vs

libcrc32c              12644  2 xfs,ip_vs

 

编辑主keepalived配置文件

[root@linux-node4 ~]# cp -a /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_$(date +%F)

[root@linux-node4 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {  //全局定义区块

   notification_email {  //邮件通知配置,当keepalived发生故障时,通知人邮箱列表,一行一个

     admin@keywa.com

   }

   notification_email_from system@keywa.com  //发件人邮箱

   smtp_server 127.0.0.1  //邮件服务器地址

   smtp_connect_timeout 30  //邮件服务器连接超时时间

   router_id LVS_01  //标识keepalived节点字符串(名称)

}

 

vrrp_instance VI_DNS {  //VRRP实例定义区块,实例名称

    state MASTER  //实例状态,只有MASTER和BACKUP两种状态,并且必须要大写

    interface eth0  //对外提供服务的网络接口

    virtual_router_id 51  //虚拟路由ID号,每个节点必须设置一致

    priority 150  //节点优先级,取值范围1-254,MASTER比BACKUP要高,官方建议间隔50,高优先级竞选为MASTER

    advert_int 1  //MASTER和BACKUP节点之间同步检查的时间间隔,单位秒

    authentication {  //设置验证

        auth_type PASS  //验证类型,类型包括PASS、AH,建议使用PASS

        auth_pass a2P1vm9Dwk2  //验证密码

    }

    virtual_ipaddress {  虚拟IP地址池,一行一个

        192.168.56.100 dev eth0 label eth0:0

    }

}

 

virtual_server 192.168.56.100 53 {  //virtual_server定义区块,此VIP是virtual_ipaddress中定义的其中一个

    delay_loop 5  //健康检查时间间隔,单位秒

    lb_algo rr  //负载均衡调度算法,常用算法rr、wrr、lc

    lb_kind DR  //负载均衡转发规则(模式),包括NAT、DR、TUN,一般使用DR模式

    nat_mask 255.255.255.0  //子网掩码

    persistence_timeout 0  //会话保持,单位秒

protocol UDP  //转发协议、包括TCP、UDP

sorry_server 192.168.56.11 53  //备用机,当所有后端节点失效后才会被启用

 

    real_server 192.168.56.12 53 {  //后端节点IP和端口,可以有多个

        weight 1  //负载权重,值越大,转发的优先级越高

        TCP_CHECK {  //服务有效性检查

            connect_timeout 3  //健康检查超时时间,单位秒

            nb_get_retry 3  //重连次数

            delay_before_retry 3  //重连时间间隔,单位秒

            connect_port 53  //健康检查端口号

        }

        MISC_CHECK {  //服务有效性检查

            misc_path "/etc/keepalived/check_dns.sh 192.168.56.12"  //外部脚本路径

            misc_timeout 30  //脚本执行超时时间,单位秒

            misc_dynamic  //设置此项,退出状态码会用来动态调整后端节点权重,返回0,表示正常,不修改;返回1,表示检查失败,权重改为0;返回2-255,表示正常,权重设置为状态码-2

        }

    }

 

    real_server 192.168.56.13 53 {

        weight 1

        TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

            connect_port 53

        }

        MISC_CHECK {

            misc_path "/etc/keepalived/check_dns.sh 192.168.56.13"

            misc_timeout 30

            misc_dynamic

        }

    }

}

 

编辑备keepalived配置文件

[root@linux-node5 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

   notification_email {

     admin@keywa.com

   }

   notification_email_from system@keywa.com

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_02

}

 

vrrp_instance VI_DNS {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass a2P1vm9Dwk2

    }

    virtual_ipaddress {

        192.168.56.100 dev eth0 label eth0:0

    }

}

 

virtual_server 192.168.56.100 53 {

    delay_loop 5

    lb_algo rr

    lb_kind DR

    nat_mask 255.255.255.0

    persistence_timeout 0

    protocol UDP

    sorry_server 192.168.56.11 53

 

    real_server 192.168.56.12 53 {

        weight 1

        TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

            connect_port 53

        }

        MISC_CHECK {

            misc_path "/etc/keepalived/check_dns.sh 192.168.56.12"

            misc_timeout 30

            misc_dynamic

        }

    }

 

    real_server 192.168.56.13 53 {

        weight 1

        TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

            connect_port 53

        }

        MISC_CHECK {

            misc_path "/etc/keepalived/check_dns.sh 192.168.56.13"

            misc_timeout 30

            misc_dynamic

        }

    }

}

 

编写后端服务器健康状态检测脚本

[root@linux-node4 ~]# vim /etc/keepalived/check_dns.sh

#!/bin/bash

# Name:check_dns.sh

# Version:V1.0

# Type:Check Script

# Language:Bash Shell

# Date:2018-04-02

# Author:LinBin

# Email:linbin@keywa.com

# QQ:991395975

# Description:Monitor DNS Server Health

 

# Source function library.

. /etc/rc.d/init.d/functions

 

# Determine whether the current user is an administrator.

if [ "$UID" -ne 0 ]

then

  echo "This script must be an administrator to execute."

  exit 1

fi

 

# Determine whether pass one parameter.

if [ "$#" -ne 1 ]

then

  echo "This script must have a parameter,USAGE:$0 192.168.56.12"

  exit 2

fi

 

# Variable definitions.

CIP=$1

 

# Check whether the DNS server is normal.

function check_rs() {

         check_stats=$(dig @$CIP -t A +short check.keywa.com|wc -l)

         if [ "$check_stats" -eq 1 ]

         then

           exit 0

         else

           exit 1

         fi

}

 

# Main function

function main() {

        check_rs

}

 

# Execute the main function.

main

[root@linux-node4 ~]# ls -l /etc/keepalived/check_dns.sh

-rwxr-xr-x 1 root root 1222 Apr  3 09:43 /etc/keepalived/check_dns.sh

 

编写后端节点配置回环接口地址脚本

[root@linux-node2 ~]# mkdir /server/scripts -p

[root@linux-node2 ~]# ls -ld /server/scripts/

drwxr-xr-x 2 root root 6 Apr  3 10:14 /server/scripts/

[root@linux-node2 ~]# vim /server/scripts/vi_dns.sh

#!/bin/bash

# Name:vi_dns.sh

# Version:V1.0

# Type:Backend Node Configuration Script

# Language:Bash Shell

# Date:2018-04-02

# Author:LinBin

# Email:linbin@keywa.com

# QQ:991395975

# Description: Config Realserver Lo And Apply Noarp

 

# Determine whether the current user is an administrator.

if [ "$UID" -ne 0 ]

then

  echo "This script must be an administrator to execute."

  exit 1

fi

 

# Variable definitions.

VIP=192.168.56.100

 

case "$1" in

    start)

          /usr/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP

          /sbin/route add -host $VIP dev lo:0

          echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

          echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

          echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

          echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

          sysctl -p >/dev/null 2>&1

          echo "RealServer Start OK"

          ;;

 

    stop)

          /usr/sbin/ifconfig lo:0 down

          /sbin/route del $VIP >/dev/null 2>&1

          echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore

          echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce

          echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore

          echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce

          echo "RealServer Stoped"

          ;;

 

    *)

          echo "Usage: $0 {start|stop}"

          exit 1

esac

exit 0

[root@linux-node2 ~]# /bin/bash /server/scripts/vi_dns.sh start

RealServer Start OK

[root@linux-node2 ~]# ifconfig lo:0

lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536

        inet 192.168.56.100  netmask 255.255.255.255

        loop  txqueuelen 0  (Local Loopback)

[root@linux-node2 ~]# echo "/bin/bash /server/scripts/vi_dns.sh start" >> /etc/rc.local

[root@linux-node2 ~]# tail -1 /etc/rc.local

/bin/bash /server/scripts/vi_dns.sh start

[root@linux-node2 ~]# chmod +x /etc/rc.d/rc.local

[root@linux-node2 ~]# ls -l /etc/rc.d/rc.local

-rwxr-xr-x. 1 root root 515 Apr  3 10:27 /etc/rc.d/rc.local

 

启动keepalived服务,并设置开机自启动

[root@linux-node4 ~]# systemctl start keepalived

[root@linux-node4 ~]# systemctl enable keepalived

[root@linux-node4 ~]# systemctl status keepalived

 

查看ipvsadm状态是否正常

[root@linux-node4 ~]# ifconfig eth0:0

eth0:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.56.100  netmask 255.255.255.255  broadcast 0.0.0.0

        ether 00:0c:29:6b:9b:c2  txqueuelen 1000  (Ethernet)

[root@linux-node4 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

UDP  192.168.56.100:53 rr

  -> 192.168.56.12:53             Route   1      0          0

  -> 192.168.56.13:53             Route   1      0          0

 

故障演示

● 停止主keepalived服务,虚拟IP漂移至备。

[root@linux-node4 ~]# systemctl stop keepalived

[root@linux-node4 ~]# systemctl status keepalived

[root@linux-node4 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@linux-node4 ~]# ifconfig eth0:0

eth0:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        ether 00:0c:29:6b:9b:c2  txqueuelen 1000  (Ethernet)

 

[root@linux-node5 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

UDP  192.168.56.100:53 rr

  -> 192.168.56.12:53             Route   1      0          0

  -> 192.168.56.13:53             Route   1      0          0

[root@linux-node5 ~]# ifconfig eth0:0

eth0:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.56.100  netmask 255.255.255.255  broadcast 0.0.0.0

        ether 00:0c:29:4c:7f:86  txqueuelen 1000  (Ethernet)

 

● 恢复主keepalived服务,虚拟IP漂移至主。

[root@linux-node4 ~]# systemctl start keepalived

[root@linux-node4 ~]# systemctl status keepalived

[root@linux-node4 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

UDP  192.168.56.100:53 rr

  -> 192.168.56.12:53             Route   1      0          0

  -> 192.168.56.13:53             Route   1      0          0

[root@linux-node4 ~]# ifconfig eth0:0

eth0:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.56.100  netmask 255.255.255.255  broadcast 0.0.0.0

        ether 00:0c:29:6b:9b:c2  txqueuelen 1000  (Ethernet)

 

[root@linux-node5 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

UDP  192.168.56.100:53 rr

  -> 192.168.56.12:53             Route   1      0          0

  -> 192.168.56.13:53             Route   1      0          0

[root@linux-node5 ~]# ifconfig eth0:0

eth0:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        ether 00:0c:29:4c:7f:86  txqueuelen 1000  (Ethernet)

 

● 停止后端节点named服务,集群会自动剔除故障后端节点,根据TCP端口检测。

[root@linux-node2 ~]# systemctl stop named

[root@linux-node2 ~]# systemctl status named

 

[root@linux-node4 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

UDP  192.168.56.100:53 rr

  -> 192.168.56.13:53             Route   1      0          0

 

● 恢复后端节点named服务,集群会自动添加故障恢复后端节点,根据TCP端口检测。

[root@linux-node2 ~]# systemctl start named

[root@linux-node2 ~]# systemctl status named

 

[root@linux-node4 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

UDP  192.168.56.100:53 rr

  -> 192.168.56.12:53             Route   1      0          0

  -> 192.168.56.13:53             Route   1      0          0

 

● 后端节点未能正常解析(去除check.keywa.com解析记录),集群会自动剔除故障后端节点,根据外部脚本检测。

[root@linux-node1 ~]# vim /var/named/chroot/etc/keywa.com.zone

2018032713      ; serial

; A Records

; check           IN      A     192.168.56.100

[root@linux-node1 ~]# named-checkzone keywa.com /var/named/chroot/etc/keywa.com.zone

zone keywa.com/IN: loaded serial 2018032713

OK

[root@linux-node1 ~]# rndc reload

 

[root@linux-node4 ~]# ipvsadm -L -n  //配置文件定义了sorry_server,当后端节点都不可用时,转发至主DNS服务器进行解析

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

UDP  192.168.56.100:53 rr

  -> 192.168.56.11:53             Route   1      0          0

 

● 后端节点恢复正常解析,集群会自动添加故障恢复后端节点,根据外部脚本检测。

[root@linux-node1 ~]# vim /var/named/chroot/etc/keywa.com.zone

2018032714      ; serial

; A Records

check           IN      A     192.168.56.100

[root@linux-node1 ~]# named-checkzone keywa.com /var/named/chroot/etc/keywa.com.zone

zone keywa.com/IN: loaded serial 2018032714

OK

[root@linux-node1 ~]# rndc reload

 

[root@linux-node4 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

UDP  192.168.56.100:53 rr

  -> 192.168.56.12:53             Route   1      0          0

  -> 192.168.56.13:53             Route   1      0          0

三、构建企业级DNS

硬件选型

  CPU:12核及以上配置

  内存:16G及以上配置

  网络:千兆及以上配置

系统初始化

关闭selinux

[root@master-dns ~]# setenforce 0

[root@master-dns ~]# getenforce

Disabled

[root@master-dns ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

[root@master-dns ~]# grep "SELINUX=disabled" -C 2 /etc/selinux/config

#     permissive - SELinux prints warnings instead of enforcing.

#     disabled - No SELinux policy is loaded.

SELINUX=disabled

# SELINUXTYPE= can take one of three two values:

#     targeted - Targeted processes are protected,

关闭iptables

[root@master-dns ~]# systemctl stop firewalld

[root@master-dns ~]# systemctl status firewalld

[root@master-dns ~]# systemctl disable firewalld

设置系统主机名

[root@master-dns ~]# hostnamectl set-hostname master-dns.keywa.com

[root@master-dns ~]# hostname

master-dns.keywa.com

[root@master-dns ~]# tail -1 /etc/hostname

master-dns.keywa.com

设置系统字符集

[root@master-dns ~]# sed -i 's#zh_CN.UTF-8#en_US.UTF-8#g' /etc/locale.conf

[root@master-dns ~]# tail -1 /etc/locale.conf

LANG="en_US.UTF-8"

[root@master-dns ~]# source /etc/locale.conf

SSH远程登录优化

[root@master-dns ~]# cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config_$(date +%F)

[root@master-dns ~]# vim /etc/ssh/sshd_config

17 Port 51898

19 ListenAddress 192.168.56.11

23 Protocol 2

49 PermitRootLogin no

93 GSSAPIAuthentication no

129 UseDNS no

[root@master-dns ~]# systemctl restart sshd

[root@master-dns ~]# systemctl status sshd

[root@master-dns ~]# netstat -tnlup|grep "51898"|grep -v "grep"

tcp        0      0 192.168.56.11:51898     0.0.0.0:*               LISTEN      2650/sshds

[root@master-dns ~]# ps -ef|grep "sshd"|grep -v "grep"

root       2569      1  0 13:13 ?        00:00:00 sshd: root@pts/0

root       2650      1  0 13:23 ?        00:00:00 /usr/sbin/sshd -D

同步时间服务器

[root@master-dns ~]# ntpdate 0.pool.ntp.org

[root@master-dns ~]# ntpdate 0.pool.ntp.org

29 Mar 13:29:32 ntpdate[2678]: adjust time server 85.199.214.101 offset 0.013411 sec

[root@master-dns ~]# hwclock

Thu Mar 29 21:22:40 2018  -0.335485 seconds

[root@master-dns ~]# crontab -e

####Synchronization Network Time Server####

*/5 * * * * /usr/sbin/ntpdate 0.pool.ntp.org &>/dev/null

[root@master-dns ~]# crontab -l

####Synchronization Network Time Server####

*/5 * * * * /usr/sbin/ntpdate 0.pool.ntp.org &>/dev/null

设置系统历史命令记录数及登录超时时间

[root@master-dns ~]# export HISTSIZE=100

[root@master-dns ~]# export HISTFILESIZE=100

[root@master-dns ~]# export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "

[root@master-dns ~]# export TMOUT=300

[root@master-dns ~]# echo $HISTSIZE $HISTFILESIZE $HISTTIMEFORMAT $TMOUT

100 100 %Y-%m-%d %H:%M:%S 300

[root@master-dns ~]# vim /etc/profile

HISTSIZE=100

export HISTFILESIZE=100

export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "

export TMOUT=300

[root@master-dns ~]# source /etc/profile

设置系统文件描述符数

[root@master-dns ~]# ulimit -n

1024

[root@master-dns ~]# ulimit -SHn 65535

[root@master-dns ~]# ulimit -n

65535

[root@master-dns ~]# echo "*               -       nofile          65535" >> /etc/security/limits.conf

[root@master-dns ~]# tail -1 /etc/security/limits.conf

*               -       nofile          65535

设置系统别名

[root@master-dns ~]# alias ll='ls -l --color=auto --time-style=long-iso'

[root@master-dns ~]# alias vi='vim'

[root@master-dns ~]# cat >> /etc/bashrc<<EOF

> alias ll='ls -l --color=auto --time-style=long-iso'

> alias vi='vim'

> EOF

[root@master-dns ~]# source /etc/bashrc

更新国内yum源

aliyun

[root@master-dns ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

[root@master-dns ~]# yum makecache

epel

[root@master-dns ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

[root@master-dns ~]# yum makecache

隐藏系统版本信息及设置登录提示语

[root@master-dns ~]# > /etc/issue

[root@master-dns ~]# > /etc/issue.net

[root@master-dns ~]# cat >> /etc/motd<<EOF

> Welcome to join the keywa family, please save your account and password. If you have any questions, please contact your system administrator!

> Mail: linbin@keywa.com

> QQ: 991395975

> EOF

设置系统内核参数

[root@master-dns ~]# cat >> /etc/sysctl.conf<<EOF

>

> # By LinBin At 2018-03-29

> net.ipv4.tcp_fin_timeout = 2

> net.ipv4.tcp_tw_reuse = 1

> net.ipv4.tcp_tw_recycle = 1

> net.ipv4.tcp_max_tw_buckets = 5000

> net.ipv4.tcp_syncookies = 1

> net.ipv4.tcp_max_syn_backlog = 16384

> net.ipv4.tcp_keepalive_time = 600

> net.ipv4.ip_local_port_range = 4000 65000

> net.ipv4.route.gc_timeout = 100

> net.ipv4.tcp_syn_retries = 1

> net.ipv4.tcp_synack_retries = 1

> net.core.somaxconn = 16384

> net.core.netdev_max_backlog = 16384

> net.ipv4.tcp_max_orphans = 16384

> EOF

[root@master-dns ~]# sysctl -p

net.ipv4.tcp_fin_timeout = 2

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_max_tw_buckets = 5000

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_max_syn_backlog = 16384

net.ipv4.tcp_keepalive_time = 600

net.ipv4.ip_local_port_range = 4000 65000

net.ipv4.route.gc_timeout = 100

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_synack_retries = 1

net.core.somaxconn = 16384

net.core.netdev_max_backlog = 16384

net.ipv4.tcp_max_orphans = 16384

高可用、高性能

采用LVS DR模式负载均衡,多IDC,多套DNS集群,通过DNS主从技术保障DNS配置的一致性。

高可用

物理层

  确保两台LVS不在同一机柜,同一物理交换机接入。

  确保所有从DNS不在同一机柜,同一物理交换机接入。

  在不同IDC构建多套DNS集群,供客户端可切换的配置。

服务层

摈弃LVS上的端口检测方式,通过自定义脚本检测,单独为DNS的健康检测设置一个域名来检测DNS是否正常解析。

客户端层

多IDC之间的流量切换是通过客户端的健康检测实现的,脚本每分钟运行一次,分别检测每个DNS集群虚拟地址的可用性。

高性能

● 通过LVS可以对每个集群进行横向扩容,是否需要扩容的依据是对现有系统的压力测试结果,以及实时的监控数据。

● 在可靠的应用层处加入缓存集群。

压力测试

安装queryperf软件

[root@linux-node4 ~]# cd /usr/local/src/

[root@linux-node4 src]# wget http://distfiles.macports.org/bind9/bind-9.9.4.tar.gz

[root@linux-node4 src]# tar xvfz bind-9.9.4.tar.gz

[root@linux-node4 src]# cd bind-9.9.4/contrib/queryperf/

[root@linux-node4 queryperf]# ./configure

[root@linux-node4 queryperf]# make

[root@linux-node4 queryperf]# ls -l queryperf

-rwxr-xr-x 1 root root 45684 Apr  3 13:14 queryperf

[root@linux-node4 queryperf]# mv queryperf /usr/bin/

[root@linux-node4 queryperf]# which queryperf

/usr/bin/queryperf

 

单机压测

[root@linux-node4 ~]# for number in {1..1000000};do echo "check.keywa.com A" >> recode.txt;done

[root@linux-node4 ~]# wc -l recode.txt

1000000 recode.txt

[root@linux-node4 ~]# queryperf -d recode.txt -s 192.168.56.12

DNS Query Performance Testing Tool

Version: $Id: queryperf.c,v 1.12 2007/09/05 07:36:04 marka Exp $

 

[Status] Processing input data

[Status] Sending queries (beginning with 192.168.56.12)

[Status] Testing complete

 

Statistics:

 

  Parse input file:     once

  Ended due to:         reaching end of file

 

  Queries sent:         1000000 queries

  Queries completed:    1000000 queries

  Queries lost:         0 queries

  Queries delayed(?):   0 queries

 

  RTT max:              0.258464 sec

  RTT min:              0.000066 sec

  RTT average:          0.001494 sec

  RTT std deviation:    0.001263 sec

  RTT out of range:     0 queries

 

  Percentage completed: 100.00%

  Percentage lost:        0.00%

 

  Started at:           Tue Apr  3 13:32:16 2018

  Finished at:          Tue Apr  3 13:33:32 2018

  Ran for:              76.428884 seconds

 

  Queries per second:   13084.058639 qps

监控报警

系统性能

通过zabbix监控即可,包括CPU、内存、网络、硬盘、I/O、负载等。

回环接口

因为采用LVS DR模式,需要绑定回环接口地址才可以通信。当回环接口地址邦定失败时,DNS集群会出现异常。

主从同步

编写定时检测脚本,检查主DNS上所有域的serial数值与从DNS上的serial数值是否一致。当出现不一致时,触发报警。

响应时间

采用dig命令检测DNS的响应时间。

日常运维规范

● DNS作为基础服务,必须做到高可用、高性能、便于扩容,任何时候都不能掉以轻心。

● 确保所有的监控处于生效状态。

● 所有机器均在批量管理工具(Saltstack、Puppet)上完成初始化安装、部署操作,不能单独安装。

● 所有对DNS架构调整均在流量低谷时操作。

● 针对集群扩容,必须对新机器进行压力测试,同时重启机器并检测各项指标是否正常。

● 关注DNS相关新闻,时刻关注漏洞等安全问题。

● 定时进行故障演练,制定应急方案。


guiyun affiliate

作者头像
南宫俊逸创始人

君子好学,自强不息~

上一篇:No space left on device 解决Linux系统磁盘空间满的办法
下一篇:H3C 交换机配置命令

相关推荐

4

发表评论