轉載註明出處: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上)
下載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、主從複製(區域傳送)
(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、子域授權及轉發器
假設子域爲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視圖
不同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是一個非常重要的基礎性服務,有很多的概念,標準內容也非常多。不僅用於互聯網解析,也可以用在企業內建網絡中。常用的就有主從複製、子域授權、轉發和視圖幾種模式。要熟悉這些基礎概念和應用場景,就能利用它對整個局域網乃至互聯網的訪問進行優化。
參考資料
維基百科
https://en.wikipedia.org/wiki/List_of_DNS_record_types
域名標準規格
http://tools.ietf.org/html/rfc1035
BIND手冊
http://www.isc.org/downloads/bind/doc/bind-9-9/
DNS資料
http://dns-learning.twnic.net.tw/dns/toc.html
本文出自 “終南山下” 博客,請務必保留此出處http://me2xp.blog.51cto.com/6716920/1538163