DNS基本工作原理
及正反向解析和主從同步測試
域名系統DNS是一個分佈式數據庫,它在本地負責控制整個分佈式數據庫的部分段,每一段中的數據通過客戶服務器模式在整個網絡上均可存取,通過採用複製技術和緩存技術使得整個數據庫可靠的同時,又擁有良好的性能。
一、基本工作原理
域名是分層次的。最頂部是根域;這一域上的信息駐留在從整個Internet中所選的一些根服務器上。在根域下面是頂級域,也就是國家代碼或機構代碼。國家代碼的例子有SG(新加坡)和CA(加拿大)等;而機構代碼則包括衆所周知的COM(商業機構)、EDU(教育機關)、GOV(政府機構)和NET(網絡機構)等。在頂級域下面是次級域(whitehouse.gov、microsoft.com、inforamp.net等諸如此類),然後是第3級域,向下以此類推。
跨網絡的通信是必須通過ip地址進行的,而我們對ip那一串數字的記憶是效果不明顯的,網址那麼多,不能每次都拿個小本本記下地址,然後查一下,再寫到地址欄鏈接到那個網址。這時就需要一種服務機制,把我們更適宜形象記憶的字母單詞格式的網址轉換爲ip地址,然後進行通信,這樣我們就不需要記憶純數字的ip了。這就誕生了DNS服務。
我們在網址的某處輸入網址名稱(比如 www.baidu.com),這時,電腦就先查找本機的host文件,如果沒有,則向給我們主機提供域名解析服務的DNS服務器發出查詢任務。而A得到任務後,就會先查一定時間內別人查詢過的信息裏有沒有這一條信息的緩存,有的話將結果反饋給我們,如果沒有,就查自己負責的域裏有沒有這麼個地址,有則反饋給我們。如果還沒有,則找最頂級的根,根一看,是.com的頂級域,就返回結果,讓A去找負責.com的服務器。我們的A收到根的回信後就去找.com服務器,.com服務器一看地址,先查緩存,如果別人查過,在緩存裏有條目,則直接返回對應的ip地址給A,如果沒有則再查解析庫裏有沒有記錄,有也同樣返回。沒有則直接告訴A這地址不存在。這時,A就可能收到兩個結果,一個是有ip的返回信息,一個是這個地址不存在的信息。A將查詢到的信息反饋給我們後任務結束了,並在自己的緩存裏記錄下這一次的查詢結果,以便能在有相同查詢時迅速給出結果,而不需要到DNS服務器上自根向下查詢多遍。同時我們的主機上相關的程序也會記錄下地址,在一定時間內就不需要再次去向DNS查詢了。
其中,A給出結果時,是通過由根始從上一級向下一層級依次查詢得來的,這種查詢方式叫做迭代查詢。我們將任務發給這臺DNS服務器(取名爲A)後,就只需要等着它返回給我們最終結果了,這種查詢方式,稱爲遞歸查詢,即只要查詢一次就能得到結果。
我們通過地址查詢ip的方式叫做正向查詢,而通過ip查詢域名的方式就叫反向查詢。因此,DNS有2套獨立的查詢數,一套是正向查詢的,一套是反向查詢的,各自有自己的解析庫,互不干擾。因此,正向解析的服務器和反向解析的服務器可以是同一臺主機,也可以是不同的主機,只要同一套系統內的上下層級之間,同一個域名的主從服務器之間是不同的主機即可。
域名解析協議最成功的實現就是BIND了。
二、 虛擬機正反向域名解析及同步測試
(一)需要安裝的程序包:
①bind : 提供服務
②bind-libs :提供庫文件
③bind-utils :測試服務是否ok
# yum install bind 可以同時安裝上面三個有依賴關係的程序包
bind:
服務腳本:/etc/rc.d/init.d/named (所以 start、stop 、restart、status參數也接受)
主配置文件:① /etc/named.conf, ② /etc/named.rfc1912.zones(rfc 請求註解文檔), ③ /etc/rndc.key
解析庫文件:/var/named/ZONE_NAME.ZONE (默認是空的,需要我們自己手動創建)
注意:
(1) 一臺物理服務器可同時爲多個區域提供解析(即可以有多個zone);
(2) 必須要有根區域文件;默認由centos bind-rpm包提供,安裝後/var/named/named.ca(包含全球13個根服務器的詳細信息)
(3) 應該有兩個(如果包括ipv6的,應該更多)實現localhost和本地迴環地址的解析庫;
rndc: remote name domain controller,默認與bind安裝在同一主機,且只能通過127.0.0.1來連接named進程;提供輔助性的管理功能;默認監聽在 953/tcp (tcp的953端口),可以給監視DNS運行提供命令操作。
(二)主配置文件修改:
# vim /etc/named.conf
全局配置:options {}
日誌子系統配置:logging {}
區域定義:本機能夠爲哪些zone進行解析,就要定義哪些zone;
zone "ZONE_NAME" IN {}
注意:任何服務程序如果期望其能夠通過網絡被其它主機訪問,至少應該監聽在一個能與外部主機通信的IP地址上;緩存名稱服務器的配置:監聽外部地址即可;
(三)主DNS名稱服務器配置:
(1) 在主配置文件中定義區域
# vim /etc/named.rfc1912.zones
zone "ZONE_NAME" IN {
type {master|slave|hint|forward};
file "ZONE_NAME.zone";
};
master:表示是區域的主DNS服務器
slave :表示是區域的從DNS服務器
hint : 根(根提示)服務器
forward: 做轉發用的
ZONE_NAME.zone : 自己需要建立的一個文件,定義各種rr,並以 .zone 結尾
(2) 定義區域解析庫文件
(2.1) # vim /var/ZONE_NAME.zone
這個需要自己從頭開始建立,第一條是SOA,後面是ns和A,AAAA,MX的記錄出現的內容:
① 宏定義:以 $ 開頭;
$ORIGIN :省略域名的自動補上ORIGIN後面的內容
$TTL 86400: 表示默認的全局肯定查詢結果的ttl是86400
② 資源記錄;
(2.2)測試解析庫文件有沒有語法錯誤
# named-checkzone "區域名” /區域解析庫文件絕對地址/
# named-checkzone "chlhost.com" /var/named/chlhost.com.zone
(2.3)修改區域解析庫文件屬性
我們建立的服務器配置文件不應該允許別人隨便訪問修改
(四)啓動DNS服務
# service named start
(五)測試:
(1)dig命令
dig [-t type] name [@SERVER] [query options]
-t type:制定需要返回的結果是什麼類型,可以是A,AAAA,any,MX等,不指定則默認是A
name:自己需要測試的區域名,如“chlhostcom”
@SERVER:指定找SERVER服務器解析,如果沒有,則會自動根據/etc/resolv.conf 文件中配置的”nameserver“進行解析;
[query options]:查詢選項:
+[no]trace:跟蹤解析過程
+[no]recurse:進行遞歸解析
注:①dig用於測試dns系統,因此,不會查詢hosts文件進行解析;
② 因爲是自建DNS,如果沒有@server,則是默認找外網的服務器解析,結果是否定的
③ 如果一個域名有多臺主機提供服務的,則返回結果是輪詢返回的
測試反向解析:
由IP地址解析出對應的域名
dig -x IP @SERVER
事例:查看下面反向解析的測試圖片
與正向解析相比,不需要加 “-t type”了,直接跟要查找的IP即可
模擬區域傳送:
dig -t axfr ZONE_NAME @SERVER
-axfr:表示做全量傳送(all transfer),即將所有跟查詢有關的信息記錄都一次全部傳送過來。通過這個可以知道某公司所有網絡拓撲結構,所以一般需要關閉你所做的DNS服務器的這項功能
例如:# dig -t axfr chlhost.com @172.16.20.97
# dig -t axfr 20.16.172.in-addr.arpa @172.16.20.97
(2)host命令:
格式:host [-t type] name [SERVER]
與dig相比,返回結果更簡潔。
如上面的dig查詢可以用下面的命令:
# host -t NS chlhost.com 172.16.20.97
# host -t A ww.chlhost.com 172.16.20.97
(3)nslookup命令:
nslookup [-option] [name | -] [server]
這個命令還可以提供交互式模式查詢方式:
nslookup>
server IP: 指明使用哪個DNS server進行查詢;
set q=RR_TYPE: 指明查詢的資源記錄類型;
NAME: 要查詢的名稱;
(六)修改後的重啓命令:
DNS服務器在運行服務期間,我們做了調試、測試或者項目添加修改時,要讓配置能馬上生效而不用系統重啓(系統停止會讓數據丟失),這時我們不應該用# service named restart這種方法,而應該使用下面方法只讓系統重讀文件但不用重啓:
方法一:
# service named reload
方法二:
# rndc reload
(七)反向區域 配置:
與上面的正向解析配置基本一樣,只不過區域名稱中網絡地址須反寫,並加“.in-addr.arpa."
區域名稱:網絡地址反寫.in-addr.arpa.
例如:172.16.100. --> 100.16.172.in-addr.arpa.
(1) 定義區域
# vim /etc/named.rfc1912.zones
zone "ZONE_NAME" IN {
type {master|slave|forward};
file "網絡地址.zone"
};
(2) 區域解析庫文件
# vim /var/ZONE_NAME.zone
這個也是需要自己從頭開始建立,第一條是SOA,後面是NS和PTR的記錄,不需要其他類型的記錄
NS指明有多少臺服務器提供反向解析服務
PTR指明IP地址解析後的網址是什麼,對應每個正向解析的網址記錄都應該有一個反向解析記錄
注意:不需要MX和A,以及AAAA記錄;以PTR記錄爲主;
(八)泛域名解析
顧客是上帝,顧客出錯了我們也得給他/她提供最好的服務,所以,顧客輸錯了head我們也需要能一步到位提供正確的解析,這時就需要用到泛域名解析功能。
如顧客輸入了 “chlhost.com”,我們需要給他正確ip地址,顧客輸入了“wwe.chlhost.com”我們也可以給他提供正確的ip地址,這就是用了泛域名解析。
注:bind可能不支持別名泛域名,需要設置爲A記錄。
操作過程:修改區域解析庫,添加泛域名A記錄即可
# vim /var/named/chlhost.com.zone
(八)從服務器的設置
(8.1)找一臺主機,測試能不能聯通剛纔設置好bind的主機,能則安裝好bind,並啓動服務
(8.2)我們可以把這臺機器配置成正向解析從服務器和/或反向解析從服務器
配置過程比主服務器配置簡單,只需要定義好服務域名就可以了,合法性是由主服務器的解析庫(/var/named/chlhost.com.zone)定義的
(8.3.1)修改從服務器的主配置文件/etc/named.conf,並重啓named服務,用# ss -tunl 查看監聽是否正常
這時就成爲一個緩存名稱服務器了
(8.3.2)修改主配置文件 /etc/named.rfc1912.zones,使本機成爲正向的名稱解析從服務器
添加一個域
注:因爲設置好後,系統會自動從主服務器出同步數據,自動創建正向解析庫文件而不需要我們root手動創建(如主服務器上的 /var/named/chlhost.com.zone一樣),這時就需要賦予進程named的一個能寫的目錄進行創建解析庫文件,/var/named下的slaves目錄就是爲這個準備的!
正向解析從服務器到此就設置成功
(8.3.3)修改主配置文件 /etc/named.rfc1912.zones,使本機成爲反向的名稱解析從服務器
通知機制:
因爲主服務器上有兩條記錄是( IN NS ns2 ; ns2 IN A 172.16.20.96 ),這就給了主服務器定義服務器是哪臺主機,當主服務器上的內容發生改變(修改完內容後,我們必須將其序列號手動加1)時,主服務器就會通知從服務器更新解析庫。少了前面那條,主服務器不知道有從服務器;少了後面那條,主服務器找不到從服務器的。同理,因爲從服務器可以是鏈式傳送,所以,這臺更新了的從服務器又會向其能聯繫到的其他從服務器發出數據更新的通知。
當帶寬足夠時,由於有通知機制,主從服務器的數據基本上都是實時同步的
主從複製:
1、應該爲一臺獨立的名稱服務器;
2、主服務器的區域解析庫文件中必須有一條NS記錄是指向從服務器;
3、從服務器只需要定義區域,而無須提供解析庫文件;解析庫文件應該放置於/var/named/slaves/目錄中;
4、主服務器得允許從服務器作區域傳送;
5、主從服務器時間應該同步,可通過ntp(網絡時間協議)進行;
6、bind程序的版本應該保持一致;否則,應該從高,主低;