2011年11月6日 星期日

Cache-Only and forwarding DNS server (原理與設定方法)

有個只需要 . 這個 zone file 的簡單 DNS 伺服器,我們稱這種沒有自己公開的 DNS 資料庫的伺服器為 cache-only (僅快取) DNS server!顧名思義,這個 DNS server 只有快取搜尋結果的功能,也就是說,他本身並沒有主機名稱與 IP 正反解的設定檔,完全是由對外的查詢來提供他的資料來源!
那如果連 . 都不想要呢?那就得要指定一個上層 DNS 伺服器作為你的 forwarding (轉遞) 目標,將原本自己要往 . 查詢的任務,丟給上層 DNS 伺服器去煩惱即可。 如此一來,我們這部具有 forwarding 功能的 DNS 伺服器,甚至連 . 都不需要了!因為 . 有記錄在上層 DNS 上頭了嘛!
如同剛剛提到的,cache only 的 DNS 並不存在資料庫 (其實還是存在 . 這個 root 領域的 zone file), 因此不論是誰來查詢資料,這部 DNS 一律開始從自己的快取以及 . 找起,整個流程與圖 19.1-4 相同。那如果具有 forwarding 功能呢?果真如此,那即使你的 DNS 具有 . 這個 zone file,這部 DNS 還是會將查詢權『委請』上層 DNS 查詢的,這部 DNS 伺服器當場變成用戶端啦!查詢流程會變這樣喔:
具有 forwarding 功能的 DNS 伺服器查詢方式
觀察上圖的查詢方向,你會發現到,具有 forwarding 機制時,查詢權會委請上層 DNS 伺服器來處理,所以根本也不需要 . 這個位置所在的 zone 啦。一般來說,如果你的環境需要架設一個 cache-only 的 DNS 伺服器時,其實可以直接加上 forwarding 的機制,讓查詢權指向上層或者是流量較大的上層 DNS 伺服器即可。那既然 cache only 的伺服器並沒有資料庫, forwarding 機制甚至不需要 . 的 zone ,那幹嘛還得要架設這樣的 DNS 呢?是有理由的啦!
  • 什麼時候有架設 cache-only DNS 的需求?
在某些公司行號裡頭,為了預防員工利用公司的網路資源作自己的事情,所以都會針對 Internet 的連線作比較嚴格的限制。當然啦,連 port 53 這個 DNS 會用到的 port 也可能會被擋在防火牆之外的~這個時候, 你可以在『防火牆的那部機器上面,加裝一個 cache-only 的 DNS 服務!』 這是什麼意思呢?很簡單啊!就是你自己利用自己的防火牆主機上的 DNS 服務去幫你的 Client 端解譯 hostname <--> IP 囉!因為防火牆主機可以設定放行自己的 DNS 功能,而 Client 端就設定該防火牆 IP 為 DNS 伺服器的 IP 即可!哈哈!這樣就可以取得主機名稱與 IP 的轉譯啦!所以,通常架設 cache only DNS 伺服器大都是為了系統安全囉。
[root@www ~]# cp /etc/named.conf /etc/named.conf.raw
[root@www ~]# vim /etc/named.conf
// 在預設的情況下,這個檔案會去讀取 /etc/named.rfc1912.zones 這個領域定義檔
// 所以請記得要修改成底下的樣式啊!
options {
        listen-on port 53  { any; };     //可不設定,代表全部接受
        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; };     //可不設定,代表全部接受
        recursion yes;                   //將自己視為用戶端的一種查詢模式
        forward only;                    //可暫時不設定
        forwarders {                     //是重點!
                168.95.1.1;              //先用中華電信的 DNS 當上層
                139.175.10.20;           //再用 seednet 當上層
        };
};  //最終記得要結尾符號!

  • listen-on port 53 { any; }; 監聽在這部主機系統上面的哪個網路介面。預設是監聽在 localhost,亦即只有本機可以對 DNS 服務進行查詢,那當然是很不合理啊! 所以這裡要將大括號內的資料改寫成 any。記得,因為可以監聽多個介面,因此 any 後面得要加上分號才算結束喔! 另外,這個項目如果忘記寫也沒有關係,因為預設是對整個主機系統的所有介面進行監聽的。
  • directory "/var/named"; 意思是說,如果此檔案底下有規範到正、反解的 zone file 檔名時,該檔名預設應該放置在哪個目錄底下的意思。預設放置到 /var/named/ 底下。由於 chroot 的關係,最終這些資料庫檔案會被主動連結到 /var/named/chroot/var/named/ 這個目錄。
  • dump-file, statistics-file, memstatistics-file 與 named 這個服務有關的許多統計資訊,如果想要輸出成為檔案的話,預設的檔名就如上所述。鳥哥自己很少看這些統計資料, 所以,這三個設定值寫不寫應該都是沒有關係的。
  • allow-query { any; }; 這個是針對用戶端的設定,到底誰可以對我的 DNS 服務提出查詢請求的意思。原本的檔案內容預設是針對 localhost 開放而已, 我們這裡改成對所有的用戶開放 (當然啦,防火牆也得放行才行)。不過,預設 DNS 就是對所有用戶放行,所以這個設定值也可以不用寫。
  • forward only ; 這個設定可以讓你的 DNS 伺服器僅進行 forward,即使有 . 這個 zone file 的設定,也不會使用 . 的資料, 只會將查詢權交給上層 DNS 伺服器而已,是 cache only DNS 最常見的設定了!
  • forwarders { 168.95.1.1; 139.175.10.20; } ; 既然有 forward only,那麼到底要對哪部上層 DNS 伺服器進行轉遞呢?那就是 forwarders (不要忘記那個 s) 設定值的重要性了!由於擔心上層 DNS 伺服器也可能會掛點,因此可以設定多部上層 DNS 伺服器喔!每一個 forwarder 伺服器的 IP 都需要有『 ; 』來做為結尾!
啟動 named 並觀察服務的埠口 啟動總不會忘記吧?趕快去啟動一下吧!同時啟動完畢之後,觀察一下由 named 所開啟的埠口,看看到底哪些埠口會被 DNS 用到的!
# 1. 啟動一下 DNS 這玩意兒!
[root@www ~]# /etc/init.d/named start
Starting named:                     [  OK  ]
[root@www ~]# chkconfig named on

# 2. 到底用了多少埠口呢?
[root@www ~]# netstat -utlnp | grep named
Proto Recv-Q Send-Q Local Address       Foreign Address  State  PID/Program name
tcp        0      0 192.168.100.254:53  0.0.0.0:*        LISTEN 3140/named
tcp        0      0 192.168.1.100:53    0.0.0.0:*        LISTEN 3140/named
tcp        0      0 127.0.0.1:53        0.0.0.0:*        LISTEN 3140/named
tcp        0      0 127.0.0.1:953       0.0.0.0:*        LISTEN 3140/named
tcp        0      0 ::1:953             :::*             LISTEN 3140/named
udp        0      0 192.168.100.254:53  0.0.0.0:*               3140/named
udp        0      0 192.168.1.100:53    0.0.0.0:*               3140/named
udp        0      0 127.0.0.1:53        0.0.0.0:*               3140/named
我們知道 DNS 會同時啟用 UDP/TCP 的 port 53,而且是針對所有介面,因此上面的資料並沒有什麼特異的部分。不過,怎麼會有 port 953 且僅針對本機來監聽呢?其實那是 named 的遠端控制功能,稱為遠端名稱解析服務控制功能 (remote name daemon control, rndc)。預設的情況下,僅有本機可以針對 rndc 來控制。我們會在後續的章節再來探討這個 rndc 啦,目前我們只要知道 UDP/TCP port 53 有啟動即可 檢查 /var/log/messages 的內容訊息 (極重要!) named 這個服務的記錄檔就直接給他放置在 /var/log/messages 裡面啦,所以來看看裡面的幾行登錄資訊吧!
[root@www ~]# tail -n 30 /var/log/messages | grep named
Aug  4 14:57:09 www named[3140]: starting BIND 9.7.0-P2-RedHat-9.7.0-5.P2.el6_0.1 -u named
 -t /var/named/chroot <==說明的是 chroot 在哪個目錄下!
Aug  4 14:57:09 www named[3140]: adjusted limit on open files from 1024 to 1048576
Aug  4 14:57:09 www named[3140]: found 1 CPU, using 1 worker thread
Aug  4 14:57:09 www named[3140]: using up to 4096 sockets
Aug  4 14:57:09 www named[3140]: loading configuration from '/etc/named.conf'
Aug  4 14:57:09 www named[3140]: using default UDP/IPv4 port range: [1024, 65535]
Aug  4 14:57:09 www named[3140]: using default UDP/IPv6 port range: [1024, 65535]
Aug  4 14:57:09 www named[3140]: listening on IPv4 interface lo, 127.0.0.1#53
Aug  4 14:57:09 www named[3140]: listening on IPv4 interface eth0, 192.168.1.100#53
Aug  4 14:57:09 www named[3140]: listening on IPv4 interface eth1, 192.168.100.254#53
Aug  4 14:57:09 www named[3140]: generating session key for dynamic DNS
Aug  4 14:57:09 www named[3140]: command channel listening on 127.0.0.1#953
Aug  4 14:57:09 www named[3140]: command channel listening on ::1#953
Aug  4 14:57:09 www named[3140]: the working directory is not writable
Aug  4 14:57:09 www named[3140]: running
上面最重要的是第一行出現的『-t ...』那個項目指出你的 chroot 目錄囉。另外,上面表格中特殊字體的部分,有寫到讀取 /etc/named.conf,代表可以順利的載入 /var/named/etc/named.conf 的意思。如果上面有出現冒號後面接數字 (:10), 那就代表某個檔案內的第十行有問題的意思,屆時再進入處理即可。要注意的是,即使 port 53 有啟動,但有可能 DNS 服務是錯誤的,此時這個登錄檔就顯的非常重要!每次重新啟動 DNS 後,請務必查閱一下這個檔案的內容!!
Tips: 如果你在 /var/log/messages 裡面一直看到這樣的錯誤資訊: couldn't add command channel 127.0.0.1#953: not found 那表示你還必需要加入 rndc key ,請參考本章後面的 利用 RNDC 指令管理 DNS 伺服器 的介紹,將他加入你的 named.conf 中!
 利用 RNDC 指令管理 DNS 伺服器(內含有疑難排除教學)
不知道你會不會覺得很奇怪,那就是為啥啟動 DNS 後,在 /var/log/messages 老是看到這一句話:
command channel listening on 127.0.0.1#953
而且在本機端的 port 953 還多了個 named 所啟動的服務,那是啥?那就是所謂的 rndc 了。這個 rndc 是 BIND version 9 以後所提供的功能啦,他可以讓你很輕鬆的管理你自己的 DNS 伺服器喔! 包括可以檢查已經存在 DNS 快取當中的資料、重新更新某個 zone 而不需要重新啟動整個 DNS , 以及檢查 DNS 的狀態與統計資料等等的,挺有趣的!
不過,因為 rndc 可以很深入的管理你的 DNS 伺服器,所以當然要進行一些控管啦! 控管的方式是經過 rndc 的設定來建立一支金鑰 (rndc key),並將這支金鑰相關的資訊寫入你的 named.conf 設定檔當中,重新啟動 DNS 後,你的 DNS 就能夠藉由 rndc 這個指令來管理囉! 事實上,新版的 distributions 通常已經幫你主動的建立好 rndc key 了,所以你不需要忙碌~ 不過,如果你還是在登錄檔當中發現一些錯誤,例如:
couldn't add command channel 127.0.0.1#953: not found
那就表示你 DNS 的 rndc key 沒有設定好啦!那要如何設定好?很簡單~只要先建立一把 rndc key ,然後加到 named.conf 當中去即可!你可以使用 bind 提供的指令來進行這樣的工作喔!
# 1. 先建立 rndc key 的相關資料吧!
[root@www ~]# rndc-confgen
# Start of rndc.conf <==底下沒有 # 的第一部份請複製到 /etc/rndc.conf 中
key "rndc-key" {
        algorithm hmac-md5;
        secret "UUqxyIwui+22CobCYFj5kg==";
};

options {
        default-key "rndc-key";
        default-server 127.0.0.1;
        default-port 953;
};
# End of rndc.conf

# 至於底下的 key 與 controls 部分,則請複製到 named.conf 且解開 # 喔!
# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
#       algorithm hmac-md5;
#       secret "UUqxyIwui+22CobCYFj5kg==";
# };
#
# controls {
#       inet 127.0.0.1 port 953
#               allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf
# 請注意,這個 rndc-confgen 是利用亂數計算出加密的那把 key ,
# 所以每次執行的結果都不一樣。所以上述的資料與你的螢幕會有點不同。

# 2. 建立 rndc.key 檔案
[root@www ~]# vim /etc/rndc.key
# 在這個檔案當中將原本的資料全部刪除,並將剛剛得到的結果給他貼上去
key "rndc-key" {
        algorithm hmac-md5;
        secret "UUqxyIwui+22CobCYFj5kg==";
};

# 3. 修改 named.conf
[root@www ~]# vim /etc/named.conf
# 在某個不被影響的角落建置如下的內容:
key "rndc-key" {
       algorithm hmac-md5;
       secret "UUqxyIwui+22CobCYFj5kg==";
};
controls {
       inet 127.0.0.1 port 953
               allow { 127.0.0.1; } keys { "rndc-key"; };
};

[root@www ~]# /etc/init.d/named restart
建立了rndc key 並且啟動 DNS ,同時你的系統也已經有 port 953 之後,我們就可以在本機執行 rndc 這個指令了。這個指令的用法請直接輸入 rndc 來查詢即可:
[root@www ~]# rndc
Usage: rndc [-c config] [-s server] [-p port]
        [-k key-file ] [-y key] [-V] command

command is one of the following:

  reload        Reload configuration file and zones.
  stats         Write server statistics to the statistics file.
  dumpdb        Dump cache(s) to the dump file (named_dump.db).
  flush         Flushes all of the server's caches.
  status        Display status of the server.
# 其他就給他省略啦!請自行輸入這個指令來參考囉!
那如何使用呢?我們舉幾個小例子來說明吧!
# 範例一:將目前 DNS 伺服器的狀態顯示出來
[root@www ~]# rndc status
version: 9.7.0-P2-RedHat-9.7.0-5.P2.el6_0.1
CPUs found: 1
worker threads: 1
number of zones: 27         <==這部 DNS 管理的 zone 數量
debug level: 0              <==是否具有 debug 及 debug 的等級
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF        <==是否具有 debug 及 debug 的等級
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running    <==是否具有 debug 及 debug 的等級

# 範例二:將目前系統的 DNS 統計資料記錄下來
[root@www ~]# rndc stats
# 此時,預設會在 /var/named/data 內產生新檔案,你可以去查閱:
[root@www ~]# cat /var/named/data/named_stats.txt
+++ Statistics Dump +++ (1312528012)
....(中間省略)....
++ Zone Maintenance Statistics ++
                   2 IPv4 notifies sent
++ Resolver Statistics ++
....(中間省略)....
++ Cache DB RRsets ++
[View: lan (Cache: lan)]
[View: wan (Cache: wan)]
[View: _bind (Cache: _bind)]
[View: _meta (Cache: _meta)]
++ Socket I/O Statistics ++
                   5 UDP/IPv4 sockets opened
                   4 TCP/IPv4 sockets opened
                   2 UDP/IPv4 sockets closed
                   1 TCP/IPv4 sockets closed
                   2 TCP/IPv4 connections accepted
++ Per Zone Query Statistics ++
--- Statistics Dump --- (1312528012)

# 範例三:將目前快取記憶體當中的資料記錄下來
[root@www ~]# rndc dumpdb
# 與 stats 類似,會將 cache 的資料放置成為一個檔案,你可以去查閱:
# /var/named/data/cache_dump.db
如果你在執行 rndc 指令時老是出現如下錯誤:
rndc: connection to remote host closed
This may indicate that the remote server is using an older version of
the command protocol, this host is not authorized to connect,
or the key is invalid.
這表示你的 /etc/rndc.key 與 /etc/rndc.conf 內金鑰的編碼不同所致。 請你自行以上述的 rndc-confgen 的方式自行處理你的 rndc key ,並重新啟動 named 即可啊! 用這東西管理,你就不需要每次都重新啟動 named 囉! 

沒有留言:

張貼留言