今天配虛擬機器想配置一下域名使用,然後就要配置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 |