天天看點

DNS服務及基于BIND的實作

1、DNS 概述

1.1、DNS的出現及演化

    網絡出現的早期是使用IP位址通訊的,那時就幾台主機通訊。但是随着接入網絡主機的增多,這種數字辨別的位址非常不便于記憶,UNIX上就出現了建立一個叫做hosts的檔案(Linux和Windows也繼承保留了這個檔案)。這個檔案中記錄着主機名稱和IP位址的對應表。這樣隻要輸入主機名稱,系統就會去加載hosts檔案并查找對應關系,找到對應的IP,就可以通路這個IP的主機了。

    但是後來主機太多了,無法保證所有人都能拿到統一的最新的hosts檔案,就出現了在檔案伺服器上集中存放hosts檔案,以供下載下傳使用。網際網路規模進一步擴大,這種方式也不堪重負,而且把所有位址解析記錄形成的檔案都同步到所有的客戶機似乎也不是一個好辦法。這時DNS系統出現了,随着解析規模的繼續擴大,DNS系統也在不斷的演化,直到現今的多層架構體系。

1.2、DNS是什麼

    DNS(Domain Name System),即域名系統。它使用層次結構的命名系統,将域名和IP位址互相映射,形成一個分布式資料庫系統。

DNS服務及基于BIND的實作

    DNS采用CS架構,伺服器端工作在UDP協定端口53和TCP協定端口53上。

    FQDN(Fully Qualified Domain Name)完全限定域名,它是使用DNS的樹狀層級結構的完全路徑域名來表示一個準确位置對應的主機。

    提供正向解析(FQDN-->IP)和反向解析(IP-->FQDN)的功能。

    目前DNS已經成為了網際網路通訊的基礎服務。

1.3、網際網路DNS通路模型

    DNS伺服器采用分布式資料結構儲存着海量的名稱,那麼使用者如何快速的在網際網路上通路哪台伺服器或者哪些伺服器就能找到待解析的資料呢?

DNS服務及基于BIND的實作

客戶機發起對www.kernel.org的解析請求

(1)客戶機首先檢視查找本地hosts檔案,如果有則傳回,否則進行下一步

(2)客戶機檢視本地緩存,是否存在本條目的緩存,如果有則直接傳回,不再向外送出請求,否則進行下一步,轉發。

(3)将請求轉發本地DNS伺服器。

(4)檢視域名是否本地解析,是則本地解析傳回,否則進行下一步。

(5)本地DNS伺服器首先在緩存中查找,有則傳回,無則進行下一步。

(6)向全球某一個根域伺服器發起DNS請求,根域傳回org域的位址清單。

(7)使用某一個org域的IP位址,發起DNS請求,org域傳回kernel域伺服器位址清單。

(8)使用某一個kernel域IP位址,發起DNS請求,kernel域傳回www.kernel.org主機的IP位址,本地DNS服務收到後,傳回給客戶機。

以上客戶機和本地DNS伺服器直接的查詢方式,稱為遞歸查詢。

本地DNS伺服器多次重複查詢的方式,稱為疊代查詢。

1.4、DNS的分類:

主DNS伺服器:就是一台存儲着原始資料的DNS伺服器。

從DNS伺服器:使用自動更新方式從主DNS伺服器同步資料的DNS伺服器。也成輔助DNS伺服器。

緩存伺服器:不負責本地解析,采用遞歸方式轉發客戶機查詢請求,并傳回結果給客戶機的DNS伺服器。同時緩存查詢回來的結果,也叫遞歸伺服器。

轉發器:這台DNS發現非本機負責的查詢請求時,不再向根域發起請求,而是直接轉發給指定的一台或者多台伺服器。自身并不緩存查詢結果。

1.5、一些術語和概念

權威DNS伺服器:它是負責對某區域能夠進行解析,并在父區域中存儲着NS記錄的主或者從伺服器。

權威應答AA(Authoritative Answer):權威伺服器給出的最終答案是就是權威答案,并用協定中的某個标志位表示。

授權:就是上一級将它的子域的管理授權給某一個特定的組織和機構,子域的記錄資訊就直接由該組織或機構管理的權威伺服器進行存儲和解析。在上一級中需要保留指向子域的記錄,這種記錄就稱為膠水記錄(Glue Record)。

1.6、RR(Resource Record)資源記錄

DNS層級結構中,不管是節點還是葉子節點都是資源,對這些資源中的某一個的辨別使用一定格式的多字段的一條記錄來表示,這條記錄就是資源記錄RR。RR的标準記錄在RFC 1034中。

1.6.1、RR的組成:

owner name 所屬名稱
type RR的類型
TTL 緩存RR的秒數(time-to-live)
class 表示一個協定或者一族協定,常用IN表示Internet
RDATA 記錄資料

1.6.2、RR中IN類(class)常見類型(type)

SOA 區域授權起始記錄,區域檔案第一條記錄,而且一個區域檔案隻能有一條
NS 域的授權名稱伺服器
MX 域的郵件交換器,要跟着一個優先級值,越小越高
A IPV4主機位址
AAAA IPV6主機位址
PTR 解析IP的指針
CNAME 權威(正式)名稱,定義别名記錄

1.6.3、常用指令

1、$TTL

TTL 可以在SOA之前使用該指令,給出TTL秒數的32位整數值。

2、$ORIGIN

設定域名,它必須出現在任何一行省略書寫的RR記錄前。當一個區域檔案第一次被讀取時,隐含這個指令的值為<zone_name>.(必須是跟着一個半角句号),如果不設定它,就必須在區域檔案中書寫FQDN。

例如

$ORIGIN kernel.org.

www     CNAME    web-server

就等同于

www.kernel.org.    CNAME    web-server.kernel.org.

3、@符号

@符号等價于$ORIGIN。

1.6.4、SOA的RDATA格式

MNAME 授權主機FQDN或者目前區域的名稱
RNAME 郵箱位址,@用.替代
SERIAL 區域傳送使用的版本号,格式為yyyymmddnn
REFRESH 從伺服器去同步主伺服器時間間隔
RETRY 重新整理失敗重試時間間隔
EXPIRE 從伺服器過期時長
MINIMUM 否定答案過期時長

百度的SOA

a.shifen.com.        579    IN    SOA    dns.baidu.com. sa.baidu.com.  (    

                      1408010001 ; serial number    

                      5 ; refresh 5s    

                      5 ; retry 5s    

                      86400 ; expire 1d    

                      3600 ;min TTL 1h    

)

1.6.5、NS的RDATA格式

NSDName:DNS的FQDN

baidu.com.        64899    IN    NS    ns2.baidu.com.    

baidu.com.        64899    IN    NS    ns4.baidu.com.    

baidu.com.        64899    IN    NS    dns.baidu.com.    

baidu.com.        64899    IN    NS    ns7.baidu.com.    

baidu.com.        64899    IN    NS    ns3.baidu.com.

1.6.6、MX的RDATA格式

PREFERENCE:優先級,越小越高

EXCHANGE:郵件伺服器FQDN

baidu.com.        7200    IN    MX    20 jpmx.baidu.com.    

baidu.com.        7200    IN    MX    20 mx50.baidu.com.    

baidu.com.        7200    IN    MX    10 mx.n.shifen.com.    

baidu.com.        7200    IN    MX    20 mx1.baidu.com.

1.6.7、CNAME的RDATA格式

CNAME:權威名稱,FQDN

www.baidu.com.        1154    IN    CNAME    www.a.shifen.com.

www.a.shifen.com是正式名稱,而www.baidu.com是别名

1.6.8、A的RDATA格式

ADDRESS:IP V4位址

www.baidu.com.        1154    IN    CNAME    www.a.shifen.com.    

www.a.shifen.com.    36    IN    A    111.13.100.92    

www.a.shifen.com.    36    IN    A    111.13.100.91

1.6.9、PTR的RDATA格式

7.100.in-addr.arpa.    IN     PTR    www.example.com.

2、BIND實作DNS服務

2.1、BIND是什麼

1984年,加州大學伯克利分校的幾個學生完成了Unix名稱服務的實作,起名叫做Berkeley Internet Name Domain(BIND)。目前,它是網際網路上使用最為廣泛的DNS服務軟體。

bind的發行版一般包含三個部分:域名伺服器、域名解析器庫、軟體測試工具。

2.2、DNS實驗

下面就安裝bind來完成整個DNS的實驗

2.2.1、前提:時間同步

在生産環境中,所有的伺服器需要使用同一的時鐘,一般會指向同一個時間源。時間源采用某種方式取得可靠準确的時間。

客戶機可以使用ntp服務或者在crontab中配置ntpdate完成來完成時間同步。

2.2.2、環境準備

本文介紹了2種安裝方式,源代碼編譯安裝需要依賴衆多開發庫,請使用yum安裝。将CentOSCD光牒挂載到/media/cdrom,配置本地yum源備用。配置yun請參看部落客博文 《Linux的程式安裝和包管理》,此類博文很多,這裡不再贅述。使用下面的語句安裝開發環境。

兩台伺服器分别安裝了CentOS 6.5,位址分别為192.168.60.133(源碼安裝)、192.168.60.134、192.168.60.171。

# yum groupinstall "Development tools" "Server Platform Development"

2.2.3、安裝BIND

2.2.3.1、rpm安裝bind(192.168.60.171和192.168.60.134)

預設bind的庫和工具已經安裝,但是伺服器軟體沒有安裝,可以使用yum -y install bind 。

安裝成功生成一下目錄和檔案:

服務腳本:/etc/rc.d/init.d/named

主配置檔案:/etc/named.conf

區域解析庫檔案:/etc/named.rfc1912.zones

服務根目錄:/var/named/

從伺服器使用的區域解析庫目錄:/var/named/slaves,權限特殊

服務腳本使用的檔案:

pid目錄:/var/run/named/,在其下建立named.pid檔案,使用時建立符号連結到其父目錄中,即/var/run/named.pid,由服務腳本産生。

鎖檔案:/var/lock/subsys/named,由服務腳本産生。

以上這些目錄和檔案,是rpm安裝的時候建立的,而且對這些檔案和目錄的權限做了很好的限定。對于配置檔案的配置,下面将逐一執行個體介紹,部分解釋在上面。

2.2.3.2、源代碼安裝(192.168.60.133上)

下載下傳bind的源碼,官網下載下傳位址http://www.isc.org/downloads/bind/,本次使用版本為bin-9.10.0-P2.tar.gz。

(1)安裝

configure的一些變量

    --prefix :預設在/usr/local

    --sysconfdir:預設在--prefix指定的目錄下,如果--prefix為空,就為/etc

    --localstatedir:預設在--prefix指定的目錄下,如果--prefix為空,就為/var

    --enable-threads:啟用多線程

    --disable-chroot:不支援chroot

1 2 3

# ./configure --prefix=/usr/local/named9.10 --sysconfdir=/etc/named9.10 --enable-threads --disable-chroot

# make && make install

# ln -s /etc/named9.10/ /etc/named

安裝完成  

(2)配置

編輯主配置檔案/etc/named/named.conf

1 2 3 4 5 6 7 8 9

options {

directory     "/var/named";

recursion yes;     

}

zone "." IN {   

type hint;

file "named.ca";

}

include "/etc/named/named.rfc1912.zones";

生成/etc/named/named.rfc1912.zones檔案,内容如下:

注意,此配置檔案中,file中定義的是路徑都是相對于上文中directory的路徑 /var/named 的。  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

zone "." IN {

type hint;

file "named.ca";

};

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; };

};

建立運作根目錄/var/named,準備基本的Zone檔案,根、localhost正反向解析

1 2 3

# mkdir /var/named    

# cd /var/named/     

# touch named.ca named.localhost named.loopback named.empty

在/var/named目錄中準備好這4個檔案    

named.ca,可以使用dig -t NS . @a.root-servers.net > named.ca 生成。但是要注意的是,dig指令是安裝了bind之後才有的,而且某些情況下,查詢根的NS記錄的指令傳回結果可能沒有A記錄和AAAA記錄,有可能被攔截。 named.ca内容如下:  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

; <<>> DiG 9.5.0b2 <<>> +bufsize=1200 +norec NS . @a.root-servers.net

;; global options:  printcmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34420

;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 20

;; OPT PSEUDOSECTION:

; EDNS: version: 0, flags:; udp: 4096

;; QUESTION SECTION:

;.              IN  NS

;; ANSWER SECTION:

.           518400  IN  NS  M.ROOT-SERVERS.NET.

.           518400  IN  NS  A.ROOT-SERVERS.NET.

.           518400  IN  NS  B.ROOT-SERVERS.NET.

.           518400  IN  NS  C.ROOT-SERVERS.NET.

.           518400  IN  NS  D.ROOT-SERVERS.NET.

.           518400  IN  NS  E.ROOT-SERVERS.NET.

.           518400  IN  NS  F.ROOT-SERVERS.NET.

.           518400  IN  NS  G.ROOT-SERVERS.NET.

.           518400  IN  NS  H.ROOT-SERVERS.NET.

.           518400  IN  NS  I.ROOT-SERVERS.NET.

.           518400  IN  NS  J.ROOT-SERVERS.NET.

.           518400  IN  NS  K.ROOT-SERVERS.NET.

.           518400  IN  NS  L.ROOT-SERVERS.NET.

;; ADDITIONAL SECTION:

A.ROOT-SERVERS.NET. 3600000 IN  A   198.41.0.4

A.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:503:ba3e::2:30

B.ROOT-SERVERS.NET. 3600000 IN  A   192.228.79.201

C.ROOT-SERVERS.NET. 3600000 IN  A   192.33.4.12

D.ROOT-SERVERS.NET. 3600000 IN  A   128.8.10.90

E.ROOT-SERVERS.NET. 3600000 IN  A   192.203.230.10

F.ROOT-SERVERS.NET. 3600000 IN  A   192.5.5.241

F.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:500:2f::f

G.ROOT-SERVERS.NET. 3600000 IN  A   192.112.36.4

H.ROOT-SERVERS.NET. 3600000 IN  A   128.63.2.53

H.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:500:1::803f:235

I.ROOT-SERVERS.NET. 3600000 IN  A   192.36.148.17

J.ROOT-SERVERS.NET. 3600000 IN  A   192.58.128.30

J.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:503:c27::2:30

K.ROOT-SERVERS.NET. 3600000 IN  A   193.0.14.129

K.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:7fd::1

L.ROOT-SERVERS.NET. 3600000 IN  A   199.7.83.42

M.ROOT-SERVERS.NET. 3600000 IN  A   202.12.27.33

M.ROOT-SERVERS.NET. 3600000 IN  AAAA    2001:dc3::35

;; Query time: 147 msec

;; SERVER: 198.41.0.4#53(198.41.0.4)

;; WHEN: Mon Feb 18 13:29:18 2008

;; MSG SIZE  rcvd: 615

named.localhost 内容如下: 

1 2 3 4 5 6 7 8 9 10

$TTL 1D     

@    IN SOA    @ rname.invalid. (

0    ; serial                         

1D    ; refresh                         

1H    ; retry                         

1W    ; expire                         

3H )    ; minimum

NS    @         

A    127.0.0.1         

AAAA    ::1

named.loopback 内容如下:  

1 2 3 4 5 6 7 8 9 10

$TTL 1D     

@    IN SOA    @ rname.invalid. (

0    ; serial

1D    ; refresh

1H    ; retry

1W    ; expire

3H )    ; minimum

NS    @

A    127.0.0.1         

AAAA    ::1         PTR    localhost.

named.empty 内容如下:  

1 2 3 4 5 6 7 8 9 10

$TTL 3H     

@    IN SOA    @ rname.invalid. (

0    ; serial                         

1D    ; refresh                         

1H    ; retry                         

1W    ; expire                         

3H )    ; minimum         

NS    @         

A    127.0.0.1         

AAAA    ::1

檢查配置檔案  

1 2 3 4 5 6 7 8 9 10 11 12

# named-checkconf      

# named-checkzone "localhost" named.localhost

zone localhost

/IN

: loaded serial 0     

OK     

# named-checkzone "localhost.localdomain" named.localhost

zone localhost.localdomain

/IN

: loaded serial 0     

OK

# named-checkzone "1.0.0.127.in-addr.arpa" named.loopback      zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0     

OK     

# named-checkzone "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" named.loopback      

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

: loaded serial 0     

OK

可以開始測試運作named了,由于是編譯安裝,并沒有提供服務腳本,不能使用service啟動named。

(3)工作環境配置

    1)導出環境變量  

在/etc/profile.d下建立檔案named9.10.sh    

1 2

PATH=/usr/local/named9.10/bin:/usr/local/named9.10/sbin:$PATH     

export PATH

重新開機會話連接配接,echo $PATH,傳回如下:  

1

/usr/lib64/qt-3.3/bin:/usr/local/named9.10/bin:/usr/local/named9.10/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

這樣就把bind提供的衆多指令加入到了搜尋路徑中了,友善使用    

    2)幫助檔案導出

編輯/etc/man.config,添加下面的語句。    

1

MANPATH /usr/local/named9.10/share/man

    3)增加系統使用者群組    

1 2

# groupadd -g 53 -r named     

# useradd -M -g named -r -u 53 named

(4)第一次啟動

使用-g選項,讓服務運作于前台,便于查錯  

1

# named -g -u named

發現幾個問題  

1 2 3 4 5 6 7

09-Aug-2014 03:29:52.385 couldn't mkdir '/usr/local/named9.10/var/run/named': Permission denied    

09-Aug-2014 03:29:52.385 generating session key for dynamic DNS    

09-Aug-2014 03:29:52.385 couldn't mkdir '/usr/local/named9.10/var/run/named': Permission denied    

09-Aug-2014 03:29:52.385 could not create /usr/local/named9.10/var/run/named/session.key    

09-Aug-2014 03:29:52.385 failed to generate session key for dynamic DNS: permission denied

09-Aug-2014 03:29:52.419 configuring command channel from '/etc/named9.10/rndc.key'   

09-Aug-2014 03:29:52.419 couldn't add command channel ::1#953: file not found

權限問題,執行下面語句

1 2 3 4 5 6

# chown -R named:named /usr/local/named9.10/var/    

# mkdir /var/named/slaves     

# chown -R :named /var/named/     

# chown named:named /var/named/slaves     

# chmod -R o-rwx /var/named/     

# chown :named /etc/named9.10/

開始測試

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

# dig -t A localhost @192.168.60.133

; <<>> DiG 9.10.0-P2 <<>> -t A localhost @192.168.60.133    

;; global options: +cmd     

;; Got answer:     

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, 

id

: 46079     

;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:    

; EDNS: version: 0, flags:; udp: 4096   

;; QUESTION SECTION:     

;localhost.            IN    A

;; ANSWER SECTION:    

localhost.        86400    IN    A    127.0.0.1

;; AUTHORITY SECTION:    

localhost.        86400    IN    NS    localhost.

;; ADDITIONAL SECTION:    

localhost.        86400    IN    AAAA    ::1

;; Query 

time

: 2 msec    

;; SERVER: 192.168.60.133

#53(192.168.60.133)

;; WHEN: Sat Aug 09 04:50:22 CST 2014     

;; MSG SIZE  rcvd: 96

服務啟動成功。

以上配置好之後,基本達到了和rpm安裝同樣的狀态,可以開始試驗内容

3、實驗

3.1、實驗的内容

主從複制(區域傳送)、子域授權、轉發器、視圖

3.2、主從複制(區域傳送)

DNS服務及基于BIND的實作

(1)建立主DNS伺服器

修改named.rfc1912.zone檔案,在尾部添加

1 2 3 4 5 6

zone "example.org" IN {

type master;

file "example.org.zfile";

allow-update { 127.0.0.1; };

allow-transfer { 192.168.60.171; };

};

提供正向解析檔案

在/var/named/下建立檔案example.org.zfile,屬主數組為named,權限640  

1 2 3 4 5 6 7 8 9 10 11

$TTL 1H     

@       IN SOA ns1 admin (

2014080101 3600 600 86400 3600 )

IN NS ns1             

IN NS ns2             

IN MX 10 mail

ns1    IN A 192.168.60.133     

ns2    IN A 192.168.60.171     

mail   IN A 192.168.60.200     

www    IN A 192.168.60.110

1 2 3 4 5

# chown named:named example.org.zfile

# chmod 640 example.org.zfile

# named-checkzone "example.org" example.org.zfile

zone example.org

/IN

: loaded serial 2014080101

OK

提供反向解析檔案    

在主配置檔案中,追加以下内容    

1 2 3 4 5 6

zone "60.168.192.in-addr.arpa" IN {

type master;         

file "60.168.192.in-addr.arpa.ptrfile";         

allow-update { 127.0.0.1; };         

allow-transfer { 192.168.60.171; };     

};

1

# cp -p example.org.zfile 60.168.192.in-addr.arpa.ptrfile

1 2 3 4 5 6 7 8 9 10

$TTL 1H     

@       IN SOA ns1.example.com. admin.example.com. (

2014080101 3600 600 86400 3600 )

IN NS ns1.example.com.             

IN NS ns2.example.com.     

100 IN PTR ns1.example.com.     

101 IN PTR ns2.example.com.     

110 IN PTR www.example.com.     

200 IN PTR mail.example.com.

(2)RNDC

使用rndc(remote name domain controller)對named進行控制操作。預設工作TCP的953号端口,不安全,建議本地使用。

常用指令 :   

    reload 線上重新裝載配置檔案和zone檔案    

    reload zone  重新加載指定的zone    

    stop [-p] 安全停止named。使用-p傳回pid    

    flush 清除DNS緩存    

    status 顯示伺服器狀态

1 2 3

# rndc-confgen -r /dev/urandom > /etc/named/rndc.conf    

# chgrp named /etc/named/rndc.conf     

# chmod 440 /etc/named/rndc.conf

打開rndc.conf,将下面部分追加到/etc/named/named.conf尾部(要去除前面的#,即注釋)

1 2 3 4 5 6 7 8

key "rndc-key" {

algorithm hmac-md5;         

secret "I+gGCDDZ5OzuYTIj+bDu6g==";     

};

controls {

inet 127.0.0.1 port 953             

allow { 127.0.0.1; } keys { "rndc-key"; };     

};

(3)啟動DNS服務    

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

# named -u named     

# rndc status     

version: 9.10.0-P2 <

id

:d23ac043>     

boot 

time

: Fri, 08 Aug 2014 22:28:17 GMT     

last configured: Fri, 08 Aug 2014 22:28:17 GMT     

CPUs found: 2     

worker threads: 2     

UDP listeners per interface: 2     

number of zones: 103     

debug level: 0     

xfers running: 0     

xfers deferred: 0     

soa queries 

in

progress: 0     

query logging is OFF     

recursive clients: 0

/0/1000

tcp clients: 0

/100

server is up and running

使用以下指令測試

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

# dig -t SOA example.org @192.168.60.133    

# dig -t MX example.org @192.168.60.133     

# dig -t A www.example.org @192.168.60.133

# dig -x 192.168.60.110  @192.168.60.133

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -x 192.168.60.110 @192.168.60.133    

;; global options: +cmd     

;; Got answer:     

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, 

id

: 51009     

;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0

;; QUESTION SECTION:    

;110.60.168.192.

in

-addr.arpa.    IN    PTR

;; ANSWER SECTION:    

110.60.168.192.

in

-addr.arpa. 3600 IN    PTR    www.example.com.

;; AUTHORITY SECTION:    

60.168.192.

in

-addr.arpa. 3600    IN    NS    ns1.example.com.     

60.168.192.

in

-addr.arpa. 3600    IN    NS    ns2.example.com.

;; Query 

time

: 4 msec    

;; SERVER: 192.168.60.133

#53(192.168.60.133)     

;; WHEN: Fri Aug  8 17:06:25 2014     

;; MSG SIZE  rcvd: 110

(4)建立從DNS伺服器(rpm安裝的,192.168.60.171)

從伺服器的主配置檔案中,将這兩句改為如下,或者注釋掉。  

1 2 3 4 5 6 7 8 9 10 11

listen-on port 53 { any; };     

allow-query     { any; };

在/etc/named.rfc1912.zones中

zone "example.org" IN {

type slave;

file "slaves/example.org.zone";

masters { 192.168.60.133; };

allow-transfer { none; };

};

啟動服務

1

# service named start

檢視/var/named/slaves/,已經存在檔案example.org.zone了,内容為:    

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

# cat example.org.zone      

$ORIGIN .     

$TTL 3600    ; 1 hour     

example.org        IN SOA    ns1.example.org. admin.example.org. (

2014080101 ; serial          

3600       ; refresh (1 hour)   

600        ; retry (10 minutes)

86400      ; expire (1 day)

3600       ; minimum (1 hour)  )

NS    ns1.example.org. 

NS    ns2.example.org.

MX    10 mail.example.org.

$ORIGIN example.org.     

mail           A    192.168.60.200     

ns1            A    192.168.60.133     

ns2            A    192.168.60.171     

www            A    192.168.60.110

檢查是否能夠解析 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

# dig -t A www.example.org @192.168.60.171

; <<>> DiG 9.10.0-P2 <<>> -t A www.example.org @192.168.60.171    

;; global options: +cmd     

;; Got answer:     

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, 

id

: 36324     

;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:    

; EDNS: version: 0, flags:; udp: 4096     

;; QUESTION SECTION:     

;www.example.org.        IN    A

;; ANSWER SECTION:    

www.example.org.    3600    IN    A    192.168.60.110

;; AUTHORITY SECTION:    

example.org.        3600    IN    NS    ns2.example.org.     

example.org.        3600    IN    NS    ns1.example.org.

;; ADDITIONAL SECTION:    

ns1.example.org.    3600    IN    A    192.168.60.133     

ns2.example.org.    3600    IN    A    192.168.60.171

;; Query 

time

: 4 msec    

;; SERVER: 192.168.60.171

#53(192.168.60.171)

;; WHEN: Sat Aug 09 08:16:32 CST 2014     

;; MSG SIZE  rcvd: 128

3.3、子域授權及轉發器

DNS服務及基于BIND的實作

假設子域為tech.example.org  

在父域172.168.60.133中的example.org.zfile添加膠水記錄   

1 2 3 4 5 6 7 8 9 10 11 12 13 14

$TTL 1H     

@       IN SOA ns1 admin ( 

2014080105 3600 600 86400 3600)             

IN NS ns1             

IN NS ns2             

IN MX 10 mail     

tech    IN NS ns.tech     

ns.tech IN A 192.168.60.134

ns1     IN A 192.168.60.133    

ns2     IN A 192.168.60.171     

mail    IN A 192.168.60.200     

www     IN A 192.168.60.110

子域172.168.60.134中的/etc/named.rfc1912.zones中追加  

1 2 3 4

zone "tech.example.org" IN {

type master;         

file "tech.example.org.zone";

};

在/var/named下建立zone檔案tech.example.org.zone  

1 2 3 4 5 6 7

$TTL 3600     

@ IN SOA ns admin (  

2014080201 3600 600 86400 3600)

IN NS ns

ns     IN A 192.168.60.134

www    IN A 192.168.60.190

啟動子域(rpm安裝的)  

1

# service named start

重新裝載父域配置檔案    

1

# rndc reload

測試成功,解析有子域提供,傳回非權威答案   

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

# dig -t A www.tech.example.org @192.168.60.133

; <<>> DiG 9.10.0-P2 <<>> -t A www.tech.example.org @192.168.60.133    

;; global options: +cmd     

;; Got answer:     

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, 

id

: 34877     

;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:    

; EDNS: version: 0, flags:; udp: 4096     

;; QUESTION SECTION:     

;www.tech.example.org.        IN    A

;; ANSWER SECTION:    

www.tech.example.org.    3600    IN    A    192.168.60.190

;; AUTHORITY SECTION:    

tech.example.org.    3600    IN    NS    ns.tech.example.org.

;; ADDITIONAL SECTION:    

ns.tech.example.org.    3580    IN    A    192.168.60.134

;; Query 

time

: 1 msec    

;; SERVER: 192.168.60.133

#53(192.168.60.133)     

;; WHEN: Sat Aug 09 09:46:25 CST 2014     

;; MSG SIZE  rcvd: 98

3.4、轉發器配置

見子域授權圖

3.4.1、完全轉發

這裡有一個問題,使用子域的DNS服務,無法知曉父域,所有的非本域解析統統要去找根域。 

為了解決這個問題,可以将子域配置成為轉發器,除了子域本身以外的解析,全部轉發父域伺服器。

在/etc/named.conf中添加forward和forwarders。    

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

options {

listen-on port 53 { any; };         

listen-on-v6 port 53 { ::1; };         

directory     "/var/named";         

dump-file     "/var/named/data/cache_dump.db";             

statistics-file "/var/named/data/named_stats.txt";             

memstatistics-file "/var/named/data/named_mem_stats.txt";         

allow-query     { any; };          

// write here     

forward only;        

forwarders { 192.168.60.133; };

};

logging {

channel default_debug {

file "data/named.run";

severity dynamic;

};

};

zone "." IN {

type hint;

file "named.ca";

};

include "/etc/named.rfc1912.zones";

開始測試,本地轉發www.example.org的解析請求給父域,傳回非權威答案

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

# dig -t A www.example.org @192.168.60.134

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t A www.example.org @192.168.60.134    

;; global options: +cmd     

;; Got answer:     

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, 

id

: 38054     

;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:    

;www.example.org.        IN    A

;; ANSWER SECTION:    www.example.org.    3354    IN    A    192.168.60.110

;; AUTHORITY SECTION:    

example.org.        3354    IN    NS    ns1.example.org.     

example.org.        3354    IN    NS    ns2.example.org.

;; ADDITIONAL SECTION:    

ns1.example.org.    3354    IN    A    192.168.60.133     

ns2.example.org.    3354    IN    A    192.168.60.171

;; Query 

time

: 0 msec    

;; SERVER: 192.168.60.134

#53(192.168.60.134)     

;; WHEN: Sat Aug  9 02:42:26 2014     

;; MSG SIZE  rcvd: 117

3.4.2、區域轉發

當然這裡還可以配置區域轉發,對example.org定義為一個區域,裡面配置forward和forwarders。  

在/etc/named.conf中移除forward和forwarders兩句。

在/etc/named.rfc1912.zones中追加   

1 2 3 4 5

zone "example.org" IN {

type forward;

forward only;

forwarders { 192.168.60.133; };

};

使用rndc reload重新裝載配置檔案    

1

# dig -t A www.example.org @192.168.60.134

測試成功。  

3.5、view視圖

DNS服務及基于BIND的實作

不同IP段的用戶端,DNS分析判斷後傳回不同的結果。

将來自172.168.60.133的請求通路是intra_view,其他的IP的請求都通路inter_view。  

這次使用acl通路控制清單,在192.168.60.133上/etc/named/named.conf中,在起始行添加   

1

acl intranet { 192.168.60.133; 127.0.0.1; };

重新修改/etc/named/named.rfc1912.zones,定義2個視圖   

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

view "intra_view" {

match-clients { intranet; };

zone "." IN {

type hint;

file "named.ca";

};

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 "example.org" IN {

type master;

file "example.org.zfile";

allow-update { 127.0.0.1; };

allow-transfer { 192.168.60.171; };

};

zone "60.168.192.in-addr.arpa" IN {

type master;

file "60.168.192.in-addr.arpa.ptrfile";

allow-update { 127.0.0.1; };

allow-transfer { 192.168.60.171; };

};

};

view inter_view {

match-clients { any; };

zone "test.com" IN {

type master;

file "test.com.zone";

};

};

新增/var/named/test.com.zone檔案   

1 2 3 4 5 6 7 8 9

$TTL 1H     

@       IN SOA ns1 master (

2014080101 3600 600 86400 3600)

IN NS ns1

IN MX 10 mail

ns1    IN A 172.16.200.100     

mail   IN A 172.16.200.200     

www    IN A 172.16.200.110

開始測試   

本機192.168.60.133上測試   

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

# dig -t A www.example.org @192.168.60.133

; <<>> DiG 9.10.0-P2 <<>> -t A www.example.org @192.168.60.133    

;; global options: +cmd     

;; Got answer:     

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, 

id

: 46433     

;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:    

; EDNS: version: 0, flags:; udp: 4096     

;; QUESTION SECTION:     

;www.example.org.        IN    A

;; ANSWER SECTION:    

www.example.org.    3600    IN    A    192.168.60.110

;; AUTHORITY SECTION:    

example.org.        3600    IN    NS    ns1.example.org.     

example.org.        3600    IN    NS    ns2.example.org.

;; ADDITIONAL SECTION:    

ns1.example.org.    3600    IN    A    192.168.60.133     

ns2.example.org.    3600    IN    A    192.168.60.171

;; Query 

time

: 2 msec    

;; SERVER: 192.168.60.133

#53(192.168.60.133)     

;; WHEN: Sat Aug 09 18:40:14 CST 2014     

;; MSG SIZE  rcvd: 128

# dig -t A www.test.com @192.168.60.133

無法解析,此處省略

在192.168.60.134上測試  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

# dig -t A www.test.com @192.168.60.133

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -t A www.

test

.com @192.168.60.133    

;; global options: +cmd     

;; Got answer:     

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, 

id

: 5917     

;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:    

;www.

test

.com.            IN    A

;; ANSWER SECTION:    

www.

test

.com.        3600    IN    A    172.16.200.110

;; AUTHORITY SECTION:    

test

.com.        3600    IN    NS    ns1.

test

.com.

;; ADDITIONAL SECTION:    

ns1.

test

.com.        3600    IN    A    172.16.200.100

;; Query 

time

: 2 msec    

;; SERVER: 192.168.60.133

#53(192.168.60.133)     

;; WHEN: Sat Aug  9 04:21:18 2014     

;; MSG SIZE  rcvd: 80

# dig -t A www.example.org @192.168.60.133

解析不到,此處省略

    綜上,DNS是一個非常重要的基礎性服務,有很多的概念,标準内容也非常多。不僅用于網際網路解析,也可以用在企業内建網絡中。常用的就有主從複制、子域授權、轉發和視圖幾種模式。要熟悉這些基礎概念和應用場景,就能利用它對整個區域網路乃至網際網路的通路進行優化。

繼續閱讀