目录

bind

实验环境:

  • 系统:CentOS7.6.1810
  • 内核:3.10.0-123.el7.x86_64
  • 程序:bind-9.9.4-73.el7_6.x86_64

安装

yum -y install bind

注意事项:关闭防火墙或者开放 bind 的端口以防无法通讯。

设置 named.conf 主配置文件

allow-query 允许谁能来这台服务器查记录,默认的客户端地址为 localhos(这样设别人查不了)。可以设置为网段、所有、具体 IP,这 3 种情况。下面是配置文件的默认设置:

any 表示允许所有,如允许 192.168.1.0 网段,设置为 192.168.1.0/24,具体的主机设为“主机的IP”。

#全局配置
options {
    #允许所有人查询
    allow-query     { any; }; 

    #定义区域文件路径(默认保持不动)。
    directory       "/var/named";

    #只监听本地环回和172.16.12.131发来的解析请求。
    listen-on port 53 {  127.0.0.1;  172.16.12.131; };

    #实现轮训 cyclic是循环 random随机给一个,但是它不能检测服务器状态,宕机了还是会解析过去。
    #如果不配置,测试结果像是随机状态。
    rrset-order { order cyclic; };

    #不关闭无法使用区域传输,双斜杠代表注释。
    // dnssec-enable yes;
    // dnssec-validation yes;
}

# 日志配置段
logging{...}
# 区域配置段
zone{...}

区域配置(zone)

编辑 /etc/named.rfc1912.zones,也可以在 named.conf 中定义。

zone "gbb.com" IN { #区域名
        type master;
        file "gbb.com.zone"; #区域配置文件名
        allow-update { none ;};  #不允许使用工具更新此区域记录(nsupdate)
};

设置区域配置文件

编辑 /var/named/file_name ,文件名区域配置中 file 的 value 保持一致。中文注释不要复制进去。

// TTL缓存时间/s
$TTL  86400

// 设置默认域名,在做记录指向时只用填主机名就自动加上域名,不填默认找 zone 名字。
$ORIGIN gbb.com.

/*
@ 等同于上面 $ORIGIN 值,IN SOA是资源记录(Resource record),dns.gbb.com. 指定 master 域,mail.gbb.com. 管理员邮箱(.代替@)。
2019050302 是 sn(序列号),当你有更新区域资源记录,这个值必须要增加(开启区域传输才会使用到),yyyymmddss格式(年月日次数)。
2H 叫 ref(刷新)。
配置的这几个数值,只有用到子域才需严谨对待!
*/
@        IN        SOA        dns.gbb.com.        mail.gbb.com. (
                                2019050302
                                2H  
                                10M
                                7D
                                6H )
/*
NS 记录放第一位
@ 代表域,dns.gbb.com. 代表域内 DNS 服务器,可随意取名。
*/
@         IN       NS      dns.gbb.com.

/*
其他记录靠边站
*/
dns                           IN        A       172.16.12.131 // 给DNS服务器设置一个地址
www                        IN        A       172.16.13.78

简介写法可替换成。

// 简洁写法
$TTL  86400
$ORIGIN gbb.com.
@ IN SOA dns.gbb.com. mail.gbb.com. (2019050302 2H 10M 7D 6H)

@        IN        NS      dns.gbb.com.
dns      IN        A       172.16.13.169
www      IN        A       172.16.13.5
www      IN        A       172.16.13.186

写完后将文件设置正确的属组和权限,避免区域传输无权限读取。

[root@dns ~]# chown root:named /var/named/gbb.com.zone 
[root@dns ~]# chmod 640 /var/named/gbb.com.zone 

域名记录介绍:https://blog.csdn.net/silentpebble/article/details/44196083

  • SOA(Start Of Authority)起始授权机构,指定哪台 DNS 才是 Master;
  • NS(Name Server)域名服务器记录,用那台 DNS 服务器来进行解析域名;
  • 泛解析 *.Domain.com,任何主机名都跳转到对应 value 上;
  • TTL(Time-To-Live)在服务器缓存多久。

检测配置配置文件,没有任何报错就正确。

named-checkconf #检查named.conf主配置文件
named-checkzone '区域名'  file #检查zone配置文件,区域配置(zone)时定义的区域名。

开启服务 systemctl start namd

测试解析结果

dig、host、nslookup 等常用域名记录解析工具系统上默认没有,可以安装 bind-utils 工具包,里面包含这些工具。

指定一台 dns 来解析域名 www.xzq.com 的 A 记录。

host -t A www.xzq.com 172.16.12.131

配置查询日志

bind设置日志的通道(channel)和类别(category),第一发给谁这是通道,第二发什么这是类别。

logging {
        channel query_info {
                file "data/query.log"
                severity info;
                print-category yes;
        };
        category queries {
                query_info; #设置等级
        };
};

配置区域传送

配置一主多辅,两台查询,一台用来写映射记录。

slave 配置

named.conf 添加

zone "gbb.com" IN { #区域名称要和master一致啊!!!
        type slave; #类型各位大爷不要设错。
        file "gbb.com.zone"; #缓存到本地,填了file还会保存到文件中,master挂了还可以从文件中读。
        masters { Master IP; }; #master就是主DNS的IP地址
};

slave 每次重启都会自动完成一次区域传送,区域传送意思是去 master 上取区域配置文件。

slave日志(/var/log/message)

May  4 00:29:56 centos named[3512]: zone gbb.com/IN: Transfer started.
May  4 00:29:56 centos named[3512]: transfer of 'gbb.com/IN' from 172.16.13.169#53: connected using 172.16.13.73#41369
May  4 00:29:56 centos named[3512]: zone gbb.com/IN: transferred serial 2019050303
May  4 00:29:56 centos named[3512]: transfer of 'gbb.com/IN' from 172.16.13.169#53: Transfer completed: 1 messages, 8 records, 208 bytes, 0.001 secs (208000 bytes/sec)
May  4 00:29:56 centos named[3512]: zone gbb.com/IN: sending notifies (serial 2019050303)

master日志(/var/log/message)

AXFR 表示完全区域传送,IXFR 增量区域传送(只传新增数据)。

May  4 00:29:56 centos named[13871]: client 172.16.13.73#41369 (gbb.com): transfer of 'gbb.com/IN': AXFR started
May  4 00:29:56 centos named[13871]: client 172.16.13.73#41369 (gbb.com): transfer of 'gbb.com/IN': AXFR ended

master配置

slave 重启服务每次都是完整传输,想要传输新增数据别忘在 master 配上 slave地址,不在 master 中指定 slave 服务器地址,重启 master 它找不到 slave,无法把自己的数据传给 slave。

$TTL  86400
$ORIGIN gbb.com.
@ IN SOA dns.gbb.com. mail.gbb.com. (2019050302 2H 10M 7D 6H) #每次更改记录不要忘了修改序列号次数

@        IN        NS      dns.gbb.com.
@        IN        NS       slave.gbb.com. #设置NS记录,让master知道还有其他DNS服务器。

dns      IN        A       172.16.13.169
dns      IN        A       172.16.13.73 #给NS设置A记录
www      IN        A       172.16.13.5
www      IN        A       172.16.13.186
www      IN     A       172.16.113.23 #新增记录

此时重启服务就能将自己新增记录传给 slave,传是传了但是过多久 slave 去 master 上取一次数据呢?这是看 master 区域配置文件中 refresh 设定的时间。

我在主 DNS 中增加记录并没有定时取(更改过序列号),待我试试 rndc 重新加载配置文件(待修正)。

master 日志

May  4 01:20:55 centos named[14071]: zone gbb.com/IN: sending notifies (serial 2019050304)
May  4 01:20:55 centos named[14071]: client 172.16.13.109#33897 (gbb.com): transfer of 'gbb.com/IN': AXFR-style IXFR started
May  4 01:20:55 centos named[14071]: client 172.16.13.109#33897 (gbb.com): transfer of 'gbb.com/IN': AXFR-style IXFR ended
May  4 01:20:56 centos named[14071]: client 172.16.13.73#46475 (gbb.com): transfer of 'gbb.com/IN': AXFR-style IXFR started
May  4 01:20:56 centos named[14071]: client 172.16.13.73#46475 (gbb.com): transfer of 'gbb.com/IN': AXFR-style IXFR ended

slave 日志。

May  4 01:20:56 centos named[13092]: client 172.16.13.169#43891: received notify for zone 'gbb.com'
May  4 01:20:56 centos named[13092]: client 172.16.13.169#43891: received notify for zone 'gbb.com'
May  4 01:20:56 centos named[13092]: zone gbb.com/IN: notify from 172.16.13.169#43891: refresh in progress, refresh check queued
May  4 01:20:56 centos named[13092]: zone gbb.com/IN: Transfer started.
May  4 01:20:56 centos named[13092]: transfer of 'gbb.com/IN' from 172.16.13.169#53: connected using 172.16.13.109#33897
May  4 01:20:56 centos named[13092]: zone gbb.com/IN: transferred serial 2019050304
May  4 01:20:56 centos named[13092]: transfer of 'gbb.com/IN' from 172.16.13.169#53: Transfer completed: 1 messages, 11 records, 261 bytes, 0.001 secs (261000 bytes/sec)
May  4 01:20:56 centos named[13092]: zone gbb.com/IN: sending notifies (serial 2019050304)
May  4 01:20:57 centos named[13092]: client 172.16.13.73#11121: received notify for zone 'gbb.com'
May  4 01:20:57 centos named[13092]: zone gbb.com/IN: refused notify from non-master: 172.16.13.73#11121

三种情况会传输数据

  1. master 重启(传输部分数据)
  2. slave 重启(完整传输)
  3. refresh 时间到了,slave 会取 master 上取数据,比对序列号不一致就去拉数据。

区域传输过程梳理:

master 服务器重启 DNS 服务时,则发送 notify 给所有 slave 服务器来更新区域数据,slave 服务器接收到 notify 后响应 master 服务器告知它已经收到了通知,下一步时 slave 服务器向 master 服务器发起查询,以确定 notify 声明中所通告的区 SOA 记录是否改变(序列号),SOA 改变了则开始区域传送(),没有改变则不传送,至于是 IXFR 或 AXFR 由 bind 自己决定。

对区域传输做限制

谁都可以拉到 master 数据?这就是区域传输漏洞了(顺手把版本号关闭吧),在 master 上做一个限制访问就能防住。

zone "gbb.com" IN {
        type master;
        file "gbb.com.zone";
        allow-update { none; };
        allow-transfer { 172.16.13.73; 172.16.13.109; }; #只允许定义的ip可以取数据,any是任何人都可以取,none不让任何人取。
};

为了防止 slave 数据被偷,也需要设置 none。

# 在 named.conf 中设置
options {
    allow-transfer { none; };
    allow-update { none; };
}

被拒绝的日志信息。

May  4 13:07:18 centos named[13773]: client 172.16.13.169#47004: received notify for zone 'gbb.com'
May  4 13:07:18 centos named[13773]: zone gbb.com/IN: Transfer started.
May  4 13:07:18 centos named[13773]: transfer of 'gbb.com/IN' from 172.16.13.169#53: connected using 172.16.13.109#32951
May  4 13:07:18 centos named[13773]: transfer of 'gbb.com/IN' from 172.16.13.169#53: resetting
May  4 13:07:18 centos named[13773]: transfer of 'gbb.com/IN' from 172.16.13.169#53: connected using 172.16.13.109#45341
May  4 13:07:18 centos named[13773]: transfer of 'gbb.com/IN' from 172.16.13.169#53: failed while receiving responses: REFUSED
May  4 13:07:18 centos named[13773]: transfer of 'gbb.com/IN' from 172.16.13.169#53: Transfer completed: 0 messages, 0 records, 0 bytes, 0.040 secs (0 bytes/sec)

rndc 远程管理 DNS 服务器

安装管理工具。

root@gbb:~# apt -y install bind9utils

生成配置文件。

root@gbb:~# mkdir /etc/bind && /etc/bindrndc-confgen >/etc/bind/rndc.conf    

配置文件介绍。

# Start of rndc.conf
key "rndc-key" {
    algorithm hmac-md5;
    secret "To1VNHKlIm/Fguh4aNLQnA==";
};

options {
    default-key "rndc-key";
    default-server 127.0.0.1;
    default-port 953;
};

server 172.16.13.169 {
    key  "rndc-key";
    port 953;
};
# End of rndc.conf

# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
#   algorithm hmac-md5;
#   secret "To1VNHKlIm/Fguh4aNLQnA==";
# };
# 
# controls {
#   inet 127.0.0.1 port 953
#       allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf

将上文中注释部分写入要控制的 DNS 服务器 /etc/named.conf

key "rndc-key" {
    algorithm hmac-md5;
    secret "To1VNHKlIm/Fguh4aNLQnA==";
};

controls {
  #监听169这张网卡953端口,通过它连接进来,地址填*允许接受系统上任何网卡连接。
    inet 172.16.13.169 port 953 
        allow { 127.0.0.1; 192.168.2.252; } keys { "rndc-key"; }; #允许这两个ip可以管理
};

测试链接

-s指定服务器 -c制定配置文件位置 -p指定端口默认953

root@gbb:~# rndc -s 172.16.13.169 status

常用操作。

reload                         #重新加载配置文件及区域解析文件
reload zone                    #加载指定区域解析文件
retransfer zone                #在不检查序列号的情况下直接传送一个区域数据文件(完整区域传输)
notify zone                    #重新通知区域数据文件
reconfig                       #只重新装载配置文件及新增的区域
stop                           #将更新信息发送给服务器,然后关闭DNS服务器
flush                          #清除服务器缓存
status                 #显示服务器状态

dnsmasq

DNS 服务器搭建,首先要把 selinux 和 Firewalls 关闭,或者开放指定端口。

dnsmasq 解析过程:

  1. dnsmasq先去解析 hosts 文件
  2. 再去解析 /etc/dnsmasq.d/ 下的 *.conf 配置文件
  3. /etc/resolv.conf 只有在本地 hosts 和缓存中查不到才会去 resolv 中找其他 DNS 服务器查。

服务配置文件。

# 不转发域名格式不正确的信息(域名要带 .域名)
domain-needed

# 不在路由表中的地址不转发
bogus-priv

#不向外部DNS服务器查询本地没有的记录,也就是说不解析公网域名,默认是注释起来。
no-resolv

#不使用默认hosts文件(不解析本地域名),这时可不能再开启no-resolv,不然本地不解析外部DNS也不解析服务器就成了摆设。
no-hosts
#no-hosts开启后要想使用就再指定一个hosts
add-hosts=具体文件路径

#启用主机名扩展,
#配置hosts时写192.168.1.1 www,会自动把.traingray.com域名给你补上,变成www.traingray.com。 
expand-hosts
#指定域名
domain=traingray.com


# 启用日志
log-queries
log-facility=/var/log/dnsmasq.log

服务器 hosts 中上要解析的地址和域名,因为在 dnsmsqa.conf 开启了主机名扩展,访问主机名时就自动带上域名,就写主机名就好。

[root@centos7 ~]# cat /etc/hosts
192.168.1.1 www 
192.168.1.2 blog

另外服务器要想顺带解析公网域名就要在/etc/resolv.conf写上其他域名服务器地址,本地找不到对应ip时就会去问resolve中的服务器。如果不想解析也可以开启配置文件中no-resolv,就会停止读取resolve地址来解析公网域名了。

[root@centos7 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 223.5.5.5    

服务器配置完了,需要将客户端的DNS地址修改成服务器地址。

root@gbb:~# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.1.138

nslookup 来测试一下前面配置的域名吧,server 是指定用哪台 DNS 来查询。

root@gbb:~# nslookup
> server 192.168.1.138
Default server: 192.168.1.138
Address: 192.168.1.138#53
> www
Server:     192.168.1.138
Address:    192.168.1.138#53

Name:   www
Address: 192.168.1.1
> blog
Server:     192.168.1.138
Address:    192.168.1.138#53

Name:   blog
Address: 192.168.1.2
> www.raingray.com
Server:     192.168.1.138
Address:    192.168.1.138#53

Non-authoritative answer:
Name:   www.raingray.com
Address: 47.93.48.46

root@gbb:~# nslookup #开启了no-resolve无法找到在hosts中找到www.baidu.com
> www.baidu.com 
Server:     192.168.1.138
Address:    192.168.1.138#53

** server can't find www.baidu.com: REFUSED

分析服务器上 dnsmasqa 日志。

#解析本地成功
Apr 11 18:36:31 dnsmasq[30720]: query[A] www from 192.168.4.7
Apr 11 18:36:31 dnsmasq[30720]: /etc/hosts www is 192.168.1.1
Apr 11 18:36:31 dnsmasq[30720]: query[AAAA] www from 192.168.4.7
Apr 11 18:36:31 dnsmasq[30720]: config www is NODATA-IPv6

Apr 11 18:37:06 dnsmasq[30720]: query[A] blog from 192.168.4.7
Apr 11 18:37:06 dnsmasq[30720]: /etc/hosts blog is 192.168.1.2
Apr 11 18:37:06 dnsmasq[30720]: query[AAAA] blog from 192.168.4.7
Apr 11 18:37:06 dnsmasq[30720]: config blog is NODATA-IPv6

#开启了no-resolv解析失败
Apr 11 18:44:18 dnsmasq[30821]: query[A] www.baidu.com from 192.168.4.7
Apr 11 18:44:18 dnsmasq[30821]: query[AAAA] www.baidu.com from 192.168.4.7
Apr 11 18:44:18 dnsmasq[30821]: query[A] www.baidu.com from 192.168.4.7
Apr 11 18:44:18 dnsmasq[30821]: query[AAAA] www.baidu.com from 192.168.4.7

#解析成功
Apr 11 18:45:31 dnsmasq[30857]: query[A] www.baidu.com from 192.168.4.7
Apr 11 18:45:31 dnsmasq[30857]: forwarded www.baidu.com to 223.5.5.5
Apr 11 18:45:31 dnsmasq[30857]: query[AAAA] www.baidu.com from 192.168.4.7
Apr 11 18:45:31 dnsmasq[30857]: forwarded www.baidu.com to 223.5.5.5
Apr 11 18:45:31 dnsmasq[30857]: reply www.baidu.com is <CNAME>
Apr 11 18:45:31 dnsmasq[30857]: reply www.a.shifen.com is 180.97.33.107
Apr 11 18:45:31 dnsmasq[30857]: reply www.a.shifen.com is 180.97.33.108
Apr 11 18:45:31 dnsmasq[30857]: reply www.baidu.com is <CNAME>
Apr 11 18:45:31 dnsmasq[30857]: reply www.a.shifen.com is NODATA-IPv6
Apr 11 18:45:31 dnsmasq[30857]: query[PTR] 107.33.97.180.in-addr.arpa from 192.168.4.7
Apr 11 18:45:31 dnsmasq[30857]: forwarded 107.33.97.180.in-addr.arpa to 223.5.5.5
Apr 11 18:45:31 dnsmasq[30857]: reply 180.97.33.107 is NXDOMAIN

参考链接

最近更新:

发布时间:

摆哈儿龙门阵