BIND 软件的组成

bash
安装包
bind            # bind 的主程序包
bind-utils        # bind 的工具包
  • BIND 主程序:/usr/sbin/named

  • 服务脚本和 Unit 名称:/etc/rc.d/init.d/named,/usr/lib/systemd/system/named.service

  • 主配置文件:/etc/named.conf, /etc/named.rfc1912.zones, /etc/rndc.key

  • 管理工具:/usr/sbin/rndc:remote name domain controller,默认与bind安装在同一主机,且 只能通过127.0.0.1连接named进程,提供辅助性的管理功能;953/tcp

  • 解析库文件:/var/named/ZONE_NAME.ZONE

    注意:

    (1) 一台物理服务器可同时为多个区域提供解析

    (2) 必须要有根区域文件;named.ca:该文件中定义的是全球 13 个根的地址

    (3) 应该有两个(如果包括ipv6的,应该更多)实现 localhost 和本地回环地址的解析库

主配置文件 named.conf

bash
options {
    listen-on port 53 { localhost; };        # 定义了监听本地的地址和端口,localhost 关键字表示监听本服务器的所有
                                        # { 172.16.1.16;119.110.120.1; }; 可以监听多个地址
                                        注意:最好是不要指定单独的 IP 进行监听,因为这样指定容错性太差
    listen-on-v6 port 53 { ::1; };            # IPv6 的监听
    directory     "/var/named";                # 区域解析文件的位置
    dump-file     "/var/named/data/cache_dump.db";
    statistics-file "/var/named/data/named_stats.txt";
    memstatistics-file "/var/named/data/named_mem_stats.txt";
    recursing-file  "/var/named/data/named.recursing";
    secroots-file   "/var/named/data/named.secroots";
    allow-query     { localhost; };            # 允许解析或者同步的主机地址
                                        # { 172.16.1.0/24;192.168.1.0/8; } 可以指定网段
                                        # { any; } 该关键字是允许所有的主机进行解析
    recursion yes;

    dnssec-enable yes;            # 对域名进行签名,保障安全
    dnssec-validation yes;        # 保障安全,如果开启同步时可能会出错
    
    bindkeys-file "/etc/named.root.key";

    managed-keys-directory "/var/named/dynamic";
    
    pid-file "/run/named/named.pid";        # pid 文件的存放位置
    session-keyfile "/run/named/session.key";        # 会话密钥存放位置
};
logging {            # 启动日志存放位置
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
zone "." IN {            # 定义根域 "." 的地址,通过 named.ca 来指定
    type hint;
    file "named.ca";
};
include "/etc/named.rfc1912.zones";         # 区域解析的数据库,指定包含文件
include "/etc/named.root.key";
  • 全局配置:options {};

  • 日志子系统配置:logging {};

  • 区域定义:本机能够为哪些 zone 进行解析,就要定义哪些 zone

    zone “ZONE_NAME” IN {};

注意:

  • 任何服务程序如果期望其能够通过网络被其它主机访问,至少应该监听在一个能与外部主机通信的 IP地址上
  • 缓存名称服务器的配置:监听外部地址即可
  • dnssec: 建议关闭dnssec,设为no

区域解析数据库 *.zone

区域资源类型详见 《DNS 理论知识》

bash
# @ 引用当前区域的域名
$TTL 1D        #  定义的缓存生命周期,1D 代表 1 天,TTL 可以在 A 记录中体现 "www TTL A 127.0.0.1"
@    IN SOA    @ rname.invalid. (        # 第一个 @ 代表管理的是当前域名
                                  # 第二个 @ 维护当前域的域名是什么(管理员的域 FQDN),如果是 www.dingchen.local ,那么来维护 dingchen.local. 这个域名的主机就是 www,同时要加上 A 记录 www.dingchen.local.
                                  # rname.invalid. 代表要管理员邮箱
                                  #! 注意:如果没有使用 . 来结束后缀,那么系统将会自动补后缀
                    0    ; serial        # 序列号,主从同步的根据,起始为 1,每次更新都要递增
                    1D    ; refresh        # 刷新时间间隔,从服务器的拉操作时间间隔,
                                    # 对比的是序列号,当你的区域解析数据库的内容改变,但是序列号没有变的话,那么从服务器依然不会同步内容
                    1H    ; retry            # 重试时间间隔,当失败后重试的间隔
                    1W    ; expire        # 从服务器多长时间联系不到主服务器就会过期的过期时长,如果定义的时间内从服务器没有连接上主服务器,那么从服务器就会停止服务
                    3H )    ; minimum        # 当客户端访问时,如果访问不存在的域名,服务器会缓存下来,当客户端下次再次访问时就会直接告诉客户端错误。SOA 权威声明到此结束
    NS    @
    A    127.0.0.1
    AAAA    ::1

区域解析文件 named.rfc1912.zones

bash
zone "localhost.localdomain" IN {        # 定义解析的域名
    type master;        # 定义类型 slave 或 master
    file "named.localhost";    # 定义区域解析数据库的位置
    allow-update { none; };    # 允许连接主机
};

BIND 检查工具

named-checkconf 查看 named.conf/rfc 文件的语法

bash
[root@centos7 named]# named-checkconf 
/etc/named.conf:12: unknown option 'ions'
/etc/named.rfc1912.zones:13: unknown option 'e'

named-checkzone 查看区域解析数据库的语法

bash
[root@centos7 named]# named-checkzone www.dingchen.local dingchen.local.zone 
zone www.dingchen.local/IN: loaded serial 1
OK

案例

通过 DNS 实现负载均衡

bash
这样的 DNS 解析也可以通过在阿里云上设置 DNS 线路解析,来提高不同运营商访问时的速度。
bash
实验目的:
现有三台主机
    100.0.0.10 100.0.0.104 100.0.0.106
    100.0.0.10 负责 DNS 转发,DNS Server
    100.0.0.104 负责 web 响应
    100.0.0.106 负责 web 响应

最终目标
    实现访问时两台 web 响应的主机可以对用户的请求进行分流,分开处理用户的请求
bash
实验步骤
1. 修改 named.conf 文件
    allow-query     { any; };
     listen-on port 53 { localhost; };
2. 修改 zone 文件
    $TTL 1D
    @     IN  SOA  ns1.dingchen.local.  dingchen.mail.   ( 1 1D 1H 1H 3H )
                        IN   NS    ns1
    ns1                 IN    A    100.0.0.18
    www                 IN    CNAME wwwsrc        # 定义 CNAME 的名称
    wwwsrc              IN    A    100.0.0.104    # 将别名针对多个映射 A 主机记录
    wwwsrc              IN    A    100.0.0.106
3. 修改 named.rfc1912.zones
zone "dingchen.local" IN {
        type master;
        file "dingchen.local.zone";
        allow-update { none; };
};
bash
[root@centos7 named]# curl www.dingchen.local
host:100.0.0.106
[root@centos7 named]# curl www.dingchen.local
host:100.0.0.104

域名优化(泛域名/直接访问域名)

txt
最终目标
访问一个域名时,不会根据主机名来访问同样可以访问到该网页(泛域名实现目标)
bash
`继上面的内容`
`修改 zone 文件`
[root@centos7 named]# cat dingchen.local.zone 
$TTL 1D
@     IN  SOA  ns1.dingchen.local.  dingchen.mail.   ( 1 1D 1H 1H 3H )
            IN   NS    ns1
ns1            IN    A    100.0.0.18
www            IN    CNAME wwwsrc
wwwsrc              IN    A    100.0.0.104
*            IN    A    100.0.0.104            # 添加 * 的 A 记录
wwwsrc              IN    A    100.0.0.106
dingchen.local.     IN    A    100.0.0.106    # 添加域名的 A 记录
@                   IN    A    100.0.0.106    # @ 是通过主机名访问的第二种方式,因为 @ 代表的就是当前解析的域名
bash
`访问结果`
[root@centos7 named]# curl asdwww.dingchen.local
host:100.0.0.104
[root@centos7 named]# curl dingchen.local
host:100.0.0.106

邮件服务器的 DNS 指定

bash
指定邮件服务器时需要指定优先级
bash
`实现方式`
1. 修改 zone 文件

$TTL 1D
@     IN  SOA  ns1.dingchen.local.  dingchen.mail.   ( 1 1D 1H 1H 3H )
            IN   NS    ns1
ns1            IN    A    100.0.0.18
dingchen.local.     IN    MX 10 mailsrc        # 通过 MX 指定
dingchen.local.     IN    MX 20 mailsrc2
mailsrc             IN    A     100.0.0.1    # 指定 MX 解析主机名的 A 记录
mailsrc2            IN    A     100.0.0.2
bash
[root@centos7 named]# dig -t mx dingchen.local
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 4

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;dingchen.local.            IN    MX

;; ANSWER SECTION:
dingchen.local.        86400    IN    MX    20 mailsrc2.dingchen.local.
dingchen.local.        86400    IN    MX    10 mailsrc.dingchen.local.

反向解析实现

txt
反向解析的原理
例如避免垃圾邮件:当服务器接收到垃圾邮件后首先会通过反向解析,解析出对方的邮箱的 HELLO 域名,然后与邮箱服务器的 HELLO 域名对比,判断是否是一个垃圾邮件,如果是一个垃圾邮件,那么将会拒绝,如果不是则会接收。
bash
`实现步骤`
1. 创建反向区域数据库文件
2. 编辑 named.rfc1912.zones 中的反向区域解析
3. 解析测试
bash
`1. 创建反向区域数据库文件`
[root@centos7 named]# cp -p named.loopback 0.0.100.zone
[root@centos7 named]# cat 0.0.100.zone 
$TTL 1D
@    IN SOA    ns1.dingchen.local. admin.dingchen.mail. (
                    0    ; serial
                    1D    ; refresh
                    1H    ; retry
                    1W    ; expire
                    3H )    ; minimum
    NS    ns1.dingchen.local.
100    PTR    www.dingchen.local.
24    PTR    hehe.dingchen.local.
bash
`2. 编辑 named.rfc1912.zones 中的反向区域解析`
[root@centos7 named]# vim /etc/named.rfc1912.zones 
zone "0.0.100.in-addr.arpa" IN {
        type master;
        file "0.0.100.zone";
        allow-update { none; };
};
bash
`3. 解析测试`
[root@centos7 named]# nslookup 100.0.0.100
100.0.0.100.in-addr.arpa    name = www.dingchen.local.



[root@centos7 named]# host 100.0.0.24
24.0.0.100.in-addr.arpa domain name pointer hehe.dingchen.local.



[root@centos7 named]# dig -x 100.0.0.100

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> -x 100.0.0.100
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55243
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;100.0.0.100.in-addr.arpa.    IN    PTR

;; ANSWER SECTION:
100.0.0.100.in-addr.arpa. 86400    IN    PTR    www.dingchen.local.

;; AUTHORITY SECTION:
0.0.100.in-addr.arpa.    86400    IN    NS    ns1.dingchen.local.

;; ADDITIONAL SECTION:
ns1.dingchen.local.    86400    IN    A    100.0.0.18

;; Query time: 0 msec
;; SERVER: 100.0.0.10#53(100.0.0.10)
;; WHEN: Sat Sep 12 20:38:30 EDT 2020
;; MSG SIZE  rcvd: 119

主从服务器实现

bash
主从服务器可以实现备份的功能,当主服务器发生故障时,从服务器会顶替主服务器从事主服务器的工作,两个服务器依据区域数据库文件中的序列号进行同步

主从服务器的时间必须同步,可以使用 ntp 

`动作分类`
-0 推 push    如果主服务器的区域数据库发生变化(依据序列号)会将区域数据库文件推向从服务器
-0 拉 post    当区域数据库文件中的 fresh 时间到达时那么从服务器就会产生拉的操作,将主服务器的区域数据库文件拉取的本地,如果序列号变化的话
bash
`实验目标`
现有 100.0.0.10 100.0.0.104 两台主机
`实现结果`
100.0.0.10 master dns server
100.0.0.104 slave dns server
`安全目标`
实现其他主机如果使用从服务器进行拉取区域数据库文件是拉去不到的
bash
`实验步骤`
1. 修改从服务器 named.rfc1912.zones 文件,配置为从
2. 关闭 dns 的安全策略
3. 重启服务查看同步内容
bash
`1. 修改从服务器 named.rfc1912.zones 文件,配置为从`
[root@centos7 ~]# vim /etc/named.rfc1912.zones
zone "dingchen.local" IN {
        type slave;            # 模式为 slave
        file "slaves/dingchen.local.slave";    # 将文件存储的位置
        masters { 100.0.0.10; };    # 指向 master 的 IP 
};
bash
`2. 关闭 dns 的安全策略`
# 必须改为 no,如果注销或者是删除默认为 yes
vim /etc/named.conf
        dnssec-enable no;
        dnssec-validation no;
bash
`3. 重启服务查看同步内容`
[root@centos7 ~]# rndc reload
server reload successful
[root@centos7 ~]# ll /var/named/slaves/
total 4
-rw-r--r--. 1 named named 621 Sep 12 20:51 dingchen.local.slave
主从同步的安全问题
DNS 开启后,任何人都可以设置一台从服务器,未经主服务器允许就可以成为主服务器的从服务器,并且可以同步区域数据库文件,为了避免这种情况发生,那么就需要在主服务器指定从服务器的 IP 地址,然后在从服务器设置任何人不可以同步,即可避免这种情况发生。
一般是一主带多从,不会是一主从带从

版本应该一致,否则应该是从高,主低

`优化步骤`
1. 设置主服务器主配置文件指定从服务器
2. 设置从服务器不可以被同步
3. 在主服务器添加从服务器的 NS 解析记录
`1. 设置主服务器主配置文件指定从服务器`
vim /etc/named.conf
添加:     allow-transfer { 100.0.0.104; };

`2. 设置从服务器不可以被同步`
添加:     allow-transfer  { none; };

`3. 在主服务器添加从服务器的 NS 解析记录`
[root@centos7 named]# vim /var/named/dingchen.local.zone 
                    IN   NS    ns2
ns2                 IN    A    100.0.0.104
注意:多次同步需要更改序列号,依次增大

子域与父域

子域的介绍

互联网上就是层层包含的关系,"." 包含 .com 特级域名包含二级域名,并且二级域名是特级域名的子域,且特级域是二级域名的父域
应用场景,当北京公司在上海有分公司,但是上海的分公司不归属于北京公司来管,只是加盟,自己有自己的 DNS 服务器,那么就需要使用父域包含子域的方式来包含上海公司。

父域服务器搭建子域

`实验环境`
100.0.0.6  客户端
100.0.0.10    父域
父域的 web 服务器 100.0.0.104
父域中子域 web 服务器 100.0.0.106
`实现步骤`
1. 配置主域的域名解析数据库,定义子域的 NS 以及子域的 A 记录
2. 配置子域的域名解析数据库,为子域配置 named.rfc1912.zones
3. 解析测试
`1. 配置主域的域名解析数据库,定义子域的 NS 以及子域的 A 记录`
[root@centos7 named]# cat dingchen.local.zone 
$TTL 1D
@     IN  SOA  ns1.dingchen.local.  dingchen.mail.   ( 3 1D 1H 1H 3H )
                    IN   NS    ns1
bj                  IN   NS    ns3
ns3                 IN   NS    100.0.0.10
`2. 配置子域的域名解析数据库,为子域配置 named.rfc1912.zones`
[root@centos7 named]# cat bj.dingchen.local.zone 
$TTL 1D
@    IN    SOA    ns1.sh.dingchen.local.    mail.dingchen.local.   ( 1  1D  2H  1D  1D )
    NS    ns1
ns1     A     100.0.0.10
www    A     100.0.0.106

[root@centos7 named]# vim /etc/named.rfc1912.zones 
zone "bj.dingchen.local" IN {
        type master;
        file "bj.dingchen.local.zone";
};
`3. 解析测试`
[root@centos7 named]# nslookup www.bj.dingchen.local
Server:        100.0.0.10
Address:    100.0.0.10#53

Name:    www.bj.dingchen.local
Address: 100.0.0.106

[root@centos7 named]# nslookup www.dingchen.local
Server:        100.0.0.10
Address:    100.0.0.10#53

Name:    www.dingchen.local
Address: 100.0.0.104

父域服务器给子域服务器授权

DNS 转发(缓存)服务器

利用 DNS 转发,可以将用户的 DNS 请求,转发至指定的 DNS 服务,而非默认的根 DNS 服务器,并将指定服务器查询结果进行缓存,提高效率。

  1. 被转发的服务器需要能够为请求者做递归,否则转发请求将不予进行
  2. 在全局配置块中关闭 dnssec 功能
Code
dnssec-enable no; 
dnssec-validation no;

转发方式

全局转发

对非本机所负责解析区域的请求,转发给指定的服务器

在全局配置块中实现:

bash
options {
    forward first|only;
    forwarders { ip; };
}

特定区域转发

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

bash
zone "ZONE_NAME" IN {
    type forward;
    forward first|only;
    forwarders { ip; };
};

first:先转发到指定的 DNS 服务器,如果无法解析查询请求,则本服务器再去根服务器查询

only:先转发到指定的 DNS 服务器,如果无法解析查询请求,则回答无法访问,并且本服务器也不会去根服务器查询