【Linux】基於Bind_DLZ和MySQL數據的DNS搭建


參考:http://www.linuxfromscratch.org/blfs/view/cvs/server/bind.html

參考:http://bind-dlz.sourceforge.net/

參考:http://www.shencan.net/index.php/2013/05/21/bind9-dlz-%e6%90%9edns/

參考:http://www.phpfensi.com/linux/20150507/9927.html

依賴:libcap libxml2 OpenSSL geoip (MIT) 

編譯參數(官網說明強調編譯關閉多線程,即--enable-threads=no):

[root@dns bind-9.10.2-P4]# ./configure --prefix=/usr/local/bind --enable-epoll --enable-largefile --enable-threads=no --with-dlz-mysql=/usr/local/mysql --disable-openssl-version-check

生成rndc.cnf:

[root@dns etc]# cd /usr/local/bind/etc
[root@dns etc]# ../sbin/rndc-confgen > rndc.conf

生成named.cnf:

[root@dns etc]# tail -10 rndc.conf | head -9 | sed s/#\ //g > named.conf

編輯named.cnf,添加dlz mysql驅動,參考其他資料也可以配置智能DNS。

(官方的dlz mysql驅動中有5個查詢和1個更新語句,具體每個查詢的功能可以參考官方說明)

 

key "rndc-key" {
        algorithm hmac-md5;
        secret "THnBnPv//oADGjeKQMoNng==";
};

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

options {
        allow-recursion { none; };
        recursion no;
        directory "/usr/local/bind/etc";
        version "leju-db-direct";
        pid-file "named.pid";
};
logging {
        channel default_debug {
                file "/tmp/bind_query.log"  versions 3 size 10m;
                severity info;
                print-time yes;
                print-category yes;
        };
        category queries {
                default_debug;
        };
#        category database {
#                default_debug;
#        };
};

dlz "mysql zone" {
   database "mysql
   {host=localhost dbname=name ssl=false port=3307 user=user pass=pass socket=/tmp/mysql_3306.sock}
   {select zone from dns_records where zone = '$zone$' 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 IsLive=1}";
};

官網給的mysql驅動模板:

dlz "mysql zone" {
    database "mysql
    {host=127.0.0.1 dbname=name ssl=false port=3306 user=user pass=pass}
    {select zone from dns_records where zone = '$zone$' limit 1}
    {select ttl, type, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"') else data end from dns_records where zone = '$zone$' and host = '$record$' and not (type = 'SOA' or type = 'NS') and IsLive=1}
    {select ttl, type, mx_priority, data from dns_records where zone = '$zone$' and (type = 'SOA' or type='NS')}
    {select ttl, type, host, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum from dns_records where zone = '$zone$' and not (type = 'SOA' or type = 'NS') and IsLive=1}
    {select zone from xfr_table where zone = '$zone$' and client = '$client$'}";
};

模板的查詢需要根據環境修改。

如果驅動部分存在查詢問題,或者表中值定義存在異常會出現以下報錯:

23-Sep-2015 11:39:47.621 dns_rdata_fromtext: buffer-0x7fffc7277da0:1: near eof: unexpected end of input
23-Sep-2015 11:39:47.621 dns_sdlz_putrr returned error. Error code was: unexpected end of input

參考:http://blog.163.com/digoal@126/blog/static/163877040201110235657127/

 

數據庫建表:

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',
  `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.',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

插入數據:

mysql> insert INTO dns_records  (zone,host,type,data,ttl,retry) values ('helloworld.com','bbs','A','192.168.1.101',86400,15);
mysql> insert INTO dns_records  (zone,host,type,data,ttl,retry) values ('helloworld.com','news','A','192.168.1.102',86400,15);

debug啟動:

[root@dns sbin]# ./named -g -d 1
[root@dns sbin]# ./named -c ../etc/named.cnf #啟動服務
 

如果出現MySQL無法建立連接的報錯,例如:

mysql driver failed to create database connection after 4 attempts

我通過在dlz mysql驅動中使用socket方式連接數據庫解決這個問題。

強制手動刷新

[root@dns sbin]# ./rndc  flush

停止服務

[root@dns sbin]# ./rndc stop

 

DNS數據說明

type

type字段用於說明RR的類型。常用的RR類型如下:
1、區記錄
SOA (Start Of Authority):SOA記錄標示一個授權區定義的開始。SOA 記錄后的所有信息是控制這個區的。
NS (Name Server):標識區的域名服務器以及授權子域。
2、基本記錄
A (Address):用於將主機名轉換為 IP 地址,任何一個主機都只能有一個A記錄。
PTR (PoinTeR):將地址轉換為主機名。
MX (Mail eXchanger):郵件交換記錄。控制郵件的路由。
3、安全記錄
KEY (Public Key):儲存一個關於DNS 名稱的公鑰。
NXT (Next):與 DNSSEC 一起使用,用於指出一個特定名稱不在域中。
SIG (Signatrue):指出帶簽名和身份認證的區信息,細節見 RFC 2535。
4、可選記錄
CNAME (Canonical NAME):給定主機的別名,主機的規范名在A記錄中給出。
SRV (Services):指出知名網絡服務的信息。
TXT (Text):注釋或非關鍵的信息。
RR的順序:
SOA RR應該放在最前面。通常NS RR緊跟在SOA RR之后,其他記錄的順序無關緊要。

data

存放該行host+zone域名解析的IP。

ttl (time to live)

它以秒為單位定義該資源記錄中的信息存放在高速緩存中的時間長度。通常省略該字段,而使用位於文件開始處的$TTL語句所指定值。

SerialNumber

本區配置數據的序列號,用於從服務器判斷何時獲取最新的區數據。

可以是 32 位的任何整數,每當更新區文件時都應該增加此序列號的值,否則 named 將不會把區的更新數據傳送到從服務器。

Refresh

輔助域名服務器多長時間更新數據庫。Refresh 1 到 6 小時。

Retry

若輔助域名服務器更新數據失敗,多長時間再試。Retry 20 到 60 分鍾。

Expire

若輔助域名服務器無法從主服務器上更新數據,原有的數據何時失效。Expire 1 周 到 1 月。

Minimum

設置被緩存的否定回答的存活時間。Minimum 1 到 3 小時。

緩存時間字段 Refresh、Retry、Expire、Minimum 可以使用時間單位字符m、h、d、w分別表示分鍾、小時、天、星期。

resp_person

區域管理員郵箱

primary_ns

區域主節點機器名

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM