RNDC管理DNS的实现
rndc:(Remote NameDomain Controller)基于套接字与named服务通信,控制named服务完成特定操作。是指通过bind 软件引进的远程控制通道,代替unix 信号来控制 named 进程,可以用来对配置进行重新载入,是一款安全软件。
rndc 通过一个 TCP 连接与域名服务器通信,发送经过数字签名认证的命令。在当前版本的rndc 和 named 中,唯一支持的认证算法是 HMAC-MD5,在连接的两端使用共享密钥。它为命令请求和名字服务器的响应提供 TSIG类型的认证。所有经由通道发送的命令都必须被一个服务器所知道的 key_id 签名。
rndc 读一个配置文件来决定如何联系域名服务器并决定使用哪一个算法和密钥。
rndc可以对本地及远程DNS服务器进行管理、控制而不用重启BIND,我们接下来介绍一下rndc实现管理本地DNS服务器或者远程DNS服务器。
实验环境:
CentOS release 6.6(Final) 两台
IP地址:
172.16.31.3 DNS1 主DNS服务器端
172.16.31.4 DNS2 从DNS服务器端
实验中我使用主DNS做rndc验证,通过允许从DNS服务器和本机管理DNS服务。
一.rndc配置文件建立
我们先来看看控制named服务的密钥:
1
2
3
4
5
|
[root@dns1named]#cat/etc/rndc.key
key"rndc-key"{
algorithmhmac-md5;
secret"+lDBBFBGg6U3SYDzY/4YYQ==";
};
|
其实我们使用上面的密钥就可以了,但是我们可以通过rndc的命令来实现新建密钥配置文件,达到增强安全性的目的。
单独执行不加参数会卡住
因为rndc-confgen命令默认会去/dev/random和/dev/urandom读取随机数生成密钥,第一顺序是/dev/random。
#/dev/random:从熵池中取随机数,如果熵池中的随机数被用尽,则阻塞相关进程
#/dev/urandom:从熵池中取随机数,如果熵池中的随机数被用尽,则用软件生成伪随机数
我们尽量使用/dev/urandom来生成随机数密钥,我们将其结果输入一个rndc配置文件保存:
1
|
[root@dns1named]#rndc-confgen-r/dev/urandom>/etc/rndc.conf
|
我不使用/etc/rndc.key文件,所以需要将其删除,不然会报错哦:
1
2
3
|
[root@dns1named]#rndcstats
WARNING:keyfile(/etc/rndc.key)exists,butusingdefaultconfigurationfile(/etc/rndc.conf)
#rm�Cf/etc/rndc.key
|
将图中标明的那段复制到DNS服务器的主配置文件/etc/named.conf中
然后按下图所示将#号去除,然后配置好限定管理的IP:
下面附上我的配置好的文件,每台机器的密钥都不同,所以不要复制:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@H_502_396@
55
56
57
|
[root@dns1named]#cat/etc/named.conf
//
//named.conf
//
//ProvidedbyRedHatbindpackagetoconfiguretheISCBINDnamed(8)DNS
//serverasacachingonlynameserver(asalocalhostDNSresolveronly).
//
//See/usr/share/doc/bind*/sample/forexamplenamedconfigurationfiles.
//
options{
//listen-onport53{127.0.0.1;};
//listen-on-v6port53{::1;};
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";
allow-query{any;};
recursionyes;
dnssec-enableno;
dnssec-validationno;
dnssec-lookasideno;
/*PathtoISCDLVkey*/
/*bindkeys-file"/etc/named.iscdlv.key";
managed-keys-directory"/var/named/dynamic";
*/
};
logging{
channeldefault_debug{
file"data/named.run";
severitydynamic;
};
};
zone"."IN{
typehint;
file"named.ca";
};
#Usewiththefollowinginnamed.conf,adjustingtheallowlistasneeded:
key"rndc-key"{
algorithmhmac-md5;
secret"5xhClxlukK5HSJxmZ4ZV8w==";
};
#
controls{
inet0.0.0.0port953
allow{172.16.31.4;127.0.0.1;}keys{"rndc-key";};
};
#Endofnamed.conf
include"/etc/named.rfc1912.zones";
include"/etc/named.root.key";
|
三.测试rndc的管理功能
重启named服务:
1
2
3
|
[root@dns1named]#servicenamedrestart
Stoppingnamed:[OK]
Startingnamed:[OK]
|
然后我们就可以使用rndc命令:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[root@dns1named]#rndcstats
[root@dns1named]#rndcstatus
version:9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6
cpusfound:1
workerthreads:1
numberofzones:21
debuglevel:0
xfersrunning:0
xfersdeferred:0
soaqueriesinprogress:0
queryloggingisOFF
recursiveclients:0/0/1000
tcpclients:0/100
serverisupandrunning
|
四.设置从DNS服务器来通过rndc管理主DNS服务器
本机主DNS服务器可以使用rndc管理命令,但是rndc客户端从DNS服务器还没配置,我们来配置一下:
主DNS服务器配置:
1
2
3
4
|
controls{
inet0.0.0.0port953
allow{127.0.0.1;172.16.31.3;172.16.31.4;}keys{"rndc-key";};
};
|
在allow字段里面加入从服务器的IP地址,并且将允许管理的网络设置成0.0.0.0
从DNS服务器配置:
将主DNS服务器的/etc/rndc.conf文件的如下段复制到从服务器中的/etc/rndc.conf中;可能需要将原来的rndc-key注释掉:
1
2
3
4
5
6
7
8
9
10
|
key"rndc-key"{
algorithmhmac-md5;
secret"5xhClxlukK5HSJxmZ4ZV8w==";
};
options{
default-key"rndc-key";
default-server127.0.0.1;
default-port953;
};
|
将从服务器中的options字段改成下面的配置:
1
2
3
4
5
6
7
8
9
10
|
key"rndc-key"{
algorithmhmac-md5;
secret"5xhClxlukK5HSJxmZ4ZV8w==";
};
options{
default-key"rndc-key";
default-server172.16.31.3;
default-port953;
};
|
重启named服务:
1
2
3
|
[root@dns1named]#servicenamedrestart
Stoppingnamed:[OK]
Startingnamed:[OK]
|
查看链接状态:
1
2
3
4
5
6
|
[root@dns1named]#ss-tunl|grep53
udpUNCONN00172.16.31.3:53*:*
udpUNCONN00127.0.0.1:53*:*
tcpLISTEN03172.16.31.3:53*:*
tcpLISTEN03127.0.0.1:53*:*
tcpLISTEN0128*:953*:*
|
可以看出953端口开放了。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@dns1named]#rndcstatus
version:9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6
cpusfound:1
workerthreads:1
numberofzones:21
debuglevel:0
xfersrunning:0
xfersdeferred:0
soaqueriesinprogress:0
queryloggingisOFF
recursiveclients:0/0/1000
tcpclients:0/100
serverisupandrunning
|
在从DNS服务器上重启:
1
2
3
|
[root@dns2named]#servicenamedrestart
Stoppingnamed:[OK]
Startingnamed:[OK]
|
测试从DNS服务器可以管理主DNS服务器:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@dns2named]#rndc-s172.16.31.3status
version:9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6
cpusfound:1
workerthreads:1
numberofzones:21
debuglevel:0
xfersrunning:0
xfersdeferred:0
soaqueriesinprogress:0
queryloggingisOFF
recursiveclients:0/0/1000
tcpclients:0/100
serverisupandrunning
|
四.rndc的常用命令
语法:rndc [-b source-address] [-c config-file] [-k key-file] [-s server]
-p port] {command}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#rndc-h获取帮助
reloadzone#只装载指定区域解析库文件
refreshzone#维护
retransferzone#在不检查序列号的情况下直接传送一个区域数据文件
reconfig#只重新装载配置文件及新增的区域
#rndcquerylog
#rndcstatus
#
#tail/var/log/messages
stop#将更新信息发送给服务器,然后关闭DNS服务器
tracelevel#指明调试级别,不跟数字逐级增加,可以明确指定(如trace3)
notrace#关闭调试
flush#清除服务器缓存
|
Bind安全配置实现
一.ACL
访问控制列表(ACL)就是一个被命名的地址匹配列表。使用访问控制列表可以使配置简单而清晰,一次定义之后可以在多处使用,不会使配置文件因为大量的 IP 地址而变得混乱。
二.定义 ACL
要定义访问控制列表,可以在 BIND 的主配置文件 /etc/bind/named.conf 中使用 acl 语句来实现。acl 语句的语法为:
1
2
3
|
aclacl_name{
address_match_list;
};
|
BIND 里默认预定义了 4 个名称的地址匹配列表,他们可以直接使用,分别为:
any : 所有主机
localhost : 本机
localnets : 本地网络上的所有主机
none : 不匹配任何主机
acl 是 named.conf 中的顶级语句,不能将其嵌入其他的语句。
要使用用户自己定义的访问控制列表,必须在使用之前定义。
因为可以在 options 语句里使用访问控制列表,所以定义访问控制列表的 acl 语句应该位于 options 语句之前。
为了便于维护管理员定义的访问控制列表,可以将所有定义acl 的语句存放在单独的文件 /etc/bind/named.conf.acls 中,然后在主配置文件/etc/bind/named.conf 中如下语句
include"/etc/bind/named.conf.options";
之前添加如下的配置行
include"/etc/bind/named.conf.acls";
亦可以在/etc/named.conf中直接定义,我就是直接定义后调用的。
三.使用 ACL
1.定义了 ACL 之后,可以在如下的子句中使用
子句 语句 说明
allow-queryoptions,zone #指定哪主机或网络可以查询本服务器或区,默认的是允许所有主机进行查询。
allow-transfer options,zone#指定哪些主机允许和本地服务器进行域传输,默认值是允许和所有主机进行域传输。
allow-recursion options#指定哪些主机可以进行递归查询。如果没有设定,缺省是允许所有主机进行递归查询的。注意禁止一台主机的递归查询,并不能阻止这台主机查询已经存在于服务器缓存中的数据。
allow-update zone #指定哪些主机允许为主域名服务器提交动态 DNS 更新。默认为拒绝任何主机进行更新。
blackholeoptions #指定不接收来自哪些主机的查询请求和地址解析。默认值是 none 。
上面列出的一些配置子句既可以出现在全局配置 options 语句里,又可以出现在 zone 声明语句里,当在两处同时出现时,zone 声明语句中的配置将会覆盖全局配置 options 语句中的配置。
2.ACL 使用举例
限制查询
实例:假如要限制只有172.16.31.0/24 和172.16.131.0/24 查询本地服务器的所有区信息,可以在 /etc/named.conf中options 语句里使用如下的 allow-query 子句
1
2
3
4
5
|
options{
......
allow-query{172.16.31.0/24;172.16.131.0/8;};
......
};
|
上面的配置没有使用 ACL,若使用 acl,需要以下的配置步骤:
a.在 /etc/named.conf 中添加如下的 acl 语句,对允许查询的主机列表命名
1
2
3
4
|
aclaclist{
172.16.31.0/24;
172.16.131.0/24;
};
|
b.然后调用acl列表aclist进入options
1
2
3
4
5
|
options{
......
allow-query{aclist;};
......
};
|
限制区传输
例如:假如要限制只有172.16.31.3 和172.16.31.4 可以从本地服务器传输“oracle.ocm”的区信息,可以在/etc/named.rfc1912.zones的区域语句里使用如下的allow-transfer 子句
1
2
3
4
5
|
zone"oracle.com"IN{
typemaster;
file"oracle.com.zone";
allow-transfer{172.16.31.3;172.16.31.3;};
};
|
上面的配置没有使用 ACL,若使用 acl,需要以下的配置步骤:
a. 在 /etc/ named.conf中添加如下的 acl 语句,对允许查询的主机列表命名
1
2
3
4
|
aclatlist{
172.16.31.3;
172.16.31.3;
};
|
b. 在 /etc/named.conf 中使用定义的acl_name 限制允许进行域传输的主机列表
1
2
3
4
5
|
zone"oracle.com"{
typemaster;
file"oracle.com.zone";
allow-transfer{atlist;};
};
|
限制递归
实例:假如我们只允许本地172.16.31.0/24网段来进行递归查询
编辑/etc/named.conf文件:
直接acl实现
1
2
3
|
acllocalnet{
172.16.31.0/24;
}
|
将acl加入递归查询允许网段:
1
2
|
//recursionyes;
allow-recursion{localnet;};
|