0x1 ACL与Options
BIND的主配置文件支持丰富的配置参数,这里简单介绍下Options和ACL,至于View等配置我不准做更多说明,熟悉基础配置后参考配置文档即可完成相关配置,参考文档可以直接执行以下命令查看:
#man 5 named.conf
1、ACL访问控制列表
ACL用于控制客户端对DNS服务的访问权限,可选参数包括any、localhost、localnet、none及以CIDR表示的网络地址;
acl allow-query-net {
192.168.2.0/24;
};
这里的allow-query-net是ACL的名称;
2、Options选项
Options用于Statement中,用以对Statement进行全局或可选配置,可选参数包括:
allow-query 允许客户端访问,默认允许所有
allow-query-cache 允许查询缓存,more允许localhost和localnet
blackhole 黑洞,拒绝客户端访问,默认none
disable-empty-zone 禁用默认的空域配置,企业环境用不到,除非管理员打算自找烦恼
dnssec-enable 启用DNSSEC相关RR,默认启用
dnssec-validatiom 通过DNSSEC验证RR权威性,默认启用
forwarders 请求转发服务器列表,即将本服务器无法解析的请求转发给指定服务器,比如配置Google或DNSPOD等DNS Server
forward 控制forwarders请求顺序,有2个值,frist先到转发服务器列表查询,失败后再在本地服务器查询,only表示仅在转发服务器列表查询
listen-on named服务监听端口,不能也不需要修改
max-cache-size 服务缓存最大可用内容容量,默认32M,在多View配置中可以为每个View单独配置
notify 当zone更新后主动通知Slave,有4个值,yes主动通知,no不主动通知,master-only仅通知master,explicit仅通知zone中also-notify的Salve
recursion 递归查询,默认yes,在没有外部网络连接或特殊需求中可以配置为no,以将本服务器无法解析的请求做失败响应
参考示例:
acl allow-query-net {
192.168.2.0/24;
};
acl deny-query-net {
192.168.1.0/24;
};
options {
listen-on port 53 { any; };
max-cache-size 64M;
directory "/var/named";
statistics-file "/var/named/data/named_stats.txt";
forwarders {8.8.8.8; 8.8.4.4; };
recursion yes;
blackhole { deny-query-net; };
allow-query { allow-query-net; };
allow-query-cache { allow-query-net; };
};
0x2 协议与端口
DNS服务通用服务端口包括UDP53和TCP53,前者用于请求解析,后者用于Master/Slave间ZoneTransfer数据同步,在配置iptables规则时必须注意。
0x3 Master/Slave ZoneTransfer
DNS服务器之间数据同步分为两种AXFR (Asynchronous Transfer Full Range)全域传输和IXFR(Increment Zone Transfer)增量域传输,BIND9这两种协议默认都开启。为保证Slave Server上缓存记录的权威性,Slave需要周期性从Master Server同步Zone数据,因此AXFR全域传统比较容量理解,而IXFR则在域中RR数据比较多且更新频繁的情况下(比如DDNS等)可以比AXFR更具优势,能够更加快速完成数据同步。除了Slave Server周期性项Master Server被动同步外,Master Server也可以主动向Slave Server发出更新通知,就是Notify。
配置示例:
options {
listen-on port 53 { any; };
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 { localhost; 192.168.2.0/24; };
forwarders { 8.8.8.8; };
recursion yes;
notify yes;
dnssec-enable yes;
dnssec-validation yes;
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
当Master Server数据更新后可在Slave Server日志中看到其从收到更新通知到执行zone-transfer结束的完整流程(隐去了时间参数):
slave named[6489]: client 192.168.2.250#50982: received notify for zone '2.168.192.in-addr.arpa'
slave named[6489]: zone 2.168.192.in-addr.arpa/IN: Transfer started.
slave named[6489]: transfer of '2.168.192.in-addr.arpa/IN' from 192.168.2.250#53: connected using 192.168.2.251#47133
slave named[6489]: zone 2.168.192.in-addr.arpa/IN: transferred serial 2018061807
slave named[6489]: transfer of '2.168.192.in-addr.arpa/IN' from 192.168.2.250#53: Transfer completed: 1 messages, 14 records, 397 bytes, 0.001 secs (397000 bytes/sec)
slave named[6489]: zone 2.168.192.in-addr.arpa/IN: sending notifies (serial 2018061807)
slave named[6489]: client 192.168.2.250#23267: received notify for zone 'homelab.pub'
slave named[6489]: zone homelab.pub/IN: Transfer started.
slave named[6489]: transfer of 'homelab.pub/IN' from 192.168.2.250#53: connected using 192.168.2.251#53086
slave named[6489]: zone homelab.pub/IN: transferred serial 2018061807
slave named[6489]: transfer of 'homelab.pub/IN' from 192.168.2.250#53: Transfer completed: 1 messages, 16 records, 389 bytes, 0.001 secs (389000 bytes/sec)
0x4 日志分析
默认named通过rsyslog将日志写到/var/log/messages中,以下将日志中常见疑难消息做简要说明。
1、[namedxxxx]: error (networkunreachable) resolving 'baidu.com/A/IN': 2001:503:bb3e::2:30#53
服务器没有配置IPv6网络,但named默认同时运行在IPv4和IPv6协议栈,因此需要在服务配置文件/etc/named.conf中将以下内容注释或删除掉
listen-on-v6 port 53 { ::1; };
并在named服务的配置文件/etc/sysconfig/named中加入仅支持IPv4的选项
#echo -e 'OPTIONS="-4"' >> /etc/sysconfig/named
#systemctl restart named-chroot
2、日志未记录DNS查询详细信息
在服务器打开querylog即可记录详细日志,再次执行此命令关闭该功能
3、slave named[xxxx]: client 192.168.2.205:39085 (mirror.zju.edu.cn): query (cache) "mirror.zju.edu.cn/A/IN" denied
DNS服务器关闭了递归查询,不允许查询缓存,仅允许查询本域权威记录
4、slave named[xxxx]: transfer of '2.168.192.in-addr.arpa/IN' from 192.168.2.250#53: failed to connect: host unreachable
无法连接到masterserver进行zone-transfer,推测masterserver系统防火墙iptables没有放行来自slaveserver对TCP53端口的访问
5、slave named[xxxx]: dumping master file: tmp-XXXXXX: open: permission denied
这个问题在网络上有多种不靠谱的观点,这里仅对前三甲做介绍。排在第一位的观点认为是SElinux某个Boolean配置问题,但在homelab.pub中SElinux是Disabled;排在第二位的观点认为是目录属组权限问题,虽然log中有提示permission denied但经验表明服务系统文件权限配置错误基本无法正常运行;排在第三位的观点认为是服务参数配置问题,建议在/etc/sysconfig/named文件增加“ENABLE_ZONE_WRITE=yes” 参数,但BIND9已不正常参数。经深入研究,发现是Salve服务Zone配置文件路径错误,导致服务读取Zone文件时无法读取而报错,但从Master同步过来的缓存数据是可以用于解析服务的,因此Client端并没有感知到Slave Server工作状态有问题。
在前一篇文章SMB - DNS Server 域名服务器配置与管理(三) 0x2 Slave Server部署章节谈到创建homelab.pub域的服务配置named.homelab.pub.zones文件如下:
zone "homelab.pub" IN {
type slave;
masters { 192.168.2.250; };
file "homelab.pub.zone";
allow-update { none; };
};
zone "2.168.192.in-addr.arpa" IN {
type slave;
masters { 192.168.2.250; };
file "homelab.pub.rr.zone";
allow-update { none; };
};
仔细分析得知文件位置是错误的,当前路径没有这个文件,Slave Server读取的应该是从Master Server同步过来的文件信息,检查服务目录结构发现应该写如到/var/named/chroot/var/named/data/目录中,修改named.homelab.pub.zones文件如下:
zone "homelab.pub" IN {
type slave;
masters { 192.168.2.250; };
file "data/homelab.pub.zone";
allow-update { none; };
};
zone "2.168.192.in-addr.arpa" IN {
type slave;
masters { 192.168.2.250; };
file "data/homelab.pub.rr.zone";
allow-update { none; };
};
然后重启named-chroot服务,检查/var/log/messages发现相关错误日志信息消失,并在/var/named/chroot/var/named/data/目录发现homelab.pub.rr.zone和homelab.pub.zone两个新数据文件:
[root@slave ~]# ll /var/named/chroot/var/named/data/
总用量 220
-rw-r--r-- 1 named named 862 6月 26 23:29 homelab.pub.rr.zone
-rw-r--r-- 1 named named 740 6月 26 23:29 homelab.pub.zone
-rw-r--r-- 1 named named 94525 6月 26 23:29 named.run
-rw-r--r--. 1 named named 116828 6月 24 03:21 named.run-20180624
[root@slave ~]# file /var/named/chroot/var/named/data/homelab.pub.zone
/var/named/chroot/var/named/data/homelab.pub.zone: data