0x01 前言

局域网最好能有一个dns 缓存,尤其是一个大家庭或者是企业网络。dns 缓存能有效降低对外网的依赖程度,同时也能配置用于企业内部域名的解析。

我在家里用bind 建立dns 缓存的同时也将t.com 这个域名划为局域网内使用,例如:

  1. server.t.com 这域名通过A 记录指向主服务器
  2. base.t.com 这个域名通过A 记录指向运行主要服务的虚拟服务器
  3. dlna.t.com这个域名通过A 记录指向plex 虚拟媒体服务器
  4. web.t.com 这个域名通过A 记录指向虚拟网站服务器
  5. wp1.t.com 这个域名通过CNAME 记录指向web.t.com 用于测试
  6. … …

0x02 安装

安装很简单,通过一行命令即可安装完成:

yum install bind -y

0x03 配置named.conf

options {

#IPv4 监听的端口,默认为53
        listen-on port 53 { any; };

#IPv6 监听的端口,默认为53 ,我网络并不支持IPv6 ,所以我把它注释掉
//      listen-on-v6 port 53 { ::1; };

#工作文件夹
        directory       "/var/named";

#通过rndc dumpdb 导出数据时的文件保存路径
        dump-file       "/var/named/data/cache_dump.db";

#使用rndc stats 时文件保存的路径
        statistics-file "/var/named/data/named_stats.txt";

#这个文件记录着内存使用值
        memstatistics-file "/var/named/data/named_mem_stats.txt";

#允许查询DNS 记录的ip 地址,请根据需要修改ip ,例如:
##10.0.0.0/8 ,10.1.1.0/24 等
        allow-query     { any; };

#指定允许那些主机能从缓存中获取DNS 记录
        allow-query-cache       { any; };

#转发,只在存在转发器forwarders 信息时有效:
##only 仅会查询转发器forwarders 里的DNS服务器,如果都没有返回有效值则给用户返还无DNS 记录;
##first 则先查询转发器forwarders 内的DNS 服务器,如果都没返还有效值,则查询根服务器
        forward only;

#转发器,定义DNS 服务器
        forwarders {
                        #DNSpod
                        119.29.29.29;

                        #CNNIC SDNS ,平常我回把这个注释掉
                        1.2.4.8;

                        #阿里DNS
                        223.5.5.5;

                        #阿里DNS
                        223.6.6.6

                        #百度 BaiduDNS ,平常我回把这个注释掉
                        180.76.76.76;

                        #114 DNS
                        114.114.114.114;

                        #114 DNS
                        114.114.115.115; 
        };

#如果你在建立已注册的权威DNS 服务器,请将recursion 设为no ;如果作为缓存服务器,请设为yes
        recursion yes;

#dnssec-enable 的默认值为yes ,因为国内的DNS 服务器目前都不支持dnssec 所以关闭它
        dnssec-enable no;

#dnssec-enable 的默认值为yes ,因为国内的DNS 服务器目前都不支持dnssec 所以关闭它
        dnssec-validation no;

        /* Path to ISC DLV key */
        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 {
        type hint;
        file "named.ca";
};

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

当设置完forward 和forwarders 就已经可以使用这个DNS 缓存服务器了。DNS 信息的保存时间会根据实际域名的TTL 来保存,例如:

; <<>> DiG 9.8.3-P1 <<>> proj.org.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14045
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;proj.org.cn.			IN	A

;; ANSWER SECTION:
proj.org.cn.		3600	IN	CNAME	hk1.odin.org.cn.
hk1.odin.org.cn.	811	IN	A	103.231.253.45

;; Query time: 111 msec
;; SERVER: 192.168.199.1#53(192.168.199.1)
;; WHEN: Sat Jun 25 16:23:01 2016
;; MSG SIZE  rcvd: 68

我的域名proj.org.cn 的TTL 是3600,那么在有效期内,局域网无论有多少个人访问我的域名都会从DNS 服务器的缓存中获取DNS 记录;

如果我域名的TTL 到期了,那么到期后第一个访问我域名的人(A)向DNS 服务器请求DNS 记录的同时,DNS 服务器回将请求转发到转发器forwarders 内设定的DNS服务器,转发器返还纪录后DNS 服务器会将记录在本地保存着并将记录返还给A 。

0x03.1 启动

#启动bind 服务器
systemctl start named

#将bind 服务器设为开机启动
systemctl enable named

如果你还需要在局域网内设定DNS 记录,请继续往下看。

0x04 设定区域

请在named.conf 的最后增加以下内容:

#增加此行
include "/etc/named/named.conf.local";

我局域网的网段是10.1.1.0/24 并且我在局域网内使用的域名是t.com

新建并修改/etc/named/named.conf.local

#这个区域记录着t.com 的DNS 信息
#zone 区域
#"t.com" 域名
#IN 查询类别,IN for internet
#type 区域类型,这里是master ,意味着这台服务器可以为其他服务器提供这个域名的权威应答
#file 定义纪录文件的路径
zone "t.com" IN {
        type master;
        file "/etc/named/zones/db.t.com";
};

#这个区域记录着10.1.0.0/16 这个网段的PTR(反向解析) 信息
zone "1.10.in-addr.arpa" IN {
        type master;
        file "/etc/named/zones/db.1.10";
};

0x05 添加DNS 记录

新建并修改文件:/etc/named/zones/db.t.com

#因为这是局域网内使用的,所以我将TTL 都设置为60,以便随时更新DNS 记录与快速生效

######以下内容请更格式添加######
$TTL 60
@       IN      SOA     ns1.t.com. admin.t.com. (
        1       ; Serial
        60      ; Refresh
        60      ; Retry
        60      ; Expire
        60      ; Negative Cache TTL
)
;name servers - NS records
@       IN      NS      ns1.t.com.

;name servers - A records
ns1      IN      A       10.1.1.2

######以上内容请更格式添加######


;10.1.1.0/24 - A records
hiwifi   IN      A       10.1.1.1
base     IN      A       10.1.1.2
ilo      IN      A       10.1.1.10
server   IN      A       10.1.1.11
nas      IN      A       10.1.1.12
codex    IN      A       10.1.1.13
2012     IN      A       10.1.1.14
netcam   IN      A       10.1.1.30
dlna     IN      A       10.1.1.31
sql      IN      CNAME   codex.t.com.
ftp      IN      CNAME   base.t.com.
radius   IN      A       10.1.1.3
;;
wp1      IN      CNAME   codex.t.com.
wp2      IN      CNAME   codex.t.com.
wp3      IN      CNAME   codex.t.com.

如果纪录文件中存在完整的域名,例如上面的CNAME 记录,需要在域名最后加上一个半格字符”.” ,以此来声明这是个根域。

0x06 添加PTR 记录

$TTL 60
@       IN      SOA     ns1.t.com.      admin.t.com. (
        1       ; Serial
        60      ; Refresh
        60      ; Retry
        60      ; Expire
        6       ; Negative Cache TTL
)

;name servers
@       IN      NS      ns1.t.com.
@       IN      PTR     dns.t.com.

;PRT records
1.1     IN      PTR     hiwifi.t.com.
2.1     IN      PTR     base.t.com.
10.1    IN      PTR     ilo.t.com.
11.1    IN      PTR     server.t.com.
12.1    IN      PTR     nas.t.com.
13.1    IN      PTR     codex.t.com.
14.1    IN      PTR     2012.t.com.
30.1    IN      PTR     netcam.t.com.
31.1    IN      PTR     dlna.t.com.
3.1     IN      PTR     radius.t.com.

这里有点特殊的是,ip 地址需要倒过来。

0x06.1 启动

#启动bind 服务器
systemctl start named

#将bind 服务器设为开机启动
systemctl enable named

0x07 结语

bind 还有许多有趣的特性和功能,有时间我会多写几篇关于bind 的文章。

如果你想搭建在公网环境下使用的DNS 服务器,请做好防护工作。有问题可以给我留言或给我发邮件。