歡迎您光臨本站 註冊首頁

利用Bind DLZ MySQL 構建智能DNS(V1)

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

利用Bind DLZ MySQL 構建智能DNS(V1)

利用Bind DLZ MySQL 構建智能DNS(V1)




【題 綱】
一、相關述語簡介
二、智能DNS系統服務規劃
三、安裝配置Bind-DLZ (介紹Bind-dlz具體安裝)
四、添加相關記錄並進行測試
五、後續話題及相關參考.
一、相關術語簡介:
1、智能DNS(Bind-view):
智能DNS的原理很簡單:在用戶解析一個域名的時候,判斷一下用戶的IP,然後跟DNS伺服器內部的IP表匹配一下,看看用戶是電信還是網通用戶,然後給用戶返回對應的IP地址。目前的域名服務運營商不提供智能DNS服務,所以必須自行架設DNS服務或者使用網上免費的智能DNS服務,如DNSPOD.

2.Bind-DLZ
Bind-DLZ主頁:http://bind-dlz.sourceforge.net/
DLZ(Dynamically Loadable Zones)與傳統的BIND9不同,BIND的不足之處:
* BIND從文本文件中獲取數據,這樣容易因為編輯錯誤出現問題。
* BIND需要將數據載入到內存中,如果域或者記錄較多,會消耗大量的內存。
* BIND啟動時解析Zone文件,對於一個記錄較多的DNS來說,會耽誤更多的時間。
* 如果近修改一條記錄,那麼要重新載入或者重啟BIND才能生效,那麼需要時間,可能會影響客戶端查詢。
而Bind-dlz 即將幫你解決這些問題, 對Zone文件操作也更方便了,直接對資料庫操作,可以很方
便擴充及開發管理程序。

二、智能DNS系統服務規劃:
1、NameServer 伺服器註冊(到新網或者萬網後台添加)
ns1.aim18.com  211.100.72.137
ns2.aim18.com  219.232.244.11




2、測試NS記錄是否生效.#dig ns aim18.com
#dig aim18.com +trace更多的命令技巧請參考: http://bbs.linuxtone.org/thread-2021-1-1.html

3、Bind-View規劃
www.aim18.com 網通 (CNC)  210.51.36.116 (NK手機)
www.aim18.com 電信(TELECOM) 221.238.249.178 (CU)
www.aim18.com 教育網(EDU) 202.205.109.207 (教育網)
www.aim18.com 電信通(ANY) 211.103.156.230 (51CTO)
【注】:由於資源問題,在此引用國內一些知名站點的IP做實驗,請見諒~!
即當您是網通用戶的時候,輸入www.aim18.com智能DNS伺服器將把你分配到210.51.36.116 (NK手機) 這台伺服器,其它同例。
View{CNC(網通),TELECOM(電信),EDU(教育網),ANY(其它所有)}include "/usr/local/bind/etc/cnc_acl.conf";
include "/usr/local/bind/etc/telecom_acl.conf";
include "/usr/local/bind/etc/edu_acl.conf";【注】IP庫及ACL,如果你有比較詳細的按城市或者地域的IP庫,在設計BIND-VIEW這個欄位的時候,VIEW就可以以城市或地區來命名和規劃.

三、安裝配置Bind-DLZ
1、編譯安裝MySQL
在此不作介紹,具體的請看http://www.linuxtone.org 相關內容。
注意編譯MySQL的時候禁掉線程,相關的參數如下:--without-server --disable-threads --without-pthread2、編譯安裝Bind#mkdir /usr/local/src/bind-dlz
#cd /usr/local/src/bind-dlz
#wget http://ftp.isc.org/isc/bind9/9.6.0-P1/bind-9.6.0-P1.tar.gz
#tar zxvf bind-9.6.0-P1.tar.gz#cd bind-9.6.0-P1#./configure --with-dlz-mysql --enable-largefile --enable-threads=no --prefix=/usr/local/bind --with-openssl=/usr/local/openssl/註:禁掉線程;--with-openssl= 你的openssl安裝的相關目錄有可能是/usr# make && make install創建相關配置文件cd /usr/local/bind/etc
../sbin/rndc-confgen >rndc.conf
tail -n10 rndc.conf | head -n9 | sed -e s/#\//g >named.conf# vi localhost.zonettl 86400
@ IN SOA localhost. root.localhost. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS localhost.
1 IN PTR localhost.
# dig > named.root
#vi named.conf 在後面加入如下:
include "/usr/local/bind/etc/cnc_acl.conf"; //網通ACL
include "/usr/local/bind/etc/telecom_acl.conf"; //電信ACL
include "/usr/local/bind/etc/edu_acl.conf"; //教育網ACL
include "/usr/local/bind/etc/view.conf"; //DLZ相關的配置#vi /usr/local/bind/etc/view.conf //創建view相關的配置文件
#cnc-view //貼出其中網通部分的範例,更詳細的請參照view.conf配置文件.view "cnc_view" {
match-clients { CNC; };
allow-query-cache { none; };
allow-recursion { none; };
allow-transfer { none; };
recursion no;
dlz "Mysql zone" {
database "mysql
{host=127.0.0.1 dbname=cdn_view ssl=false port=3306 user=root pass= }
{select zone from dns_records where zone = '%zone%' and view='CNC' limit 1}
{select ttl, type, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"') when lower(type) = 'soa' then concat_ws(' ', data, resp_person, serial, refresh, retry, expire, minimum) else data end as mydata from dns_records where zone = '%zone%' and host = '%record%' and view='CNC'}
{}
{select ttl, type, host, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"') else data end as mydata, resp_person, serial, refresh, retry, expire, minimum from dns_records where zone = '%zone%' and view='CNC'}
{select zone from xfr_table where zone = '%zone%' and client = '%client%' and view='CNC' limit 1}
{update data_count set count = count + 1 where zone ='%zone%' and view='CNC'}";
};
};官方相關參考請參照: http://bind-dlz.sourceforge.net/mysql_example.html

3、DLZ相關資料庫表結構建立 (//詳細見提供的cdn_view.sql含測試數據.)mysql>create database cdn_view; //創建資料庫名為cdn_view
mysql>use cdn_view;
CREATE TABLE `dns_records` (
`id` int(10) unsigned NOT NULL auto_increment,
`zone` varchar(255) NOT NULL,
`host` varchar(255) NOT NULL default '@',
`type` enum('MX','CNAME','NS','SOA','A','PTR') NOT NULL,
`data` varchar(255) default NULL,
`ttl` int(11) NOT NULL default '800',
`view` enum('CNC','TELECOM','EDU','ANY') NOT NULL, //智能DNS區域範圍
`mx_priority` int(11) default NULL,
`refresh` int(11) NOT NULL default '3600',
`retry` int(11) NOT NULL default '3600',
`expire` int(11) NOT NULL default '86400',
`minimum` int(11) NOT NULL default '3600',
`serial` bigint(20) NOT NULL default '2008082700',
`resp_person` varchar(64) NOT NULL default 'root.domain.com.',
`primary_ns` varchar(64) NOT NULL default 'ns1.domain.com.',
`data_count` int(11) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `type` (`type`),
KEY `host` (`host`),
KEY `zone` (`zone`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
#desc dns_records; 顯示錶結構.




【注】直接將本文提供的cdn_vew.sql導入你的資料庫即可,具體操作如下:Mysql>create database cdn_view; //創建cdn_view資料庫
#mysql cdn_view ?uroot ?p < cdn_view.sql 導入資料庫4、啟動bind服務.
# /usr/local/bind/sbin/named -uroot -g -d 9 //調試狀態,如果沒有報錯說明環境配置正確。
做成啟動服務. Debug的時候多用此模式啟動bind.
# /usr/local/bind/sbin/rndc reload 重載named.conf相關配置文件.
# /usr/local/bind/sbin/named -uroot -c /usr/local/bind/etc/named.conf 啟動bind服務.

四、添加相關記錄並進行測試
將相關解析記錄添加到資料庫內,以下是相關SQL範例供參考:
1、添加SQL創建相關ZONE及記錄.(以網通為例,具體建我提供的測試SQL)- - - - SOA
INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
('aim18.com', '@', 'SOA', 'ns1.aim18.com.', 10, 'CNC', NULL, 3600, 3600, 86400, 10, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
- - - - NS--SOA
INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`,
`primary_ns`, `data_count`) VALUES
('aim18.com', '@', 'SOA', '211.100.72.137', 3600, 'CNC', NULL, 3600, 3600, 86400, 3600, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
- - - - NS1
INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
('aim18.com', 'ns1', 'A', '211.100.72.137', 3600, 'CNC', NULL, 3600, 3600, 86400, 3600, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
- - - - NS2
INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
('aim18.com', 'ns2', 'A', '219.232.244.11', 3600, 'CNC', NULL, 3600, 3600, 86400, 3600, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
- - - - A
INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
('aim18.com', 'www', 'A', '210.51.36.116', 3600, 'CNC', NULL, 3600, 3600, 86400, 3600, 2008082700, 'root.aim18.com.', 'ns1.aim18.com.', 0);
- - - -CNAME
INSERT INTO dns_records (zone,host,type,DATA,view)
VALUES ('aim18.com', 'man', 'CNAME', 'www','CNC');2. 基本查詢測試:
通過網通的機器查詢,解析后得到提網通的伺服器,說明智能解析是正確的。

2009-3-8 19:52 上傳下載附件 (5.46 KB)







經測試解析都比較正確,能將電信用戶解析到電信伺服器,網通用戶解析到網通伺服器,教育網用戶
解析到教育網網伺服器,電信通用戶解析到電信通伺服器.
【注】本方案中的IP庫抓取由(edison7500) 欣哥熱情幫助分析抓取IP庫,在此表示感謝!目前從測試來看IP庫比較精準,能夠真正做到智能DNS的智能解析

3、性能測試工具# cd /usr/local/src/bind-dlz
# cd bind-9.6.0-P1/contrib/queryperf
# ./configure && make# vi rslist //解析記錄列表寫入此文件www.aim18.com A
bbs.aim18.com A
man.aim18.com CNAME…..#vi do.sh //建立一個循環程序對了bind伺服器查詢進行壓力測試,同時多關注資料庫狀態.
#!/bin/bash
while true
do
./queryperf ?d rslist -s 211.100.72.137 -v
done/usr/local/bind/sbin/named -uroot -g -d 9 bind啟為調試模式,在bind排錯的時候請多用此模式來debug.
這裡可以觀察到查詢過程中執行的SQL。
【注】在此不做深入詳細的性能和壓力測試報告,用戶可以自己通過以上範例編寫壓力測試方案。

五、後續話題及相關參考
1、利用PHP程序開發一套Bind-DLZ 管理程序。
目前正在編寫PHP管理頁面,Falcon.C版主正在幫我做這方面的工作。主要在於數據設計和優化還需要花一些時間。大家可以考慮進一步優化資料庫結構,同時也希望能與我分享你的心得。
PHP頁面管理參考網站:
1)、https://svn.lokkju.com/svn/dnsEditor/trunk/ 國外開源程序
2)、http://www.dnswood.com/ dnswood的管理界面
3)、http://www.dnspod.com dnspod老牌智能DNS站的管理界面,用戶體驗做的一流!
2、智能DNS集群構建
Bind本身也很容易構建集群,由於Zone文件是存在資料庫裡面,利用mysql服務
器也很容易構建多個集群,很方便擴充,在些就不做詳細介紹。
相關技術點: 負載均衡:LVS, 資料庫集群:MySQL Replication.
3、結合SQUID伺服器,可以很輕鬆實現CDN.
目前國內CDN技術比較熱,國內各大門戶都在考慮自建CDN,利用本文提供的智能DNS構建文檔可以很方便的實現智能DNS解析系統,再與SQUID集群結合,可以很輕鬆實現CDN。下次我將給大家介紹SQUID構建和優化的經驗,同時推薦出整
套的CDN集群解決方案,請實時關注linuxtone: http://www.linuxtone.org 相關信息。
4、相關參考網址.
1)、DNS相關工具(解析排錯):http://bbs.linuxtone.org/thread-2021-1-1.html
2)、Bind-DLZ國外相關資料參考:
http://projects.navynet.it/DLZ/dlz-addons/
http://svn.the-mesh.org/trac.cgi/wiki/HardyBindDlzHowto
http://svn.the-mesh.org/trac.cgi/attachment/ticket/40/bind9-dlz.sql
http://projects.navynet.it/DLZ/dlz-addons/
5、附件相關的文件說明:
bind_dlz/etc.tar.gz 為/usr/local/bind/etc配置文件含IP庫,編譯后直接替換此文件.
bind_dlz/cdn_view.sql 為bind-dlz資料庫表結構及數據, 直接用mysql 命令導入資料庫.
下載地址:http://www.linuxtone.org/project/cdn/bind-dlz.tar.gz
測試數據:http://www.linuxtone.org/project/cdn/test.txt

[火星人 ] 利用Bind DLZ MySQL 構建智能DNS(V1)已經有369次圍觀

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