Linux运维之bind9(DNS)远程管理rndc

DNS服务之用rndc远程管理服务器

rndc简介

rndc,英文全称为Remote Name Domain Controllor,是一个远程管理bind的工具,通过这个工具可以在本地或者远程了解当前DNS服务器的运行状况,也可以对DNS服务器进行关闭、重载、刷新缓存、增加删除zone等操作。

使用rndc可以在不停止DNS服务器工作的情况进行数据的更新,使修改后的配置文件生效。在实际情况下,DNS服务器是非常繁忙的,任何短时间的停顿都会给用户的使用带来影响。因此,使用rndc工具可以使DNS服务器更好地为用户提供服务。在使用rndc管理bind前需要使用rndc生成一对密钥文件,一半保存于rndc的配置文件中,另一半保存于bind主配置文件中。rndc的配置文件为/etc/rndc.conf,在CentOS或者RHEL中,rndc的密钥保存在/etc/rndc.key文件中。rndc默认监听在953号端口(TCP),其实在bind9中rndc默认就是可以使用,不需要配置密钥文件。

rndc是BIND安装包提供的一种控制域名服务运行的工具,它可以运行在其他计算机上,通过网络与DNS服务器进行连接,然后根据管理员的指令对named进程进行远程控制,此时,管理员不需要DNS服务器的根用户权限。使用rndc可以在不停止DNS服务器工作的情况进行数据的更新,使修改后的配置文件生效而且rndc与DNS服务器实行连接时,需要通过数字证书进行认证,而不是传统的用户名/密码方式,rndc在连接通道中发送命令时,必须使用经过服务器认可的密钥加密。为了生成双方都认可的密钥,可以使用rndc-confgen命令产生密钥和相应的配置,再把这些配置分别放入named.conf和rndc的配置文件rndc.conf中

1
yum install bind-utils -y

rndc的配置

执行命令rndc-confgen,生成rndc的key,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@k8s-dns ~]# rndc-confgen -r /dev/urandom
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "PmY9ozjj3+pkKJ4NXLpIlQ==";
};

options {
default-key "rndc-key";
default-server 127.0.0.1;
default-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 "PmY9ozjj3+pkKJ4NXLpIlQ==";
# };
#
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf

然后新建rndc.conf配置文件,将rndc-confgen生成的如下部分复制到rndc.conf文件中

1
2
3
4
5
6
7
8
9
10
11
12
[root@k8s-dns ~]# cat /etc/rndc.conf 
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "waEmuOMU3OnrTsvdOBDQdQ==";
};

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

再然后新建rndc.key配置文件,将rndc-confgen生成的如下部分复制到rndc.key文件中

1
2
3
4
5
6
7
8
9
10
[root@k8s-dns ~]# cat /etc/rndc.key 
key "rndc-key" {
algorithm hmac-md5;
secret "waEmuOMU3OnrTsvdOBDQdQ==";
};

controls {
inet 10.1.1.250 port 953
allow { 10.1.1.250;10.1.1.254; } keys { "rndc-key"; };
};

注意:这里要配置一下controls段的acl,限定好哪些主机可以使用rndc管理DNS服务

再然后在named.conf中使用include "/etc/named/rndc.key";指令将rndc.key的文件内容引入到named.conf中。

重启bind9服务

1
2
systemctl restart named
netstat -luntp|grep 953

rndc的常用操作命令

rndc命令的通用操作格式为:
rndc [-c config-file] [-k key-file] [-s server] [-p port] {command}

其中-c config-file指定rndc的配置文件,若不显式指定,则默认为/etc/rndc.conf-k key-file执行rndc的eky文件,若不显式指定,则默认为/etc/rndc.key

常用的执行的命令command有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
rndc status                      #查询DNS服务器状态
rndc reload #重新加载配置文件和zone file
rndc reload zone_name #重新加载指定zone file
rndc reconfig #重读配置文件并加载新增的区域
rndc querylog #关闭或开启查询日志
rndc dumpdb #将高速缓存转储到转储文件 (named_dump.db)
rndc freeze #暂停更新所有动态zone
rndc freeze zone [class [view]] #暂停更新一个动态zone
rndc flush [view] #刷新服务器的所有高速缓存
rndc flushname name #为某一视图刷新服务器的高速缓存
rndc stats #将服务器统计信息写入统计文件中
rndc stop #将暂挂更新保存到主文件并停止服务器
rndc halt #停止服务器,但不保存暂挂更新
rndc trace #打开debug, debug有级别的概念,每执行一次提升一次级别
rndc trace LEVEL #指定 debug 的级别, trace 0 表示关闭debug
rndc notrace #将调试级别设置为 0
rndc restart #重新启动服务器(尚未实现)
rndc addzone zone [class [view]] { zone-options } #增加一个zone
rndc delzone zone [class [view]] #删除一个zone
rndc tsig-delete keyname [view] #删除一个TSIG key
rndc tsig-list #查询当前有效的TSIG列表
rndc validation newstate [view] #开启/关闭dnssec

查询DNS服务状态(可以取值做监控)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@k8s-dns ~]# rndc status
WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf)
version: 9.9.4-RedHat-9.9.4-72.el7 <id:8f9657aa>
CPUs found: 1
worker threads: 1
UDP listeners per interface: 1
number of zones: 3
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running

可以看到,上面的输出信息中包含了一条警告,这个其实没什么影响的,如果你有强迫症可以使用下面这条命令开启动rndc,这样就不会看到那条警告了。

1
[root@k8s-dns ~]# rndc -c /etc/rndc.conf status

管理静态域(allow-update { none; };)

1
2
3
4
5
zone "boy.com" IN {
type master;
file "boy.com.zone";
allow-update { none; };
};

增、删、改一条记录后

1
2
[root@k8s-dns ~]# rndc reload boy.com
zone reload up-to-date

管理动态域(allow-update { 10.1.1.250; };)

1
2
3
4
5
zone "boysec.cn" IN {
type master;
file "boysec.cn.zone";
allow-update { 10.1.1.250; };
};

增、删、改一条记录后

1
2
[root@k8s-dns ~]# rndc reload boysec.cn
rndc: 'reload' failed: dynamic zone

直接reload会报错,需要先freeze再thaw才行

1
2
3
[root@k8s-dns ~]# rndc freeze boysec.cn
[root@k8s-dns ~]# rndc thaw boysec.cn
The zone reload and thaw was successful.