2. 构建DNS集群

DNS是什么

DNS(Domain Name System,域名系统),是互联网上存储域名和IP映射关系的一个分布式数据库,他负责把域名转换为IP地址,或IP转换为域名,工作于OSI应用层之上,DNS运行于UDP/TCP的53端口,其中,负责提供域名解析的为UDP协议的53端口,负责DNS服务器之间的区域传送采用TCP的53端口。

BIND

BIND(Berkeley Internet Name Domain)是DNS协议的开源实现。由两部分组成。

  • 域名服务器(Name Server):
    提供域名解析服务。
  • 解析器(Resolver):
    负责发起查询和向调用他的应用返回IP地址或者别名等消息。

DNS服务器的分类

  1. 权威域名服务器
    负责授权域下面的域名解析服务,由上级权威域名服务器使用NS记录进行授权。
    按照授权的层级划分,最多127层:
    1)根域
    使用.表示,通常在浏览器输入时省略。负责对.com,.cn,.org等顶级域进行授权,全球13个逻辑根服务器。
    2)顶级域
    类似于.com,.cn,.org
    3)二级域
    sina.com,baidu.com,aliyun.com

主DNS:
每个区域名字服务器,保存着本区域的正式数据。
从DNS:
通过“区域传送”操作,通过主服务器上获取它的数据。

  1. 缓存域名服务器
    通过依次查询根域-顶级域-二级域的方式来解析dns条目,同时根据DNS条目的TTL值进行缓存。

  2. 转发域名服务器
    在接收查询请求时,不向根发起请求,而是转发到指定的上级DNS服务器,而且不进行任何缓存,仅转发。

权威应答:由直接负责的DNS服务器返回解析。
非权威应答:从缓存中读取记录来回答查询,可能数据已过期。

DNS查询类型

递归查询:

  1. 客户端解析器把请求发送给本地DNS服务器;
  2. 本地服务器代替客户端,向根域-顶级域-二级域查询,并把最终结果返回给用户。

迭代查询:

  1. 客户端向本地DNS发起查询;
  2. 本地DNS不直接去帮助客户端查询,而是发给客户端一个可以解析本次请求的DNS服务器的列表,再由客户端再次向这些列表中的DNS发起请求,从而查到结果。

DNS资源记录类型

资源记录的定义格式:

name      [TTL]     IN    RR_TYPE         value

注意:

  1. TTL可以从全局继承;
  2. @可用于引用当前区域的名字
  3. 相邻的两条记录其name相同时,后面的可省略;

SOA

Start Of Authority,这种record 放在zone file 一开始的地方,每一个zone只能有一个SOA,而且一定是记录中第一个“记录”,它描述这个zone负责的name server,version number…等资料,以及当slave server 要备份这个zone 时的一些参数。

例:

xiaohou.com.  86400  IN  SOA  xiaohou.com.  root.xiaohou.com.  (
            2017031901     ; serial
            2H             ; refresh
            10M            ; retry
            1W             ; expire
            1D             ; negative answer ttl
                        )

serial:序列号,作为主从更新的依据,主服务器数据库内容发生变化时,其版本号递增;
refresh:从服务器每多久到主服务器检查序列号更新状况;
retry: 从服务器从主服务器请求同步解析库失败时,间隔多久再次尝试连接;
expire:过期时长,从服务器始终联系不到主服务器时,多久之后放弃从主服务器同步数据;停止提供服务;
negative answer ttl:否定答案的缓存时长,客户端缓存的时间,设定过长会导致无法立即生效,设定过短导致客户端频繁请求

NS

name server,用来指定操作的DNS服务器名称,需注意的是不可以用IP地址表示。

例:

xiaohou.com.     86400     IN     NS      ns1.xiaohou.com.
xiaohou.com.     86400     IN     NS      ns2.xiaohou.com.

MX

mail exchanger,设定区域中邮件服务器(SMTP)的主机。 每一个值前面由一个数字,是该主机邮件传递时的优先次序,此值越低表示有越高的邮件处理优先权,取值范围0-99。

例:

xiaohou.com.      IN     MX  10      ns1.xiaohou.com.
                  IN     MX  20      ns2.xiaohou.com.

A

address,将域名解析到IPv4的IP地址。

例:

www.xiaohou.com.        IN     A    10.0.7.100

AAAA

将域名解析到IPv6的IP位址。

例:

www.xiaohou.com. 86400 IN AAAA 3ffe: :bbb:93:5

PTR

pointer,将IP地址转换成主机的FQDN。

例:

100.7.0.10.in-addr.arpa.      IN  PTR    www.xiaohou.com.

CNAME

canonical name,别名

例:

  blog.xiaohou.com.      IN      CNAME  www.xiaohou.com.

配置DNS服务器(BIND)

环境

IP地址 操作系统 主机名
10.0.7.1 Centos7 主DNS服务器
10.0.7.2 Centos7 从DNS服务器
10.0.7.3 Centos7 子域服务器

程序包:

bind-libs:被bind和bind-utils包中的程序共同用到的库文件;
bind-utils:bind客户端程序集,例如dig, host, nslookup等;
bind:提供的dns server程序、以及几个常用的测试程序;
bind-chroot:选装,让named运行于jail模式下;

rndc:remote name domain controller,默认与bind安装再同一主机,且只能通过127.0.0.1来连接named进程,提供辅助管理功能,服务监听于tcp的953端口。

主节点 (10.0.7.1)

安装bind

yum -y install bind-libs bind-utils bind bind-chroot

配置/etc/named.conf

options {
    listen-on port 53 { any; };
    directory     "/var/named";
    dump-file     "data/cache_dump.db";
    zone-statistics yes;
    statistics-file "data/named_stats.txt";
    memstatistics-file "data/named_mem_stats.txt";
    allow-query     { any; };
    //recursion:
    //作为授权域名服务器 no,作为一个递归DNS服务器 yes;
    recursion yes;
    pid-file "/run/named/named.pid";
    session-keyfile "/run/named/session.key";
    empty-zones-enable no;
};

logging {
//错误日志
  channel error_log {
    file "data/error_log" versions 10 size 10m;
    severity warning;
    print-category yes;
    print-severity yes;
    print-time yes;
  };
//查询日志
  channel query_log {
    file "data/query_log" versions 10 size 100m;
    severity info;
    print-category yes;
    print-severity yes;
    print-time yes;
  };
  category default {
    error_log;
  };
  category queries {
    query_log;
  };
};

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

配置/etc/named.rfc1912.zones

//正向解析
zone "xiaohou.com" IN {
        type master;
        file "xiaohou.com.zone";
        allow-update { none; };
        };
//反向解析
zone "7.0.10.in-addr.arpa" IN {
    type master;
    file "10.0.7.arpa.zone";
    allow-update { none; };
};

配置正向区域/var/named/xiaohou.com.zone

$TTL 86400
;资源记录简写时补全的后缀,如果不指定默认为zone中定义的
$ORIGIN xiaohou.com.
@   IN  SOA     ns1.xiaohou.com. root.xiaohou.com. (
        2017031901  ;Serial
        3600        ;Refresh
        1800        ;Retry
        604800      ;Expire
        86400       ;Minimum TTL
)
        IN  NS      ns1.xiaohou.com.
        IN  NS      ns2.xiaohou.com.
        IN  MX  10  mx1
        IN  MX  20  mx2
ns1     IN  A   10.0.7.1
ns2     IN  A   10.0.7.2
@       IN  A   10.0.7.1
www     IN  A   10.0.7.2
mx1     IN  A   10.0.7.3
mx2     IN  A   10.0.7.4

配置反向区域/var/named/10.0.7.arpa.zone

$TTL 1D
@       IN SOA  ns1.xiaohou.com.  root.xiaohou.com. (
                    11      ; serial
                    1H      ; refresh
                    5M      ; retry
                    3M      ; expire
                    10H )   ; minimum
          IN NS   ns1.xiaohou.com.
          IN NS   ns2.xiaohou.com.
1         IN PTR  ns1.xiaohou.com.
2         IN PTR  ns2.xiaohou.com.
3         IN PTR  mx1.xiaohou.com.
4         IN PTR  mx2.xiaohou.com.

启动

systemctl start named
systemctl enable named

如果需要使用chroot启动

/usr/libexec/setup-named-chroot.sh  /var/named/chroot/ on
systemctl stop named
systemctl disable named
systemctl start named-chroot
systemctl enable named-chroot

从节点 (10.0.7.2)

安装bind

yum -y install bind-libs bind-utils bind bind-chroot

配置/etc/named.conf

options {
    listen-on port 53 { any; };
    directory     "/var/named";
    dump-file     "data/cache_dump.db";
    statistics-file "data/named_stats.txt";
    memstatistics-file "data/named_mem_stats.txt";
    allow-query     { any; };
    //recursion:
    //作为授权域名服务器 no,作为一个递归DNS服务器 yes;
    recursion yes;
    pid-file "/run/named/named.pid";
    session-keyfile "/run/named/session.key";
    empty-zones-enable no;
};

logging {
  channel error_log {
    file "data/error_log" versions 10 size 10m;
    severity warning;
    print-category yes;
    print-severity yes;
    print-time yes;
  };
  channel query_log {
    file "data/query_log" versions 10 size 100m;
    severity info;
    print-category yes;
    print-severity yes;
    print-time yes;
  };
  category default {
    error_log;
  };
  category queries {
    query_log;
  };
};

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

配置/etc/named.rfc1912.zones

zone "xiaohou.com" IN {
        type slave;
        masters { 10.0.7.1; };
        file "slaves/xiaohou.com.zone";
        };
zone "7.0.10.in-addr.arpa" IN {
        type slave;
        masters { 10.0.7.1; };
        file "slaves/10.0.7.arpa.zone";
};

启动

systemctl start named
systemctl enable named

如果需要使用chroot启动

/usr/libexec/setup-named-chroot.sh  /var/named/chroot/ on
systemctl stop named
systemctl disable named
systemctl start named-chroot
systemctl enable named-chroot

子域授权

子域授权,是DNS的分布式的一种实现。在原有的zone上划出一个子域,并给新DNS服务器管理。如果有客户端请求解析在此区域中的域名,则只要找新的子DNS服务器,以便减轻主DNS的压力。

配置主服务器

首先在主域服务器添加子域:

vim /var/named/xiaohou.com.zone

$TTL 86400
$ORIGIN xiaohou.com.
@   IN  SOA     ns1.xiaohou.com. root.xiaohou.com. (
        2017031902  ;Serial
        3600        ;Refresh
        1800        ;Retry
        604800      ;Expire
        86400       ;Minimum TTL
)
        IN  NS      ns1.xiaohou.com.
        IN  NS      ns2.xiaohou.com.
        IN  MX  10  mx1
        IN  MX  20  mx2
ns1     IN  A   10.0.7.1
ns2     IN  A   10.0.7.2
@       IN  A   10.0.7.1
www     IN  A   10.0.7.2
mx1     IN  A   10.0.7.3
mx2     IN  A   10.0.7.4

blog     IN  NS      ns1.blog
ns1.blog IN  A       10.0.7.3

记得修改版本号,保证从服务器获取更新;

重新载入配置

rndc reload

配置子域服务器(10.0.7.3)

安装bind

yum -y install bind-libs bind-utils bind bind-chroot

配置/etc/named.conf

options {
    listen-on port 53 { any; };
    directory     "/var/named";
    dump-file     "data/cache_dump.db";
    statistics-file "data/named_stats.txt";
    memstatistics-file "data/named_mem_stats.txt";
    allow-query     { any; };
    //recursion:
    //作为授权域名服务器 no,作为一个递归DNS服务器 yes;
    recursion yes;
    pid-file "/run/named/named.pid";
    session-keyfile "/run/named/session.key";
    empty-zones-enable no;
};

logging {
  channel error_log {
    file "data/error_log" versions 10 size 10m;
    severity warning;
    print-category yes;
    print-severity yes;
    print-time yes;
  };
  channel query_log {
    file "data/query_log" versions 10 size 100m;
    severity info;
    print-category yes;
    print-severity yes;
    print-time yes;
  };
  category default {
    error_log;
  };
  category queries {
    query_log;
  };
};

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

配置/etc/named.rfc1912.zones

zone "blog.xiaohou.com" IN {
        type master;
        file "blog.xiaohou.com.zone";
        allow-update { none; };
        };

配置/var/named/blog.xiaohou.com.zone

$TTL 1D
$ORIGIN blog.xiaohou.com.
@   IN  SOA     ns1.blog.xiaohou.com. root.blog.xiaohou.com. (
        2017031901  ;Serial
        1H          ;Refresh
        10M         ;Retry
        3D          ;Expire
        1D          ;Minimum TTL
)

          IN  NS    ns1
          IN  NS    ns2
ns1       IN  A   10.0.7.3
ns2       IN  A   10.0.7.4
@         IN  A   10.0.7.5
www       IN  A   10.0.7.6
mx1       IN  A   10.0.7.7
mx2       IN  A   10.0.7.8

启动

/usr/libexec/setup-named-chroot.sh  /var/named/chroot/ on
systemctl stop named
systemctl disable named
systemctl start named-chroot
systemctl enable named-chroot

DNS转发

区域转发:

配置在zone段,仅转发对某特定区域的解析请求;

zone  "ZONE_NAME"  IN {
       type  forward;
       forward  first;
       forwarders { 223.5.5.5;223.6.6.6; };
};

forward选项:

  • first:首先转发;转发器不响应时,自行去迭代查询;
  • only:只转发;

全局转发:
配置在options段,针对凡本地没有通过zone定义的区域查询请求,通通转给某转发器;

vim /etc/named.conf

options {
     forward  only;
     forwarders  { SERVER_IP; };
};

全局转发(10.0.7.1)

vim /etc/named.conf
options {
        forward  first;
        forwarders  { 223.5.5.5;223.6.6.6; };
};

区域转发(10.0.7.3)

vim /etc/named.rfc1912.zones

zone  "xiaohou.com"  IN {
       type  forward;
       forward  only;
       forwarders { 10.0.7.1; };
};

访问控制ACL

把一个或多个地址归并为一个集合,并通过一个统一的名称调用;

acl acl_name {
     ip;
     net/perlen;
}

四个内置的acl:

  • none:没有一个主机
  • any:任意主机
  • local:本机
  • localnet: 本机的IP同掩码运算后得到的地址

注意: 只能先定义,后使用,通常放置在配置文件最前面

访问控制的指令:

  • allow-query{}: 允许查询的主机
  • allow-transfer{}: 允许区域传送
  • allow-recursion{}: 通常定义在全局options段,允许递归的主机
  • allow-update{}: 允许更新区域库的内容,大多数情况为none

配置acl实现访问控制,区域传送只允许slaves定义的主机,所有主机的查询操作都不被允许。

配置主服务器10.0.7.1

vim /etc/named.conf
acl slaves {
     10.0.7.2;
};

vim /etc/named.rfc1912.zones
zone "xiaohou.com" IN {
        type master;
        file "xiaohou.com.zone";
        allow-query { none; };
        allow-transfer { slaves; };
        allow-update { none; };
        };

配置允许递归的主机

vim /etc/named.conf
options {
        recursion yes;
        allow-recursion { 10.0.7.0/24; };
};

视图view

我们一般常用视图拿来构建智能DNS,一个bind服务器可以定义多个view,每个view中可以定义一个或多个zone,每个view用来匹配一组客户端。

  • view实现智能DNS:
    多个view内可能需要对同一区域进行解析,但使用不同通的区域解析文件;

注意: view依据的来源地址并不是客户端的最终地址,而是客户端上配置的DNS节点的地址,如果上海联通的用户配置了北京电信的DNS,那么可能就会被调度到电信节点

用法:

view view_name {
      match-clients { };
}

注意:
一旦启用了view,所有的zone都只能定义在view中;
仅在允许递归请求的客户端所在的view中定义根区域;
客户端请求到达时,自上而下对符合view的客户端列表进行匹配;

配置10.0.7.1主服务器,named.conf

vim  /etc/named.conf
acl slaves {
     10.0.7.2;
};
acl shanghai {
     10.0.7.2;
};
acl beijing {
     10.0.7.3;
};
acl office {
     10.0.0.0/16;
};
options {
    listen-on port 53 { any; };
    directory     "/var/named";
    dump-file     "data/cache_dump.db";
    statistics-file "data/named_stats.txt";
    memstatistics-file "data/named_mem_stats.txt";
    allow-query     { any; };
        //作为授权域名服务器 no;
        //作为一个递归DNS服务器 yes;
    recursion yes;
        allow-recursion { office; };
    pid-file "/run/named/named.pid";
    session-keyfile "/run/named/session.key";
        empty-zones-enable no;
        forwarders  { 223.5.5.5;223.6.6.6; };
};

logging {
  channel error_log {
    file "data/error_log" versions 10 size 10m;
    severity warning;
    print-category yes;
    print-severity yes;
    print-time yes;
  };
  channel query_log {
    file "data/query_log" versions 10 size 100m;
    severity info;
    print-category yes;
    print-severity yes;
    print-time yes;
  };
  category default {
    error_log;
  };
  category queries {
    query_log;
  };
};

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

配置10.0.7.1主服务器,named.rfc1912.zones

vim /etc/named.rfc1912.zones
view  shanghai {
      match-clients { shanghai; };
      zone "xiaohou.com" {
          type master;
          file "sh.xiaohou.com.zone";
      };
};

view  beijing {
      match-clients { beijing; };
      zone "xiaohou.com" {
           type master;
           file "bj.xiaohou.com.zone";
      };
};

view  office {
      match-clients { office; };
      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 "xiaohou.com" IN {
        type master;
        file "xiaohou.com.zone";
        allow-update { none; };
        allow-transfer { slaves; };
        allow-query { any; };
    };
    zone "7.0.10.in-addr.arpa" IN {
    type master;
    file "10.0.7.arpa.zone";
    allow-update { none; };
    };
};

区域配置文件,sh.xiaohou.com.zone

vim  /var/named/sh.xiaohou.com.zone
$TTL 86400
$ORIGIN xiaohou.com.
@   IN  SOA     ns1.xiaohou.com. root.xiaohou.com. (
        2017031902  ;Serial
        3600        ;Refresh
        1800        ;Retry
        604800      ;Expire
        86400       ;Minimum TTL
)
        IN  NS      ns1.xiaohou.com.
        IN  NS      ns2.xiaohou.com.
        IN  MX  10  mx1
        IN  MX  20  mx2
ns1     IN  A   10.0.7.1
ns2     IN  A   10.0.7.2
@       IN  A   10.0.7.1
www     IN  A   10.0.7.2
mx1     IN  A   10.0.7.3
mx2     IN  A   10.0.7.4

blog     IN  NS      ns1.blog
ns1.blog IN  A       10.0.7.3

区域配置文件

vim /var/named/bj.xiaohou.com.zone
$TTL 86400
$ORIGIN xiaohou.com.
@   IN  SOA     ns1.xiaohou.com. root.xiaohou.com. (
        2017031902  ;Serial
        3600        ;Refresh
        1800        ;Retry
        604800      ;Expire
        86400       ;Minimum TTL
)
        IN  NS      ns1.xiaohou.com.
        IN  NS      ns2.xiaohou.com.
        IN  MX  10  mx1
        IN  MX  20  mx2
ns1     IN  A   10.0.7.1
ns2     IN  A   10.0.7.2
@       IN  A   172.16.1.17
www     IN  A   172.16.1.18
mx1     IN  A   172.16.1.19
mx2     IN  A   172.16.1.20

blog     IN  NS      ns1.blog
ns1.blog IN  A       10.0.7.3

如何分析用户是移动还是联通,北京还是上海?
答:我们可以使用纯真IP数据库进行解析。

DNS客户端工具使用

dig

用法

 dig [-t type] [@server] [domain] +[no]trace

示例:

dig -t A @10.0.7.1 www.xiaohou.com
dig -t NS @10.0.7.1 www.xiaohou.com
#跟踪解析过程
dig -t A @10.0.7.1 www.biadu.com +trace
#反向解析
dig -x 10.0.7.3 @10.0.7.1
模拟完全区域传送:
dig -t axfr @10.0.7.2 xiaohou.com

rndc

rndc监听于tcp的953端口,用于管理员对dns服务器进行控制

[root@node2 ~]# rndc status
#服务器和软件的版本
version: 9.9.4-RedHat-9.9.4-38.el7_3.2 <id:8f9657aa>
#cpu数量
CPUs found: 2
#工作线程数
worker threads: 2
#upd监听的端口个数
UDP listeners per interface: 2
#zone的个数
number of zones: 8
#debug的级别
debug level: 0
#区域传送
xfers running: 0
xfers deferred: 0
#soa的查询情况
soa queries in progress: 0
#查询日志是否启用
query logging is ON
#递归的客户端
recursive clients: 0/0/1000
#tcp 客户端
tcp clients: 0/100
#服务是否正常
server is up and running


其他选项
reload                             重新装入配置文件和区域
reload zone [class [view]]         重新装入单个区域
refresh zone [class [view]]        安排区域的立即维护
reconfig               仅重新装入配置文件和新区域
stats                  将服务器统计信息写入统计文件中
querylog               切换查询日志
dumpdb                 将高速缓存转储到转储文件 (named_dump.db)
stop                   将暂挂更新保存到主文件并停止服务器
halt                   停止服务器,但不保存暂挂更新
trace                  将调试级别增加一级
trace level            更改调试级别
notrace                将调试级别设置为 0
flush                  刷新服务器的所有高速缓存
flush [view]           为某一视图刷新服务器的高速缓存
status                 显示服务器的状态
restart                重新启动服务器(尚未实现)

bind压测工具

wget ftp://ftp.isc.org/isc/bind9/9.11.0-P3/bind-9.11.0-P3.tar.gz
tar xf bind-9.11.0-P3.tar.gz
cd bind-9.11.0-P3/contrib/queryperf/
./configure && make

编写测试文件

vim  testdns.txt
www.baidu.com A
www.qq.com A
www.xiaohou.com A
www.sina.com A
www.youku.com A
www.aliyun.com A

测试结果

[root@node1 queryperf]# ./queryperf -d testdns.txt  -s 10.0.7.1

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 10.0.7.1)
[Timeout] Query timed out: msg id 1
[Timeout] Query timed out: msg id 4
[Timeout] Query timed out: msg id 5
[Timeout] Query timed out: msg id 6
[Status] Testing complete

Statistics:

  Parse input file:     once
  Ended due to:         reaching end of file

  Queries sent:         6 queries
  Queries completed:    6 queries
  Queries lost:         0 queries
  Queries delayed(?):   0 queries

  RTT max:             4.270617 sec
  RTT min:              0.067555 sec
  RTT average:          2.169086 sec
  RTT std deviation:    2.101550 sec
  RTT out of range:     0 queries

  Percentage completed: 100.00%
  Percentage lost:        0.00%

  Started at:           Tue Mar 21 23:56:27 2017
  Finished at:          Tue Mar 21 23:56:32 2017
  Ran for:              5.000125 seconds

  Queries per second:   1.199970 qps

其他详细的配置可以查看:Bind9 管理员参考手册

DNS监控

  • 系统监控:
    CPU,内存,网络IO等监控
  • named进程监控:
    判断named进程是否正常运行
  • 解析服务监控:
    使用dig命令进行解析,监控
原文地址:https://www.cnblogs.com/linuxops/p/6597648.html