「BIND9」- DLZ(Dynamically Loadable Zones)

  CREATED BY JENKINSBOT

内容简介

使用BIND最不方便的地方在于:每次添加新的解析记录,在修改配置文件后,需要执行命令重新加载。如果可以从数据库动态读取DNS记录就完美了。

本文将介绍使用DLZ的配置,实现从数据库中动态读取DNS记录。

什么是「DLZ」?

动态可加载区域(DLZ)是BIND 9的补丁,它简化了BIND管理,并减少了内存使用和启动时间。

该技术允许将DNS记录存储在数据库中,在解析时从数据库中查询DNS记录。与使用脚本不同,在数据库中的更改会立即体现在BIND对DNS查询的响应中,因此无需重新加载或重新启动BIND服务,并且不需要在内存中载入及缓存DNS记录,因此也减少内存的使用。

注意事项

这是个非常老的项目了,最后一个版本:DLZ-0.7.0,修改时间:2004-04-17。前人在公司内网DNS解析中使用了这个技术,又不能轻易替换。

如果你在寻找这方面的解决方案,请慎用(因为官方文档里还有一些坑)!!!

服务部署运行

项目地址:http://bind-dlz.sourceforge.net

安装及部署,可以参考官方的文档:「Examples

# 通过源码编

使用源码安装

# 通过包管理器

#!/bin/sh

# 在CentOS中的Bind是支持DLZ的,但是位于bind-sdb软件包中
yum install -y bind-sdb

systemctl start bind-sdb

通过网页后台管理(BLZ WEBUI)

原始项目:https://github.com/1032231418/Bind-Web
其他项目:「php+mysql构建的web管理平台

性能测试

-「附加说明

# 关于官方文档
-「
Bind 9.7.0_p1 and DLZ?
文档已经是旧的了。文档中还有错误:示例中使用了’%zone%’、’%record%’ ,但是应该是’$zone$’、’$record$’。不知道哪个版本变了,但是没更新。

# 关于MySQL Bind扩展
-「MySQL BIND SDB Driver
这是另外一个扩展,和「DLZ的MySQL驱动」是不同的东西,但提供相同的功能。

# 主机名不能以点结尾
-「[Bind-dlz-testers] IPv6 & AAAA support ?

常见错误

#1 unsupported DLZ database driver ‘mysql’

问题描述:
在CentOS 7.6中的bind软件包,编译时已经指定了--with-dlz-mysql=yes选项,按理说应该是支持DLZ的,但是ldd /usr/sbin/named文件,没有看到libmysqlclient.so库(mysqlclient)的链接。使用MySQL驱动时,也输出了标题中的错误。

问题原因:
-「Unsupported Bind9 with mariadb on CentOS 7?
这是一个相同的问题,但是人家最后使用了LADP进行记录的存储,我们的目的是相同的,使用数据库之类易于管理的存储来维护记录,而不是使用文件。

-「BIND9 Issue
这篇文章提到了MySQL驱动成功加载了,题主安装的是「bind-sdb」包,然后我也安装了bind-sdb包,在该包里包含了/usr/sbin/named-sdb命令。在ldd /usr/sbin/named-sdb后,我看到了libmysqlclient.so的链接。紧接着对systemctl start named进行TAB补全,发现了named-sdb.service单元文件。这就表示DLZ和SDB可能是单独编译的二进制文件。在yum info bind-sdb后,描述中提到了对SDB和DLZ的支持。

安装bind-sdb包进行测试。果不其然,原始包bind并不支持DLZ扩展,而DLZ在bind-sdb这个包中,启动则是systemctl start named-sdb.service命令

解决办法:

#!/bin/sh

yum install bind-sdb
systemctl start bind-sdb

#2 ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 52398

-「AAAA Filtering
-「filter-aaaa-on-v4 does not filter AAAA if there is no existing A Record with the same FQDN – working as designed?
-「AAAA DNS query on ipv4 interface

问题描述:
对于某个域名,数据库只有A记录,没有AAAA记录。当进行AAAA记录解析时,查询返回SERVFAIL状态。

问题原因:
从错误日志看,由于DLZ内部的query.c中产生了错误。

解决办法:
由于我们目前并没有使用IPv6地址,但是应用程序又同时发出了IPv4的A记录和IPv6的AAAA记录(这是IPv4向IPv6过渡期间的一个常见问题)。

所以,我们在DLZ的数据库中加入了IPv6的AAAA记录,然后使用BIND的filter-aaaa-on-v4选项对AAAA查询响应进行过滤调。之所以「在DLZ的数据库中加入了IPv6的AAAA记录」,是因为filter-aaaa-on-v4不会对SERVFAIL的状态进行过滤,所以要先让它正常解析,然后再过滤调。

参考文献

BIND DLZ Home
What is DLZ?
Configure BIND with database backend and DLZ support
CentOS 7系统下bind 9.9.4如何调用MariaDB/mysql中的zone数据?
Bind-DLZ with MySQL