1. 程式人生 > >今天配虛擬機器想配置一下域名使用,然後就要配置DNS,很詳細瞭解了一下

今天配虛擬機器想配置一下域名使用,然後就要配置DNS,很詳細瞭解了一下

轉載註明出處:http://blog.csdn.net/limanjihe/article/details/52208262

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採用CS架構,伺服器端工作在UDP協議埠53和TCP協議埠53上。

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

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

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

1.3、網際網路DNS訪問模型

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

域名訪問_副本

客戶機發起對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安裝。將CentOS光碟掛載到/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上)

(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