bind9.8搭建dns服務器

系統:Centos6.7 64位

內核:2.6.32-573.el6.x86_64

軟件:

    bind-9.8.2-0.47.rc1.el6_8.2.x86_64

    bind-utils-9.8.2-0.47.rc1.el6_8.2.x86_64

    bind-libs-9.8.2-0.47.rc1.el6_8.2.x86_64

參考:bind9手冊

軟件簡單介紹:

    bind(Berkeley Internet Name Domain)是一種dns協議的實現。bind軟件包含3個部分:dns server、解析庫和檢測dns服務是否正常工作的工具(namd-checkconf,rndc等)。它是dns服務的具體實現,也是bind最核心的軟件

    bind-utils包含一些更dns服務有關的輔助工具(dig、nslookup、host等),有助於我們學習dns

    bind-libs這是bind server和utis依賴的庫文件

    

    軟件安裝:yum install bind bind-utils bind-libs -y


利用bind搭建一個最簡單的dns服務器:

    bind這個軟件最核心的配置文件是/etc/下的namd.conf,所以下面我們簡單介紹一下它。

    首先man 5 named.conf 可以看到對它的描述:


        named.conf is the configuration file for named. Statements are enclosed

       in braces and terminated with a semi-colon. Clauses in the statements

       are also semi-colon terminated. The usual comment styles are supported:

       C style: /* */

       C++ style: // to end of line

       Unix style: # to end of line


大意是說這個配置文件的語法可以分爲以下3點:

    (1)每個條件語句寫在{}裏面,並且{}後面必須跟;也就是說 {xxx};這種形式

    (2)條件語句自身也需要以;結尾,也就是{xxx;};這種形式

    (3)註釋可以有3種風格,c、c++、unix風格,分別對應/* */ // #特殊符號註釋


    一個bind9的配置包括語句和註釋,語句和註釋是唯一不需要{}括起來的內容,{}的語句我們稱爲子語句,它需要{}括起來(官方說法)

或者我們可以可以把語句看成一個個功能選項,而把子語句看成這個功能選項的參數和值(我的理解..下面全按我的理解來,我把 語句-->功能,子語句-->參數:值),大部分格式類似如下:

    功能選項 [..] {

    參數:值;

    ....

    };


bind可以使用的功能選項有:

    acl:定義一個ip地址列表,用來做訪問控制或者其他

    controls:宣告rnde utility使用的控制通道

    include:包含某些個文件

    key:設置密鑰信息,它應用在通過TSIG進行授權和認證的配置中

    logging:設置日誌服務器和日誌信息的發送地

    options:全局配置選項和爲其他語句配置默認值

    server:在一個單服務器基礎上設置特定的配置選項

    trusted-keys:定義新人的dnssed密鑰

    view:定義一個視圖

    zone:定義一個域


    bind的每個功能選項都有很多參數可以使用,比如options有 recursion、directory等參數,logging有channel等參數,因爲太多加上本人很懶,所以下面只解釋比較常用到和自己認爲有必要解釋的參數,(當然,鬼才知道有沒有人看..自己忽悠自己玩^^)

    

    首先我們來定義一個最簡單的dns服務,什麼樣的服務最簡單呢,當然是緩存服務器,一個最簡單的緩存服務器需要以下三點:

    (1)服務要監聽在外網地址

    (2)根的位置

    (3)允許遞歸

    所以一個簡單的緩存dns服務器的配置如下:

options{
        listen-on {192.168.1.201;}; #監聽的地址,不能使用0.0.0.0,bind9不識別,我的實測..不加這條默認監聽在所有網卡地址
        directory "/var/named";		#區域數據庫文件目錄,所有的zone數據庫文件都放在這裏
        recursion yes;				#是否允許遞歸,默認yes
};

zone "." IN {						#根域的配置	,格式zone string optional_class {...;};
        type hint;					#域的類型,可選的有hint|master|slave|forward等,hint表示根域類型
        file "named.ca";			#根的數據庫文件,具體的路徑就是結合上面的目錄/var/named/named.ca
};

    因爲這些參數都有默認值,listen默認監聽所有網卡,遞歸默認開的,bind的默認配置就是一個緩存服務器的配置,所以其實一個最簡單的dns配置就是沒有配置,可以把named.conf這個文件清空,然後/etc/init.d/named start啓動服務,你會發現可以啓動成功,並且沒有錯誤信息,而且可以通過它轉發dns請求。


增加一個正向解析域:

    vi /etc/named.conf

options {
	directory "/var/named";
	listen-on {192.168.1.201;};
};
zone "." IN {
	type hint;
	file "named.ca";
};
zone "linzb.com" IN {
	type master;
	file "linzb.com.zone";
};


編輯正向解析域的數據庫文件:

$TTL 600
@ 	IN 	SOA	ns1.linzb.com. 	admin.linzb.com. (
						2 
						1H
	 					2W
	 					3D
	 					600 )
	IN	NS	ns1
ns1	IN	A	192.168.1.207
www	IN	A	192.168.1.4
test	IN	CNAME	www


注意:

    (1)“@”在bind的配置文件中具有特殊意義,在named.conf裏面定義,這裏是linzb.com.

    (2)在區域文件中的記錄可以只寫主機名,bind會根據$ORIGIN的內容自動補齊,比如這裏ns1=ns1.linzb.com.  注意,ns1不能跟.,否則就不是主機,而是一個fqdn。 

    (3)$ORIGIN是bind的內置變量,可以多次定義,比如說,上述正向區域文件可以改寫成這樣:

$ORIGIN .
$TTL 600	; 10 minutes
linzb.com		IN SOA	ns1.linzb.com. admin.linzb.com. (
				2          ; serial
				3600       ; refresh (1 hour)
				1209600    ; retry (2 weeks)
				259200     ; expire (3 days)
				600        ; minimum (10 minutes)
				)
			NS	ns1.linzb.com.
$ORIGIN linzb.com.
ns1			A	192.168.1.207
test			CNAME	www
www			A	192.168.1.4


    named-checkconf #檢查named.conf是否語法錯誤

    named-checkzone  linzb.com /var/named/linzb.com.zone#檢查linzb.com.zone是否語法錯誤,它的使用格式是:

    named-checkzone zonename filename


測試命令:dig

語法:dig [@server] [-b address] [-c class] [-f filename] [-k filename] [-m]

           [-p port#] [-q name] [-t type] [-x addr] [-y [hmac:]name:key] [-4]

           [-6] [name] [type] [class] [queryopt...]

    -t:指定查詢類型,類型有A,SOA等,比較特殊的兩個類型:

        axfr:完全區域傳送

        ixfr=n:增量區域傳送,n表示序列號,表示傳送自n序列號以後的更新

    -x:反向解析

    @:指定解析的dns服務器

例子:

    dig  -t A www.linzb.com @192.168.1.201

wKioL1hIL4nTdPmuAAMNPwnCavk344.png


增加一個反向解析域:

    vi /etc/named.conf

options {
	directory "/var/named";
	listen-on {192.168.1.201;};
};
zone "." IN {
	type hint;
	file "named.ca";
};
zone "linzb.com" IN {
	type master;
	file "linzb.com.zone";
};
zone "1.168.192.in-addr.arpa" IN {
	type master;
	file "192.168.1.zone";
};

編輯反向區域文件:

    vi /var/named/192.168.1.zone

$TTL 600
@	IN	SOA	ns1.linzb.com. admin.linzb.com (			      
						2 
						1H
	 					2W
	 					3D
	 					600 )
	IN	NS	ns1.linzb.com.
201	IN	PTR	ns1.linzb.com.
4	IN	PTR	www.linzb.com.

    反向區域文件的ip順序是倒過來寫的加上in-addr.arpa. 結尾,剩下的就是把正向區域文件的name和value的值反過來寫。

    named-checkconf

    named-checkzone 1.168.192.in-addr.arpa /var/named/192.168.1.zone

    /etc/init.d/named restart

測試:

wKioL1hIL2zQkHkRAAMsCnGQp0Q586.png


dns的主從配置:

    主:192.168.1.201

    從:192.168.1.202

主服務器的named.conf配置:

options {
	directory "/var/named";
	listen-on {192.168.1.201;};
};
zone "." IN {
	type hint;
	file "named.ca";
};
zone "linzb.com" IN {
	type master;
	file "linzb.com.zone";
	allow-transfer {192.168.1.202;};
};
zone "1.168.192.in-addr.arpa" IN {
	type master;
	file "192.168.1.zone";
	allow-transfer {192.168.1.202;};
};

    增加了allow-transfer參數,這個參數代表允許哪些主機傳輸區域文件,可以單獨加個某個zone,也可以加在options裏面代表默認。不加的話默認是允許所有的主機,這很不安全

正向區域數據文件:

$TTL 600
@ 	IN 	SOA	ns1.linzb.com. 	admin.linzb.com. (
						2 
						1H
	 					2W
	 					3D
	 					600 )
	IN	NS	ns1
	IN	NS	ns2
ns1	IN	A	192.168.1.207
ns2	IN	A	192.168.1.202
www	IN	A	192.168.1.4
test	IN	CNAME	www

    注意:這裏必須增加從服務器的dns服務器(ns2)位置,否則主dns服務更新時不能通知給從服務器,此時只有等待refresh時間到才能更新


反向區域文件:

$TTL 600
@	IN	SOA	ns1.linzb.com. admin.linzb.com (
						4
						1H
	 					2W
	 					3D
	 					600 )
	IN	NS	ns1.linzb.com.
	IN	NS	ns2.linzb.com.
201	IN	PTR	ns1.linzb.com.
201	IN	PTR	ns2.linzb.com.
4	IN	PTR	www.linzb.com.	


從服務器的named.conf配置:

options {
	listen-on { 192.168.1.202;};
	directory "/var/named";
};
zone "linzb.com" IN {
	type slave;
	file  "slaves/linzb.com.zone";
	masters { 192.168.1.201; }; 
};
zone "1.168.192.in-addr.arpa" IN {
	type slave;
	file  "slaves/192.168.1.zone";
	masters { 192.168.1.201; }; 
};

    從的配置文件中每個zone都必須指明自己的master是誰,且type爲slave

    注意:之所以把file放在slaves下並不是個人的惡趣味,而是因爲 /var/named下的屬主是root,而從服務器的區域數據文件是從主服務器cp過來的,是需要寫權限的,/var/named/slaves的屬主是named,且具有寫權限。當然,也可以自定義

    啓動即可看到slaves下有主的區域文件,如果沒有,可以根據messages日誌進行排查。


測試注意點:

    測試更新主dns數據的時候,記得修改serial 值,因爲主從更新是根據這個值的不同來的,而且記得reload服務。


rndc工具的使用:

    rndc是一款dns的遠程控制軟件,它的配置非常簡單:

    rndc-confgen > rndc.conf #這個命令會生成rndc的配置文件,並保存在rndc.conf裏面,內容如下:

# Start of rndc.conf
key "rndc-key" {
	algorithm hmac-md5;
	secret "m7nOOKs/GoLwAbDLPEXRGw==";
};

options {
	default-key "rndc-key";
	default-server 127.0.0.1;
	default-port 953;
};
# End of rndc.conf

# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
# 	algorithm hmac-md5;
# 	secret "m7nOOKs/GoLwAbDLPEXRGw==";
# };
# 
# controls {
# 	inet 127.0.0.1 port 953
# 		allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf


    把key "rndc-key"下面的內容複製到named.conf,並reload named服務,named.conf的內容如下:

options {
	directory "/var/named";
	listen-on {192.168.1.201;};
	allow-transfer {192.168.1.202;};
};
zone "." IN {
	type hint;
	file "named.ca";
};
zone "linzb.com" IN {
	type master;
	file "linzb.com.zone";
};
zone "1.168.192.in-addr.arpa" IN {
	type master;
	file "192.168.1.zone";
};
key "rndc-key" {
 	algorithm hmac-md5;	#加密算法
 	secret "Y5IFaDF+1lu6jDdbVCUHoQ==";#密鑰,可自定義,但是必須和rndc.conf保持一致
};

controls {
	inet 127.0.0.1 port 953	#監聽端口
		allow { 127.0.0.1; } keys { "rndc-key"; };	#允許哪些主機使用
};


使用:

    Usage: rndc [-b address] [-c config] [-s server] [-p port]

        [-k key-file ] [-y key] [-V] command

    h:查看幫助

    -c:指定配置文件,默認/etc/rndc.conf

    command:有reload,stop等

    

例子:

    [root@indexer named]# rndc reload

    server reload successful


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章