歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux服務器

Linux主輔DNS數據不同步故障排除

在互聯網中,我們知道任何一台提供應用服務的主機(例如:HTTP、FTP等)都有它一個便於記憶Domain Name,這些名稱給用戶帶來了許多便利。但是,有些時候這些服務卻對我們這些維護人員顯得有些不“厚道”。本文將介紹DNS主輔配置過程中常遇到的配置問題以及排除方法。     我們有必要了解一下主輔DNS區域復制原理:如下圖3所示主輔DNS服務器數據同步的過程,首先master DNS服務器每次修改完成並重啟服務後,將傳送notify給所有的slave DNS服務器。slave DNS服務器將查詢master服務器的SOA記錄,master DNS服務器收到請求後將SOA記錄發送給Slave DNS服務器,Slave DNS服務器收到後同時對比查詢結果中的serial值,如果serial值不大於本機的話將結束數據同步過程;但是如果serial值大於本機的話,slave DNS將發送zone transfer請求要求(AXFR/IXFR)。Master響應zone transfer請求並傳送結果,直到整個slave更新完成。 Linux主輔DNS數據不同步故障排除     整體的同步過程如上所述,但是如何將這些原理體現在相關的配置文件中,這裡以創建域名www.qiuri.com記錄為例:
    測試平台:RedHat Enterprise Linux 5 Server update 2
    所需軟件包列表:

軟件包名稱 作用 bind-libs 包含DNS的庫文件 Bind-9 DNS服務器軟件,安裝此軟件前需要安裝libs caching-nameserver 配置文件模板 bind-utils DNS查詢工具軟件 bind-chroot 使DNS在chroot模式下運行,增強安全性(選擇性安裝)

    根據你使用的安裝包安裝相應的軟件,這裡我使用系統自帶的rpm包,配置yum本地更新源後,使用命令yum install bind*進行安裝。使用yum安裝的好處是能夠自動處理安裝過程中包的連帶性,但是有時候也安裝了一些不必要的程序到你的系統。     安裝完成後第一件需要注意的事情是“查看你是否安裝了bind-chroot這個包”這個程序的主要功能是:將DNS服務器在chroot模式下運行,在這種模式下運行的話,它會將所有和DNS相關的文件都鎖定到/var/named/chroot目錄下,就是說bind的訪問范圍僅僅定位於這個目錄中,無法進一步提升到系統中的其它目錄。這樣可以提高系統的安全性。這樣聽起來很美,但是配置起來會出現許多的問題,建議不要使用。如果你使用了的話,所有配置修改需要到/var/named/chroot下,例如配置文件在/var/named/chroot/etc/named.conf。 [root@master ~]#rpm –q bind-chroot     由於RedHat AS 5安裝後默認的配置文件名稱named.caching-nameserver.conf和/etc/named. caching .zones組成。修改配置文件名稱: [root@master ~]#mv /etc/named.caching-nameserver.conf /etc/named.conf [root@master ~]#mv /etc/named. caching .zones /etc/named. zones     修改主DNS服務器上的配置文件,修改結果如下: [root@master~ ]# vi /etc/named.conf // // named.caching-nameserver.conf 省略若干注釋 options {         listen-on port 53 { 10.1.1.1; };         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";         query-source    port 53;         query-source-v6 port 53;         allow-query     { any; }; }; include "/etc/named.zones"; [root@master ~]#     修改/etc/named.zones文件,添加相關字段創建正向區域,添加內容如下: [root@master~]# vi /etc/named.zones // named.rfc1912.zones: 省略若干注釋和若干默認區域 zone "qiuri.com" IN {         type master;         file "qiuri.com";         allow-transfer { 10.1.1.2; };         allow-update { none; }; }; [root@master~]#     在/var/named創建相關區域文件qiuri.com內容如下所示: [root@master~ ]# cat /var/named/qiuri.com $TTL    86400 @       IN      SOA     master.qiuri.com. root.master.qiuri.com.  (                                       2008111305 ; Serial                                       28800      ; Refresh                                       14400      ; Retry                                       3600000    ; Expire                                       86400 )    ; Minimum         IN      NS      master.qiuri.com.         IN      NS      slaves.qiuri.com. www     IN      A       10.1.1.1 ftp     IN      A    3   10.1.1.1[root@master~ ]#     由於是測試我這裡就不建立許多的區域了,在輔助DNS上的配置幾乎一樣,只需要將named.conf配置文件中的listen-on port 53 中的IP地址字段修改為輔助DNS服務器即可。 [root@ slave~ ]# vi /etc/named.conf // // named.caching-nameserver.conf 省略若干注釋 options {         listen-on port 53 { 10.1.1.2; }; 省略其它和主DNS服務器相同字段         include "/etc/named.zones"; [root@ slave~ ]#     在/etc/named.zones配置文件中將區域類型修改為slave,並指定主DNS服務器IP即可: [root@ slave~]# vi /etc/named.zones // named.rfc1912.zones: 省略若干字段。。。。。。 zone "qiuri.com" IN {         type slave;         file "slaves/qiuri.com";         masters { 10.1.1.1; };         allow-update { none; }; }; [root@ slave~]#     注意:修改每台DNS服務器自己為DNS服務器,相關配置文件為/etc/resolv.conf。     將所有配置完成後我們分別在主輔DNS上執行命令service named start啟動服務。        故障一:     DNS上使用ping命令測試,發現了第一個故障:啟動服務過程中沒有任何的錯誤提示,ping域名的時候卻顯示沒有這個域名。     故障分析:通過ping域名的時候,我們得知沒有這個域名的回應值,這表明這個區域沒有生效,但是到底是什麼原因導致區域沒有生效呢?這個時候不要茫然,去看看日志吧! [root@master~]# tail /var/log/messages 省略若干… … Nov 21 20:55:57 localhost named[7113]: zone qiuri.com/IN: loading master file qiuri.com: permission denied Nov 21 20:55:57 localhost named[7113]: zone localdomain/IN: loaded serial 42 Nov 21 20:55:57 localhost named[7113]: zone localhost/IN: loaded serial 42 Nov 21 20:55:57 localhost named[7113]: running [root@master~]#     黎明前的黑暗終於度過,一行行的日志終於看完,發現在加載qiuri.com的時候出現了permission denied的提示,就是說加載文件時被拒絕了。為什麼會拒絕呢?我們先查看一下這個文件的屬性吧? [root@master~]# ll /var/named/qiuri.com -rw-r----- 1 root root 436 11-21 20:54 /var/named/qiuri.com [root@master~]#     發現這個文件的所有者是root,屬組也是root,但是由於DNS服務使用named這個用戶啟動服務,難怪會拒絕了呢。那修改一下吧! [root@master~]#chown named.named /var/named/qiuri.com     修改完成後重啟dns服務,使配置生效。 [root@master~]#service named restart     再次查看日志,發現已經成功加載。 [root@master~]# tail -5 /var/log/messages 省略若干... ... Nov 21 21:11:46 localhost named[7217]: zone qiuri.com/IN: loaded serial 2008111305 Nov 21 21:11:46 localhost named[7217]: zone localdomain/IN: loaded serial 42 Nov 21 21:11:46 localhost named[7217]: zone localhost/IN: loaded serial 42 Nov 21 21:11:46 localhost named[7217]: running [root@master~]#     總結:這個問題出現的原因是由於我們創建這個文件的時候,沒有考慮文件權限,導致出現這個問題。如果有的朋友不是手工編輯的這個文件,而是直接復制/var/named/named.local這個文件後再修改的,建議復制過程中使用-p參數。這樣就避免了cp後再修改權限的步驟。     接著迫不及待的去啟動了輔助DNS的服務,之後去查看/var/named/slaves中是否存在qiuri.com這個區域文件。發現成功復制過來。 [root@master~]# tail -5 /var/log/messages 省略若干... ... Nov 21 21:11:46 localhost named[7217]: zone qiuri.com/IN: loaded serial 2008111305 Nov 21 21:11:46 localhost named[7217]: zone localdomain/IN: loaded serial 42 Nov 21 21:11:46 localhost named[7217]: zone localhost/IN: loaded serial 42 Nov 21 21:11:46 localhost named[7217]: running [root@master~]#     到這個時候我們的測試還沒有結束,繼續進行中,首先我們再次回到主DNS服務器上編輯qiuri.com區域文件,增加主機記錄,修改serial值。 [root@master ]# cat /var/named/qiuri.com $TTL    86400 @       IN      SOA     master.qiuri.com. root.master.qiuri.com.  (                                       2008111306 ; Serial                                       28800      ; Refresh                                       14400      ; Retry                                       3600000    ; Expire                                       86400 )    ; Minimum         IN      NS      master.qiuri.com.         IN      NS      slaves.qiuri.com. www     IN      A       10.1.1.1 ftp     IN      A       10.1.1.1 down    IN      A       10.1.1.1 [root@master~]#     修改完成後,使用service named reload重新加載配置文件,到輔助dns上驗證我們添加的記錄是否同步過來。但是再次失望了,故障又發生了。     故障二:     主DNS服務器修改記錄或添加區域輔助DNS同步不過去,或者需要很長時間。這樣如果在現實生活中,會造成各地訪問的結果不同。我們有必要研究一下主DNS服務器上修改完成後如何快速的同步給其它輔助的DNS。     故障分析:     為了查清故障的原因,這個時候我分別在各個DNS服務器上開啟兩個終端,在第一個終端輸入命令tail -f /var/log/messages動態監控日志;另一個終端中重啟DNS服務。發現沒有產生任何日志。這個時候,思考了一下主輔DNS的工作原理,每次主DNS修改完成後重啟服務會傳送notify值,但是這裡卻沒有傳送。再次回到配置文件中檢查相關字段發現沒有定義。這個字段可以在named.conf中options字段中聲明。也可以在單個區域文件中聲明。     這裡在qiuri.com的zone中添加also-notify { 10.1.1.2; };值。 [root@master~]# zone "qiuri.com" IN {         type master;         file "qiuri.com";         also-notify { 10.1.1.2; };         allow-transfer { 10.1.1.2; };         allow-update { none; }; }; [root@master~]#     注意:如果要在options中聲明,可以使用notify yes;即可。     再次加載服務,發現監控的日志開始有相應的請求和發送的字段出現。主DNS服務器的日志如下: [root@master ~]#tail -f /var/log/messages Nov 13 16:17:38 master named[3159]: zone qiuri.com/IN: sending notifies (serial 2008111306) Nov 13 16:18:57 master named[3159]: client 10.1.1.2#45757: transfer of 'qiuri.com/IN': AXFR-style IXFR started Nov 13 16:18:57 master named[3159]: client 10.1.1.2#45757: transfer of 'qiuri.com/IN': AXFR-style IXFR ended [root@master ~]#     輔助DNS服務器上日志顯示如下: [root@ slave~ ]#tail -f /var/log/messages Nov 14 08:12:55 ns named[6014]: running Nov 14 08:12:55 ns named[6014]: zone qiuri.com/IN: sending notifies (serial 2008111306) Nov 14 08:15:10 ns named[6014]: client 10.1.1.1#1106: received notify for zone 'qiuri.com' Nov 14 08:15:10 ns named[6014]: zone qiuri.com/IN: Transfer started. [root@ slave~ ]#     這個時候問題解決,其實還有配置主輔DNS服務器的時候還會見到類似failed while receiving responses: REFUSED錯誤提示,一般是由於主DNS服務器上未授權或者是相關的目錄沒有權限造成。只要耐心查看日志和思考問題,相信問題均可解決。     相關原理:     在解決問題的過程中有的朋友說將SOA中的Refresh值修改小一點,沒錯!但是這個值什麼時候生效呢?當我們主DNS服務器上修改完成後重啟服務,會主動傳送notify值,如果輔助DNS服務器沒有收到才參考Refresh,Refresh 不成功,則參考Retry ,Retry 一直不成功, 則參考 Expire,如果Expire也不成功,則選擇放棄zone transfer的過程。

Copyright © Linux教程網 All Rights Reserved