域名系统 – 使用BIND搭建主备DNS服务

DNS(Domain Name System)域名系统提供域名与IP相互映射关系的服务,方便通过域名访问主机。BIND(Berkeley Internet Name Daemon)是一款DNS服务器软件。

安装

CentOS:

yum install -y bind bind-utils bind-chroot

Ubuntu:

apt-get install -y bind9

配置

如果想实现name1.abc.com -> 172.31.32.100,name2.abc.com -> 172.31.32.101这样的域名IP映射,需要两步:一,在核心配置文件named.conf中增加域abc.com;二,在这个域对应的配置文件中增加name1、name2与IP的映射关系。除了这样的域名到IP的正向解析外,还可以实现IP到域名的反向解析。

修改配置文件后需要重启服务生效,相关命令如下:

# centos7
systemctl start named
systemctl enable named
systemctl status named
# ubuntu
/etc/init.d/bind9 restart
systemctl start bind9

核心配置文件named.conf

named.conf在centos中位于/etc目录下,在ubuntu中位于/etc/bind目录下。文件内容中常见的指令标签如下:

  • options:全局的配置,一些参数可以在zone中重写使局部配置与全局不同。
  • logging:日志相关。
  • zone:域,隔离一批映射关系的基本单元。
  • include:用于引用其他配置。

通常只需要修改options和新增zone就够了,举例如下:

options {
        listen-on port 53 { 172.31.0.0/16; };          //监听端口53,允许来自172.31.0.0/16的访问,任意用any
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";                                 //工作目录,即根目录,zone里用相对路径时的父目录,注意centos的目录所属是named:named,ubuntu是bind:bind
        dump-file       "/var/named/data/cache_dump.db";              //命令rndc dumpdb会把数据保存到该文件
        statistics-file "/var/named/data/named_stats.txt";            //命令rndc stats会把统计数据保存到该文件
        memstatistics-file "/var/named/data/named_mem_stats.txt";     //内存使用数据记录到该文件

        allow-query     { 172.31.0.0/16; };       //允许来自172.31.0.0/16的dns查询,任意用any
        recursion yes;                            //开启递归查询
        allow-recursion { 172.31.0.0/16; };       //允许来自172.31.0.0/16的递归查询
        forward first;                            //接收到查询请求时,会先转发到forwarders指定的DNS,查不到再执行递归,转发前会先查本地缓存
        forwarders {
                 198.18.96.10;
                 198.18.96.11;
        };

        dnssec-enable no;                         //forward不通时可以设置为no再试试
        dnssec-validation no;
        dnssec-lookaside no;
        bindkeys-file "/etc/named.iscdlv.key";
        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

logging {             //日志
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {         //设置root zone
        type hint;
        file "named.ca";
};

zone "monsters.com" IN {           //自定义正向zone(域名 -> IP)
        type master;                                  //指定该域DNS是主
        file "/etc/named/monsters.com.zone";          //指定该域的配置文件,可以是相对路径,参考options的directory
        allow-transfer { 172.31.48.3; };              //允许来自172.31.48.3的从dns服务器
        notify yes;                                   //当主DNS更新时立即通知从DNS
        allow-query { 172.31.0.0/16;172.17.0.0/16; };               //允许来自172.31.0.0/16的dns查询,任意用any,覆盖options的allow-query
};

zone "0.31.172.in-addr.arpa" IN {       //自定义反向zone(IP -> 域名)
        type master;
        file "172.31.0.zone";
        notify yes;
        allow-transfer { 172.31.48.3; };
};

include "/etc/named.rfc1912.zones";        //包含的其他配置文件
include "/etc/named.root.key";

域(zone)配置文件

这个文件就是上面zone里面指定的文件。分号“;”用作注释标识符。

正向解析区域配置文件/etc/named/monsters.com.zone:

; $TTL表示time to live值,表示当其它DNS查询到本zone的DNS记录时,这个记录能在它的DNS缓存中存在多久,单位秒。
$TTL 86400
; $ORIGIN那里填域名。下面的@符号会引用这里填写的值。如果不填,则会引用主配置文件中zone语句后面的值。
$ORIGIN monsters.com.

;SOA后面的两个参数分别是主DNS服务器主机名和管理者邮箱(root@localhost.com)。因为@符号有特殊含义,所以用“.”。
@       IN      SOA     localhost. root.localhost.com. (
                     2016121201         ; Serial  每次修改配置文件都要+1,用于同步的时间戳。
                          86400         ; Refresh  刷新频率,表示slave隔多久会跟master比对一次配置文件,单位秒,也可以用1D
                            300         ; Retry   失败重新尝试时间,单位秒,也可以用5M
                         604800         ; Expire  失效时间,单位秒,也可以用1W
                           3600 )       ; Negative Cache TTL  其它DNS服务器能缓存negative answers的时间,单位秒,也可以用1H

; 类型NS定义指定域的DNS服务器主机名。
; 类型A定义指定主机IP地址。如果是使用的IPv6地址,则需使用类型AAAA。
; 类型MX定义指定域的邮件服务器主机名。MX后面的数字为优先级,越小越优先。同样的优先级值则可以在多台邮件服务器之间进行负载分担。
@       IN      NS      localhost.
@       IN      A       127.0.0.1
@       IN      AAAA    ::1
@       IN      MX    10     mail1.monsters.com.
        IN      MX    20     mail2.monsters.com.

; 同一域名可以指定多个IP。
test       IN      A       192.168.0.11
test       IN      A       192.168.0.12

; DNS for Postgres-XL
pgxl-gtm-m        IN    A    172.31.32.153
pgxl-gtm-s        IN    A    172.31.32.154
pgxl-gtm-pxy-1    IN    A    172.31.32.151
pgxl-gtm-pxy-2    IN    A    172.31.32.152
pgxl-gtm-pxy-3    IN    A    172.31.32.153
pgxl-gtm-pxy-4    IN    A    172.31.32.154
pgxl-coord-1      IN    A    172.31.32.151
pgxl-coord-2      IN    A    172.31.32.152
pgxl-coord-3      IN    A    172.31.32.153
pgxl-coord-4      IN    A    172.31.32.154
pgxl-dn-1         IN    A    172.31.32.151
pgxl-dn-2         IN    A    172.31.32.152
pgxl-dn-s-1       IN    A    172.31.32.153
pgxl-dn-s-2       IN    A    172.31.32.154

反向解析区域配置文件/var/named/172.31.32.zone:

$TTL 600
$ORIGIN 32.31.172.in-addr.arpa.
@      IN      SOA     monsters.com.  root.monsters.com. (
                        2014121005
                        1D
                        5M
                        1W
                        1H)
@      IN      NS         ns1.monsters.com.
@      IN      NS         ns2.monsters.com.
       IN      MX    5    mail.monsters.com.

153      IN      PTR     pgxl-gtm-m.monsters.com.
154      IN      PTR     pgxl-gtm-s.monsters.com.

从DNS服务

如果只有一台主DNS提供服务很容易造成单点故障,因此客户端需要有跟主的DNS解析完全一样的备用DNS,这个备用DNS可以是与主同步的从DNS服务器。BIND支持主从模式,从DNS服务的配置相对简单,不需要zone配置文件,因为它是通过主从同步过来的。与主的差别仅在于核心配置named.conf中的zone。

zone "monsters.com" IN {
       type slave;                                    //指明本服务器是这个域的从DNS服务器
       file "slaves/monsters.com.zone";               //从DNS的zone配置文件一定要放置在工作目录下的slaves目录中
       masters { 172.31.48.2; };                      //指定这个域的主DNS服务器的IP
       allow-notify { 172.31.48.2; };                 //指定允许notify的主机IP
       allow-query { 172.31.0.0/16;172.17.0.0/16; };
};
zone "0.168.192.in-addr.arpa" IN{
           type slave;
           file "slaves/192.168.0.zone";
           masters { 192.168.0.103; };
           allow-notify {192.168.0.103; };
};

如果启动出现dumping master file: slaves/tmp-xxxxx: open: permission denied错误,参考这里。CentOS修改/etc/sysconfig/named增加ENABLE_ZONE_WRITE=yes,Ubuntu根据/etc/apparmor.d/usr.sbin.named文件中的提示修改相关路径权限或将slaves目录放到指定路径下。

使用DNS服务

其他需要使用DNS服务的主机可以通过修改/etc/resolv.conf文件来实现,增加nameserver即可,内容如下:

nameserver 172.31.48.2
nameserver 172.31.48.3

测试方法

ping pgxl-gtm-m.monsters.com
dig pgxl-coord-1.monsters.com
dig @172.31.48.2 pgxl-dn-2.monsters.com
Creative Commons License

本文基于署名-非商业性使用-相同方式共享 4.0许可协议发布,欢迎转载、使用、重新发布,但请保留文章署名wanghengbin(包含链接:https://wanghengbin.com),不得用于商业目的,基于本文修改后的作品请以相同的许可发布。

发表评论