2012年1月17日 星期二

單純的 cache-only DNS 伺服器與 forwarding 功能

19.3.3 單純的 cache-only DNS 伺服器與 forwarding 功能

在下一小節開始介紹正、反解 zone 的資料設定之前,在這個小節當中,我們先來談一個單純修改設定檔,而不必設計 zone file 的環境,那就是不具有自己正反解 zone 的僅進行快取的 DNS 伺服器。



  • 什麼是 cache-only 與 forwarding DNS 伺服器呢?
有個只需要 . 這個 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 伺服器查詢方式
圖 19.3-1、具有 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 伺服器大都是為了系統安全囉。



  • 實際設定 cache-only DNS server
那如何在你的 Linux 主機上架設一個 cache-only 的 DNS 伺服器呢?其實真的很簡單的啦!因為不需要設定正反解的 zone (只需要 . 的 zone 支援即可),所以只要設定一個檔案 (就是 named.conf 主設定檔) 即可!真是快樂得不得了吶! 另外,cache-only 只要加上個 forwarders 的設定即可指定 forwarding 的資料,所以底下我們將設定具有 forwarding 的 cache-only DNS 伺服器吧!



  1. 編輯主要設定檔: /etc/named.conf

    雖然我們具有 chroot 的環境,不過由於 CentOS 6.x 已經透過啟動腳本幫我們進行檔案與目錄的掛載連結,所以請你直接修改 /etc/named.conf 即可呦!不要再去 /var/named/chroot/etc/named.conf 修改啦! 在這個檔案中,主要是定義跟伺服器環境有關的設定,以及各個 zone 的領域及資料庫所在檔名。 在鳥哥的這個案例當中,因為使用了 forwarding 的機制,所以這個 cache-only DNS 伺服器並沒有 zone (連 . 都沒有),所以我們只要設定好跟伺服器有關的設定即可。設定這個檔案的時候請注意:

    • 註解資料是放置在兩條斜線『 // 』後面接的資料
    • 每個段落之後都需要以分號『 ; 』來做為結尾!

    鳥哥將這個檔案再簡化如下的樣式:
    [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 當上層
            };
    };  //最終記得要結尾符號!
    
    鳥哥將大部分的資料都予以刪除,只將少部分保留的資料加以小部分的修訂而已。在 named.conf 的結構中,與伺服器環境有關的是由 options 這個項目內容設定的,因為 options 裡面還有很多子參數, 所以就以大括號 { } 包起來囉。至於 options 內的子參數在上面提到的較重要的項目簡單敘述如下:

    • 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 都需要有『 ; 』來做為結尾!

    很簡單吧!至於更多的參數我們會在後續篇幅當中慢慢介紹的。這樣就已經設定完成了最簡單的 cache only DNS server 了!

     

  2. 啟動 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 有啟動即可。

     

  3. 檢查 /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 中!
    鳥哥的圖示

  4. 測試:

    如果你的 DNS 伺服器具有連上網際網路的功能,那麼透過『 dig www.google.com @127.0.0.1 』這個基本指令執行看看, 如果有找到 google 的 IP ,並且輸出資料的最底下顯示『 SERVER: 127.0.0.1#53(127.0.0.1) 』的字樣, 那就代表應該是成功啦!其他更詳細的測試請參考:19.2 小節的內容

沒有留言:

張貼留言