歡迎您光臨本站 註冊首頁

基於mysql查詢的bind配置詳細過程

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

基於mysql查詢的bind配置詳細過程

實驗環境: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  共同交流,共同進步。
《解決方案》

你好,我按照你的步驟來做, 到最後一步測試 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

希望能幫忙解決
《解決方案》

很好,很好!完美!wddns的確也是這麼做的。
《解決方案》

回個帖,支持下~最近在看bind

[火星人 ] 基於mysql查詢的bind配置詳細過程已經有718次圍觀

http://coctec.com/docs/service/show-post-11563.html