BIND-dlz联合数据库DNS服务器安装小记

BIND是DNS服务程序,既可以做面向用户的DNS服务器,也可以做面向域名的DNS服务器,或者两者混合的DNS服务器。我要做的是面向域名的那种,为域名进行解析。

下载编译安装是以下指令:

wget ftp://ftp.isc.org/isc/bind/9.8.0-P4/bind-9.8.0-P4.tar.gz

cd bind-9.8.0-P4

./configure --with-dlz-mysql --enable-largefile --enable-threads --with-openssl --prefix=/usr/local/bind

make

make install

然后在/usr/local/bind/etc/named.conf输入以下内容:

key "rndc-key" {
algorithm hmac-md5;
secret "gOszdwp5stjsnfI7MybyIg==";
};

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

options{
directory "/usr/local/bind/etc";
#forwarders {8.8.8.8;};
pid-file "/usr/local/bind/etc/named.pid";
statistics-file "/usr/local/bind/etc/named.stats";
recursion no;
allow-query {any;};
allow-transfer {none;};
};

logging {
channel bind_info {
file "/var/www/logs/bind.log" versions 20 size 20m;
print-category yes;
print-time yes;
severity notice;
};

category default {
bind_info;
};
};

include "/usr/local/bind/etc/view_crekebind.conf";

接着,从ftp://ftp.rs.internic.net/domain/named.root下载ROOT SERVER地址列表到/usr/local/bind/etc/。并在/usr/local/bind/etc/view_crekebind.conf输入以下内容:

#any-view
view "any_view" {
match-clients { ANY; };
allow-query-cache { ANY; };
#allow-recursion { ANY; };
#allow-transfer { ANY; };

dlz "Mysql zone" {
   database "mysql
    {host=localhost dbname=crekebind user=root pass=123456 ssl=false}
        {SELECT 'TRUE' FROM canonical WHERE content = '$zone$' limit 1}
    {SELECT ttl, type, priority, CASE WHEN lower(type)='txt' THEN concat('\"', data, '\"') ELSE data END AS data FROM record, canonical WHERE content = '$zone$' and host = '$record$' AND zone = domain}
    {}
        {SELECT ttl, type, host, priority, case when lower(type)='txt' then concat('\"', data, '\"') else data end AS data FROM record, canonical WHERE zone = domain
        AND content = '$zone$'}
        {SELECT 'TRUE' FROM xfr, canonical WHERE zone = domain AND content = '$zone$'
        AND client = '$client$'}";
};

zone "." IN {
type hint;
file "named.root";
};

};

上面的dlz配置对应myantdns,这是一个开源的PHP+MYSQL的DNS管理前端。

根据官方文档,这里解释一下“dlz "Mysql zone"”一节的相关内容。如果用的是其他前端,则相关配置可能如下所示:

    1. dlz "Mysql zone" {
    2.    database "mysql
    3.    {host=localhost dbname=dns_data ssl=tRue}
    4.    {select zone from dns_records where zone = '$zone$'}
    5.    {select ttl, type, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"')
    6.         else data end AS data from dns_records where zone = '$zone$' and host = '$record$'
    7.         and not (type = 'SOA' or type = 'NS')}
    8.    {select ttl, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum
    9.         from dns_records where zone = '%zone%' and (type = 'SOA' or type='NS')}
    10.    {select ttl, type, host, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"')
    11.         else data end AS data, resp_person, serial, refresh, retry, expire,
    12.         minimum from dns_records where zone = '$zone$' and not (type = 'SOA' or type = 'NS')}
    13.    {select zone from xfr_table where zone = '$zone$' and client = '$client$'}
    14.    {update data_count set count = count + 1 where zone ='$zone$'}";
    15. };

第一行声明使用DLZ驱动,第二节声明使用MYSQL。这些一般都是规定不变的。

第三行声明MYSQL的链接信息,这一行可以用到的参数还有dbname、port、host、user、pass、socket、compress、ssl、space。

第四行是查询DNS服务器中是否存在被请求域名$zone$,如果返回一行或以上结果,则被判断为存在,否则返回不存在改域名的应答。

第五行至第七行是返回域名记录,如果在下面紧接着的定义中定义了查询SOA和NS记录的语句,则本行必须过滤掉相应的SOA和NS记录,如本例子所示;如果下面没定义,则本行必须返回相应的SOA和NS记录,如上面的例子所示。

第八行则是刚刚说的用于返回SOA和NS记录的语句,如果上面的没有返回,则如例子所示设置;如果已经返回,则设为“{}”,注意其中不能用空格及其他字符。

第十至十二行是返回AXFR时所有的域名记录,如果这是包括SOA和NS记录,则第八行须设为空,否则须在第八行返回SOA和NS记录。

第十三行是查询当前请求AXFR的请求者$client$是否符合请求$zone$的授权,只要返回一行或以上记录就算符合。

第十四行是访问$zone$时的为相应的记录加一。

其中从第八行值第十四行的记录均为可选项。

说实话,配置bind dlz并不算麻烦,麻烦的是,现在找不到像模像样的PHP管理前端,webmin的开发得挺好,但是它不仅仅是bind管理,所以比较庞大,安装比较麻烦。这次我没装,有空会好好研究一下。

7 comments

  1. 代码疯子 says:

    都是高端东西,看不太懂

    1. creke says:

      多玩玩就懂了,呵呵

  2. FireDuck says:

    这个DNS对学校的Dr.com有效吗?

    1. creke says:

      额,这个仅仅是DNS服务端

  3. kavin says:

    你好!请问有没有测试过dns主从结构中 master是bind-dlz+mysql而slave是普通的文件方式 ?

    1. creke says:

      我没有试过用bind做slave,因为没那么多服务器哈

Leave a comment