免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7564 | 回复: 3

[DNS] 基于mysql查询的bind配置详细过程 [复制链接]

论坛徽章:
0
发表于 2011-04-14 22:19 |显示全部楼层
实验环境:VMware Workstation下的centos5.5
系统环境:Eth0:10.82.103.100
hostname:centos.linux.org
selinux 防火墙全关
要求实现www.linux.org到192.168.0.80
         ftp.linux.org 到 192.168.0.21的正向解析。
一、        Mysql的配置
要让bind在mysql查询信息,需要dlz的支持,这个在centos默认安装的bind里面是没有的,可以在/etc/named.conf里面添加dlz参数,启动bind会报错无效参数dlz,所有这里需要重新安装配置bind。这里需要下载bind的源码包安装配置加入dlz的支持,由于dlz的支持需要用到mysql的头文件和库文件(详细说明见:http://bind-dlz.sourceforge.net/mysql_driver.html),而系统默认安装的mysql是没有这些文件的,所以这里要重新源码安装mysql,以下是下载的最新的bind和最新的mysql。
bind-9.8.0.tar.gz  mysql-5.5.11.tar.gz
在安装这两个软件前,先卸载掉系统自带安装的,
#yum remove bind
#yum remove mysql
即可全部卸载掉主程序和相关依赖包。
下面开始源码安装mysql,最新版本mysql配置需要用到cmake,这个centos是不带有的,因此需要下载安装cmake,软件如下:
cmake-2.8.4.tar.gz 这个安装不需要特别配置,常规的默认安装即可。
完成后,就可以用cmake 命令来安装mysql了。详细安装可以查看mysql解压缩后目录下的README。
安装步骤为:
#cmake .
#make
#make install
安装后的目录/usr/local/mysql/
建立mysql用户和组
#useradd mysql
这里要给mysql安装目录以mysql用户和组权限:
#cd /usr/local/mysql/
#chown -R mysql:mysql .
#/usr/local/mysql/bin/mysql_install_db
启动mysql:
#cd /usr/local/mysql/bin
#./mysqld_safe &
设置root密码:
#./mysqladmin  -u root  password “mysql”(这里是我的mysql密码)
登陆mysql:
#./mysql –u root  -p
建立dns数据库:
CREATE DATABASE dns;
GRANT ALL ON dns.* TO ‘dns’@’localhost’ IDENTIFIED BY ‘mysql’(这里是密码)
这时的dns数据库是空的,需要填入表。由于表数据比较多,用mysql命令行不方便,这里把数据库语句存入文本文件,再导入即可如下是创建records表的sql语句:
create table `records`(
`id` int(10) unsigned NOT NULL auto_increment,
`zone` varchar(255) NOT NULL,
`ttl` int(11) NOT NULL default '86400',
`type` varchar(255) NOT NULL,
`host` varchar(255) NOT NULL default '@',
`mx_priority` int(11) default null,
`data` text,
`primary_ns` varchar(255) default null,
`resp_contact` varchar(255) default null,
`serial` bigint(20) default null,
`refresh` int(11) default null,
`retry` int(11) default null,
`expire` int(11) default null,
`minimum` int(11) default null,
primary key (`id`),
key `type` (`type`),
key `host` (`host`),
key `zone` (`zone`));
保存为records.sql文件,以后使用,然后是往records表插入记录的sql语句:
insert into `records` (`id`, `zone`, `ttl`, `type`, `host`, `mx_priority`, `data`, `primary_ns`, `resp_contact`, `serial`, `refresh`, `retry`, `expire`, `minimum`)
value (100, 'linux.org', 86400, 'SOA', '@', NULL, NULL, 'centos.linux.org.', 'root', 2011040322, 10800, 7200, 604800, 86400);
insert into `records` (`id`, `zone`, `ttl`, `type`, `host`, `mx_priority`, `data`, `primary_ns`, `resp_contact`, `serial`, `refresh`, `retry`, `expire`, `minimum`)
value (101, 'linux.org', 86400, 'NS', '@', NULL, 'centos', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
insert into `records` (`id`, `zone`, `ttl`, `type`, `host`, `mx_priority`, `data`, `primary_ns`, `resp_contact`, `serial`, `refresh`, `retry`, `expire`, `minimum`)
value (104, 'linux.org', 86400, 'A', 'ftp', NULL, '192.168.0.21', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
insert into `records` (`id`, `zone`, `ttl`, `type`, `host`, `mx_priority`, `data`, `primary_ns`, `resp_contact`, `serial`, `refresh`, `retry`, `expire`, `minimum`)
value (105, 'linux.org', 86400, 'A', 'www', NULL, '192.168.0.80', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
这个就是zone文件的记录,保存为zone.sql
上面两个文件均在/root目录下。
登陆到mysql
>use dns;
>source  /root/records.sql   执行records.sql里面的语句建立records表
>source  /root/zone.sql  执行zone.sql里面的语句插入记录
到此,mysql的配置完成。下面开始bind的配置。
二、Bind的配置
解压缩bind后,开始安装,不存在的目录已经建立好,步骤如下:
#./configure --prefix=/usr/local/bind --enable-largefile --enable-threads=no --with-dlz-mysql
这里的配置参数在http://bind-dlz.sourceforge.net/mysql_driver.html
#make
#make install
#cd /usr/local/bind/sbin
#./rndc-confgen >../etc/rndc.conf
#cd ../etc
#tail -10 rndc.conf | head -9 | sed s/#\ //g > named.conf
然后在named.conf中加入:
dlz "Mysql zone" {
   database "mysql
   {host=localhost dbname=dns user=root pass=mysql}
   {SELECT zone FROM records WHERE zone = '$zone$'}
   {SELECT ttl, type, mx_priority, IF(type = 'TXT', CONCAT('\"',data,'\"'), data) AS data
    FROM records
    WHERE zone = '$zone$' AND host = '$record$' AND type <> 'SOA' AND type <> 'NS'}
   {SELECT ttl, type, data, primary_ns, resp_contact, serial, refresh, retry, expire, minimum
    FROM records
    WHERE zone = '$zone$' AND (type = 'SOA' OR type='NS')}
   {SELECT ttl, type, host, mx_priority, IF(type = 'TXT', CONCAT('\"',data,'\"'), data) AS data, resp_contact, serial, refresh, retry, expire, minimum
    FROM records
    WHERE zone = '$zone$' AND type <> 'SOA' AND type <> 'NS'}
   {SELECT zone FROM xfr where zone='$zone$' AND client = '$client$'}";
};
注意里面的$zone$,如果出现缺少%zone%这样的报错,那么把$替换成%即可,这里一般是正确的。
修改/etc/resolv.conf文件,dns指向自己,即10.82.203.100
执行如下命令开启开启bind
#/usr/local/bind/sbin/named -uroot -d1 -g &
这里一般会报错,说找不到一个共享库文件,详细报错会给出缺少库文件的文件名,我报错的是缺少libmysqlclient.so.18这个在mysql的库文件里面会找的,这里只有做个软连接即可:
#ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.18 /usr/lib/
再来启动bind启动成功。
三、测试
下面来做测试:
#/usr/local/bind/bin/nslookup
> www.linux.org
14-Apr-2011 20:32:27.024
Query String: SELECT zone FROM records WHERE zone = 'www.linux.org'

14-Apr-2011 20:32:27.025
Query String: SELECT zone FROM records WHERE zone = 'linux.org'

14-Apr-2011 20:32:27.025
Query String: SELECT ttl, type, mx_priority, IF(type = 'TXT', CONCAT('"',data,'"'), data) AS data
    FROM records
    WHERE zone = 'linux.org' AND host = '@' AND type <> 'SOA' AND type <> 'NS'

14-Apr-2011 20:32:27.026
Query String: SELECT ttl, type, mx_priority, IF(type = 'TXT', CONCAT('"',data,'"'), data) AS data
    FROM records
    WHERE zone = 'linux.org' AND host = '*' AND type <> 'SOA' AND type <> 'NS'

14-Apr-2011 20:32:27.026
Query String: SELECT ttl, type, data, primary_ns, resp_contact, serial, refresh, retry, expire, minimum
    FROM records
    WHERE zone = 'linux.org' AND (type = 'SOA' OR type='NS')

14-Apr-2011 20:32:27.027
Query String: SELECT ttl, type, mx_priority, IF(type = 'TXT', CONCAT('"',data,'"'), data) AS data
    FROM records
    WHERE zone = 'linux.org' AND host = 'www' AND type <> 'SOA' AND type <> 'NS'

14-Apr-2011 20:32:27.028
Query String: SELECT ttl, type, mx_priority, IF(type = 'TXT', CONCAT('"',data,'"'), data) AS data
    FROM records
    WHERE zone = 'linux.org' AND host = '@' AND type <> 'SOA' AND type <> 'NS'

14-Apr-2011 20:32:27.028
Query String: SELECT ttl, type, mx_priority, IF(type = 'TXT', CONCAT('"',data,'"'), data) AS data
    FROM records
    WHERE zone = 'linux.org' AND host = '*' AND type <> 'SOA' AND type <> 'NS'

14-Apr-2011 20:32:27.029
Query String: SELECT ttl, type, data, primary_ns, resp_contact, serial, refresh, retry, expire, minimum
    FROM records
    WHERE zone = 'linux.org' AND (type = 'SOA' OR type='NS')

Server:         10.82.203.100
Address:        10.82.203.100#53

Non-authoritative answer:
Name:   www.linux.org
Address: 192.168.0.80
>
解析成功,测试ftp.linux.org一样。



主要参考文章:http://blogold.chinaunix.net/u1/55815/showart_654545.html


以上文档是实验过后回忆出来的,可能有些地方有错误,比如mysql那部分我就记得不是很清楚了(数据库小白),还请大家指明改正。
欢迎热爱技术的朋友加入QQ群:139570407  共同交流,共同进步。

论坛徽章:
0
发表于 2011-07-21 15:30 |显示全部楼层
你好,我按照你的步骤来做, 到最后一步测试 www.linux.org时不成功,没有到数据库中去查询消息,我的如下

> www.linux.org
Server:         202.96.128.86
Address:        202.96.128.86#53

Non-authoritative answer:
www.linux.org   canonical name = linux.org.
Name:   linux.org
Address: 184.173.230.160

希望能帮忙解决

论坛徽章:
0
发表于 2013-02-27 09:16 |显示全部楼层
很好,很好!完美!wddns的确也是这么做的。

论坛徽章:
0
发表于 2013-04-22 07:42 |显示全部楼层
回个帖,支持下~最近在看bind
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP