嘔心瀝血之作:DNS and BIND配置指南

前言

    說來接觸Linux也有一年了,BIND是我曾經學習RH系Linux接觸的第一個服務,對我有着莫大的意義,當初差點因爲這個服務難以配置而放棄Linux,今天學完馬哥的bind相關係列視頻之後,寫一篇DNS and BIND的基礎到進階。



一、DNS的基礎知識

  1. DNS是什麼?

    DNS(Domain Name System)是Internet發展多年以來最重要的服務之一,它作爲將域名和IP地址相互映射的一個分佈式數據庫,能夠使人更方便地訪問互聯網。DNS使用TCP和UDP端口53

  2. 域名解析

    簡單來說,DNS就像是一個通訊錄,AnyISalIn的電話是1829888****,有了通訊錄,我們只需通過輸入AnyISalIn這個名字就能夠自動撥打其電話。DNS主要是用來定義IP地址和域名的關係。

  3. DNS資源記錄類型

    SOA:起始授權記錄,一個區域的解析庫中有且只能有一條SOA記錄,必須爲解析庫中的第一條記錄,定義主DNS服務器地址和相關事件時間定義。

    A:實現FQDN ==> IP 

    MX:標明提供郵件服務的主機

    NS:標明當前域內的DNS服務器

    AAAA:FQDN ==> IPv6

    CNAME:Canonical Name,別名記錄

    PTR:IP ==> FQDN

  4. DNS解析答案類型

    肯定答案:正確解析了請求的內容

    否定答案:請求的條目不存在等原因無法返回結果

    權威答案:通過迭代的方式從所查詢域名的所在域的DNS服務器返回的結果

    非權威答案:請求的DNS服務器緩存的結果

  5. DNS資源記錄定義方法

    A記錄:IP IN  A Value ; 示例:192.168.1.1 IN A www.anyisalin.com.

    NS記錄:domain IN NS Value; 示例:anyisalin.com. IN  NS ns1.anyisalin.com. #一條NS記錄必須要有一條與之對應的A記錄

    MX記錄:domain IN NS priority Value; 示例:anyisalin.com. IN  MX 10 mail1.anyisalin.com. #一條MX記錄必須要有與之對應的A記錄, 優先級0-99,越低優先級越高

    PTR記錄:IP.in-addr.arpa. IN PTR Value; 示例:1.1.168.192.in-addr.arpa. IN PTR www.anyisalin.com. #PTR記錄的寫法比較詭異,我們在後面進行敘述

    AAAA記錄:和A記錄相似,只是將IPv4地址換爲IPv6


二、DNS的結構

blob.png

    上圖爲當今Internet中的DNS的結構,最多可分達127層,朋友們別看上圖中的www.anyisalin.com.和ns.anyisalin.com.相距很近,其實他們可能各自在天南地北。DNS的各層只是邏輯上的關係,不存在物理上的界定 。

    在DNS各域中只包含其子域的信息,例如 "."域中的解析庫只包含全球所有頂級域對對應的NS服務器的信息、 並且不知道父域的位置,例如:www.anyisalin.com. 不知道anyisalin.com.的具體位置(NS服務器的IP)

    

主從DNS:

    一個域的DNS一般情況下都有兩個,主DNS提供解析庫中信息,從DNS進行"區域傳送"來同步其解析庫,來達到負載均衡和高可用的效果。區域傳送分爲全量傳送和增量傳送,相信大家應該能夠見名思意,這裏不做過多敘述。

    

DNS解析過程:

    DNS查詢分別有兩種方式,"迭代"和"遞歸"。

        遞歸:DNS客戶端使用的DNS服務器一般都是遞歸服務器,負責全權處理客戶端的查詢請求直至返回結果

        迭代:DNS服務器之間的查詢方式,從根服務器開始向下級查詢

        1178254252527878317.jpg


三、BIND安裝和基礎配置

    前面我們介紹了DNS的一些基礎知識,但是DNS是一種模型,需要使用軟件去實現。BIND(Berkeley Internet Name Domain)就是一伴隨着DNS出生到現在的軟件,本文使用bind9.8。


  1. 安裝bind

[root@localhost ~]# yum install -y bind bind-utils     
Loaded plugins: fastestmirror, security
Setting up Install Process
Loading mirror speeds from cached hostfile
 * base: mirrors.opencas.cn
 * extras: mirrors.pubyun.com
 * updates: mirrors.163.com
updates                                                                                                                                                               | 3.4 kB     00:00     
Package 32:bind-utils-9.8.2-0.37.rc1.el6_7.7.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package bind.x86_64 32:9.8.2-0.37.rc1.el6_7.7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=============================================================================================================================================================================================
 Package                                Arch                                     Version                                                     Repository                                 Size
=============================================================================================================================================================================================
Installing:
 bind                                   x86_64                                   32:9.8.2-0.37.rc1.el6_7.7                                   updates                                   4.0 M
Transaction Summary
=============================================================================================================================================================================================
Install       1 Package(s)
Total download size: 4.0 M
Installed size: 7.3 M
Downloading Packages:
bind-9.8.2-0.37.rc1.el6_7.7.x86_64.rpm                                                                                                                                | 4.0 MB     00:03     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : 32:bind-9.8.2-0.37.rc1.el6_7.7.x86_64                                                                                                                                     1/1 
  Verifying  : 32:bind-9.8.2-0.37.rc1.el6_7.7.x86_64                                                                                                                                     1/1 
Installed:
  bind.x86_64 32:9.8.2-0.37.rc1.el6_7.7                                                                                                                                                      
Complete!


查看生成的關鍵文件


[root@localhost ~]# rpm -ql bind
/etc/NetworkManager/dispatcher.d/13-named
/etc/logrotate.d/named
/etc/named    
/etc/named.conf    #bind主配置文件
/etc/named.iscdlv.key
/etc/named.rfc1912.zones    #定義zone的文件
/etc/named.root.key
/etc/portreserve/named
/etc/rc.d/init.d/named    #bind腳本文件
/etc/rndc.conf    #rndc配置文件
/etc/rndc.key
/etc/sysconfig/named
/usr/lib64/bind
/usr/sbin/arpaname
/usr/sbin/ddns-confgen
/usr/sbin/dnssec-dsfromkey
/usr/sbin/dnssec-keyfromlabel
/usr/sbin/dnssec-keygen
/usr/sbin/dnssec-revoke
/usr/sbin/dnssec-settime
/usr/sbin/dnssec-signzone
/usr/sbin/genrandom
/usr/sbin/isc-hmac-fixup
/usr/sbin/lwresd
/usr/sbin/named
/usr/sbin/named-checkconf    #檢測/etc/named.conf文件語法
/usr/sbin/named-checkzone    #檢測zone和對應zone文件的語法
/usr/sbin/named-compilezone
/usr/sbin/named-journalprint
/usr/sbin/nsec3hash
/usr/sbin/rndc    #遠程dns管理工具
/usr/sbin/rndc-confgen    #生成rndc密鑰

#過長省略

/var/log/named.log
/var/named
/var/named/data
/var/named/dynamic
/var/named/named.ca    #根解析庫
/var/named/named.empty
/var/named/named.localhost    #本地主機解析庫
/var/named/named.loopback    
/var/named/slaves    #從文件夾
/var/run/named
[root@localhost ~]# rpm -ql bind-utils    #bind-utils包主要提供了一些檢測工具
/usr/bin/dig    
/usr/bin/host    
/usr/bin/nslookup   
/usr/bin/nsupdate
/usr/share/man/man1/dig.1.gz
/usr/share/man/man1/host.1.gz
/usr/share/man/man1/nslookup.1.gz
/usr/share/man/man1/nsupdate.1.gz


手動創建bind主配置文件

[root@localhost etc]# vim named.conf    #不熟悉的可以直接通過修改原始的配置文件
options {
  directory "/var/named";
 
  };    
zone "." IN {
  type hint;
  file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";


定義一個zone

[root@localhost etc]# cat >> /etc/named.rfc1912.zones << EOF    #這裏使用Here Document,不懂得可以搜素
> zone "anyisalin.com" IN {            #定義區域爲anyisalin.com
>    type master;                    #設置類型爲master
>    file "anyisalin.com.zone";        #解析庫文件名稱爲anyisalin.com.zone
> };
> EOF


創建區域解析庫文件

[root@localhost etc]# vim /var/named/anyisalin.com.zone 
$TTL 600    #定義全局默認超時時間
$ORIGIN anyisalin.com.    #定義後綴
@   IN  SOA    ns1.anyisalin.com.  admin.anyisalin.com. (
                20160321    #序列號
                1H    #刷新時間
                5M    #重試時間
                1W    #超時時間
                10M )    #否定答案緩存TTL值
        IN      NS      ns1
ns1     IN      A       192.168.192.150
        IN      MX 10   mail1
mail1   IN      A       192.168.192.1
www     IN      A       192.168.192.2
cname   IN      CNAME   www                #別名, 將cname.anyisalin.com. 解析到 www.anyisalin.com.的地址
*       IN      A       192.168.2.1    #泛域名解析,以上都不是的解析到192.168.2.1


檢查、啓動並測試


[root@localhost etc]# named-checkconf     #檢查主配置文件語法
[root@localhost etc]# named-checkzone "anyisalin.com" /var/named/anyisalin.com.zone     #檢查anyisalin.com zone所對應的解析庫文件
zone anyisalin.com/IN: loaded serial 20160321
OK
[root@localhost etc]# service named start
Starting named:                                            [  OK  ]


解析域名

[root@localhost etc]# host -t A www.anyisalin.com 192.168.192.150    #解析www.anyisalin.com 對應的主機IP
Using domain server:
Name: 192.168.192.150
Address: 192.168.192.150#53
Aliases: 
www.anyisalin.com has address 192.168.192.2        #得出ip爲192.168.192.2
[root@localhost etc]# host -t NS anyisalin.com 192.168.192.150    #查詢anyisalin.com域內的NS記錄
Using domain server:
Name: 192.168.192.150
Address: 192.168.192.150#53
Aliases: 
anyisalin.com name server ns1.anyisalin.com.    #ns1.anyisalin.com. 爲其dns服務器



四、區域傳送和子域授權

    上面我們已經講過,一個域內的DNS服務器一般都需要兩個,我們這裏就進行主從配置和區域傳送


在從服務器安裝bind並創建bind主配置文件

[root@localhost etc]# vim named.conf    #不熟悉的可以直接通過修改原始的配置文件
options {
  directory "/var/named";
 
  };    
zone "." IN {
  type hint;
  file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";


定義zone

[root@localhost named]# cat >> /etc/named.rfc1912.zones <<EOF        #這裏定義方式和主服務器的配置略有不同
> zone "anyisalin.com" IN {
>   type slave;
>   masters { 192.168.192.150; };    #定義主服務器的IP地址
>   file "slaves/anyisalin.com.zone";    #定義傳送文件的存放位置,必須要和源文件相同
>  };
> EOF


在主服務器的解析庫中添加一條NS記錄指向從服務器的地址

[root@localhost etc]# vim /var/named/anyisalin.com.zone     #在主服務上執行!!!
$TTL 600
$ORIGIN anyisalin.com.
@   IN	SOA    ns1.anyisalin.com.  admin.anyisalin.com. (
		20160321
		1H
		5M
		1W
		10M )

	IN	NS	ns1
        IN      NS  ns2                #添加ns2記錄
ns1	IN	A	192.168.192.150
ns2     IN     A   192.168.192.147        #添加ns2對應的A記錄
	IN	MX 10 	mail1
mail1	IN	A	192.168.192.1
www	IN	A	192.168.192.2
cname	IN	CNAME	www
*	IN	A	192.168.2.1


[root@localhost etc]# rndc reload    #重載配置文件
server reload successful


啓動bind服務


從下面的動態圖可以看傳送過程

若水GIF截圖_2016年3月21日18點18分46秒.gif




增量傳送, #增量傳送需要修改序列號!


若水GIF截圖_2016年3月21日18點26分49秒.gif



子域授權


在主dns服務器添加兩條記錄

vim /var/named/anyisalin.com.zone
$TTL 600
$ORIGIN anyisalin.com.
@   IN  SOA    ns1.anyisalin.com.  admin.anyisalin.com. (
                20160324
                1H
                5M
                1W
                10M )
        IN      NS      ns1
        IN      NS      ns2
ns1     IN      A       192.168.192.150
ns2     IN     A   192.168.192.147
        IN      MX 10   mail1
mail1   IN      A       192.168.192.1
www     IN      A       192.168.192.2
cname   IN      CNAME   www
*       IN      A       192.168.2.1
new     IN      A       192.168.1.1
ops     IN      NS      ns1.ops        #添加一條NS記錄將ops.anyisalin.com. 域授權給ns1.ops.anyisalin.com.進行管理
ns1.ops IN      NS      192.168.192.151    #對應上條的NS記錄的A記錄


在ns1.ops.anyisalin.com.主機上進行配置

vim /etc/named.conf        #配置bind主配置文件
options {
  directory "/var/named";
  };    
zone "." IN {
  type hint;
  file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";


[root@localhost ~]# cat >> /etc/named.rfc1912.zones <<EOF    #定義zone
> zone "ops.anyisalin.com" IN {
>    type master;
>    file "ops.anyisalin.com.zone";
> };
> EOF
[root@localhost named]# cat ops.anyisalin.com.zone     #定義解析庫
$TTL 600
$ORIGIN ops.anyisalin.com.
@	IN	SOA	ns1.ops.anyisalin.com.	admin.ops.anyisalin.com. (
		20160321
		1H
		5M
		7D
		1H
)


	IN	NS	ns1
ns1	IN	A	192.168.192.151
www	IN	A	192.168.1.1


測試

[root@localhost named]# service named start
Starting named:                                            [  OK  ]

通過本機解析本域主機名
[root@localhost named]# host -t A www.ops.anyisalin.com 192.168.192.151
Using domain server:
Name: 192.168.192.151
Address: 192.168.192.151#53
Aliases: 
www.ops.anyisalin.com has address 192.168.1.1

通過父域DNS解析本域下的主機名

[root@localhost named]# host -t A www.ops.anyisalin.com 192.168.192.150
Using domain server:
Name: 192.168.192.150
Address: 192.168.192.150#53
Aliases: 

www.ops.anyisalin.com has address 192.168.2.1

通過本機DNS解析父域中的主機名
[root@localhost named]# host -t A www.anyisalin.com 192.168.192.151
;; connection timed out; trying next origin
Using domain server:
Name: 192.168.192.151
Address: 192.168.192.151#53
Aliases: 

Host www.anyisalin.com not found: 3(NXDOMAIN)


但是我們可能會發現一個問題,如果我需要解析父域中的主機名,只能通過遞歸到根域去解析,這是非常不便的,所以我們要設置轉發器。


[root@localhost named]# cat >> /etc/named.rfc1912.zones <<EOF    #定義轉發器
> zone "anyisalin.com" IN {
>     type forward;
>     forward  only ;
>     forwarders { 192.168.192.150; };
> };
> EOF


重載、測試

[root@localhost named]# rndc reload    #重載配置文件
server reload successful
[root@localhost named]# host -t A www.anyisalin.com 192.168.192.151    #使用本機進行解析
Using domain server:
Name: 192.168.192.151
Address: 192.168.192.151#53
Aliases: 
www.anyisalin.com has address 192.168.192.2    #現在能夠得出結果



五、BIND視圖實現智能DNS

    大家都知道,中國的運營商之間的帶寬是非常低,但是無論我們是哪個運營商的寬帶,訪問那些大型電商站點都是非常的快,那是因爲在dns服務器中定義了來自哪些IP的請求解析成哪些地址,這就是視圖的功能。

    

配置視圖:

1、一旦啓動了view, 所有的zone都只能在view中定義
2、僅有必要在匹配到允許遞歸請求的客戶所在view定義根區域
3、客戶端請求到達, 是自上而下檢查每個view所服務器的客戶端列表

[root@localhost etc]# vim /etc/named.conf    #修改主配置文件
acl mynet {

        192.168.192.150;
        127.0.0.0/8;
};

acl other {
        192.168.192.1;
};




options {
  directory "/var/named";

   dnssec-enable no;
   dnssec-validation no;

  };   
view "." {
match-clients { mynet; };
zone "." IN {
  type hint;
  file "named.ca";
};
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

vim /etc/named.rfc.1912.zones    #配置主配置文件
view mynet {    
 match-clients { mynet; };

zone "localhost.localdomain" IN {
	type master;
	file "named.localhost";
	allow-update { none; };
};

zone "localhost" IN {
	type master;
	file "named.localhost";
	allow-update { none; };
};

zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
	type master;
	file "named.loopback";
	allow-update { none; };
};

zone "1.0.0.127.in-addr.arpa" IN {
	type master;
	file "named.loopback";
	allow-update { none; };
};

zone "0.in-addr.arpa" IN {
	type master;
	file "named.empty";
	allow-update { none; };
};

zone "anyisalin.com" IN {
   type master;
   file "anyisalin.com.zone";
};
};

view other {
 match-clients { other; };
zone "anyisalin.com" IN {
  type master;
  file "anyisalin.com.other";
};
};

驗證

blob.png

blob.png


六、bind編譯安裝和安全配置


編譯安裝相關博客==> 教你使用rpm、yum、編譯等方式安裝軟件


我們通過isc.org下載bind9.9.5的安裝包

yum groupinstall "Development Tools" "Server Platform Development" --nogpgcheck    #安裝開發環境
tar xf bind-9.9.5.tar.gz #解壓源碼包

cd bind-9.9.5

./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named/ --disable-ipv6 --disable-chroot --enable-threads    #配置config文件

useradd -u 53 named -r ; groupadd -g 53 named -r     #創建named用戶和組

make && make install     #編譯和配置

export PATH=/usr/local/bin9/bin:/usr/local/bin9/sbin:$PATH    #將bind的執行路徑加入PATH中
source /etc/bashrc    #重讀bash配置文件

echo "/usr/local/bind9/lib" > /etc/ld.so.conf.d/bind.conf    #導入庫文件路徑

echo "MANPATH /usr/local/bind9/share/man" >> /etc/man.config    #導入manual文件路徑


新建主配置文件

vim /etc/named/named.conf
options {
  directory "/var/named";
  
  };    
zone "." IN {
  type hint;
  file "named.ca";
};

zone "localhost" IN {
    type master;
    file "localhost.zone";
    };

zone "0.0.127.in-addr.arpa {
    type master;
    file "name.local";
    };


[root@localhost bind9]# /usr/local/bind9/sbin/named-checkconf     #檢查配置文件,提示沒有文件夾
/etc/named/named.conf:2: change directory to '/var/named' failed: file not fou
nd
/etc/named/named.conf:2: parsing failed
[root@localhost bind9]# mkdir /var/named    #創建/var/named
[root@localhost bind9]# /usr/local/bind9/sbin/named-checkconf    #檢測通過


手動創建zone文件
[root@localhost bind9]# cd /var/named/

[root@localhost named]# dig -t NS . @192.168.1.1    #通過dig命令獲取根服務器地址

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t NS . @192.168.1.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43106
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;.				IN	NS

;; ANSWER SECTION:
.			12787	IN	NS	m.root-servers.net.
.			12787	IN	NS	d.root-servers.net.
.			12787	IN	NS	i.root-servers.net.
.			12787	IN	NS	k.root-servers.net.
.			12787	IN	NS	a.root-servers.net.
.			12787	IN	NS	e.root-servers.net.
.			12787	IN	NS	c.root-servers.net.
.			12787	IN	NS	b.root-servers.net.
.			12787	IN	NS	h.root-servers.net.
.			12787	IN	NS	g.root-servers.net.
.			12787	IN	NS	f.root-servers.net.
.			12787	IN	NS	l.root-servers.net.
.			12787	IN	NS	j.root-servers.net.

;; Query time: 78 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Mon Mar 21 19:29:53 2016
;; MSG SIZE  rcvd: 228

[root@localhost named]# dig -t NS . @192.168.1.1 > named.ca    #將根服務器解析庫重定向到named.ca文件中


創建localhost.zone文件

[root@localhost named]# vim localhost.zone
$TTL 600
@       IN      SOA     localhost. admin.localhost. (
        20160321
        1H
        5M
        7D
        1H
)

                IN      NS      localhost.
localhost.      IN      A       127.0.0.1

創建named.local文件
$TTL 600
@       IN      SOA     localhost. admin.localhost. (
        20160321
        1H
        5M
        7D
        1H
)

                IN      NS      localhost.
1               IN      PTR     localhost.


修改屬主和權限

[root@localhost named]# chown root:named /var/named/ -R 
[root@localhost named]# chmod 770 /var/named/ -R
[root@localhost named]# chown root:named /etc/named/ -R


運行bind程序
[root@localhost bind9]# /usr/local/bind9/sbin/named -u named

查看監聽端口
[root@localhost ~]# ss -unlp | grep 53
UNCONN     0      0           192.168.192.152:53                       *:*      users:(("named",
6949,513))UNCONN     0      0                 127.0.0.1:53                       *:*      users:(("named",
6949,512)



bind安全配置:

    

訪問控制命令:
allow-query {}; 允許查詢的主機, 白名單
allow-transfer {}; 允許區域傳送主機, 白名單
allow-recursion {}; 允許遞歸的主機
allow-update {}; 允許更新區域數據庫中的內容


allow-query 測試:

blob.png

blob.png

blob.png



allow-transfer測試:

blob.png

blob.png

blob.png




總結

    還有很多沒有寫,本文寫了大概5小時,前面還行,後面有些偷工減料,總的來說還行,理論的東西不多。



    參考資料:wiki百科,馬哥Linux 2016視頻,相關筆記,百度圖庫

    歡迎大家加我QQ交流:1449472454



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