站長新書 站長開講 首頁 最新文章 站長著作及審校 FreeBSD 筆記 Linux 筆記 Windows 筆記 虛擬化筆記 網管人雜誌 遊山玩水 關於本站
站長新書 VMware vSphere ICM 團購開跑了!!

Bind9-提供 Domain Name 與 IP 對應的服務

前言

DNS,Domain Name Service 主要目地為解決 Domain Name 與 IP Address 之間相互的對應問題,在網路世界間中的溝通其實就是使用 IP Address 來溝通 (就像是人類使用的身份證),但一連串的數字這樣對人類來說太過於麻煩,因此便出現 Domain Name Service 服務來將 IP Address 轉換成人類可方便閱讀的 Domain Name,簡單來說就是例如: 您輸入的 Yahoo 網址 http://tw.yahoo.com 轉成 IP Address 以便連結到 Yahoo 的網頁伺服器,關於網域名稱服務可參考站內文章 DNS 伺服器的原理與運作流程

FreeBSD 5.3-RELEASE 起內建 Bind9 不但安全性相對提高,並也把 Chroot 功能給加了進來,比較不習慣的可能就是設定檔的路徑

 /etc/namedb/               //原本設定檔實際路徑 (系統自動幫您連結至 Chroot 功能新路徑 /var 下)
 /var/named/etc/namedb/     //Bind9 設定檔的實際路徑

實作環境

安裝及設定

步驟1.本機反解範例檔案 (localhost.rev)

執行下列指令產生本機反解範例檔案 localhost.rev,產生的範例檔案 (localhost.rev 及 localhost-v6.rev) 將產生於 /var/named/etc/namedb/master 目錄下。

 #cd /var/named/etc/namedb/                          //切換路徑                
 #sh make-localhost                                  //產生範例檔

步驟2.修改 DNS 設定檔 (named.conf)

修改 DNS 設定檔 named.conf

 #vi /var/named/etc/namedb/named.conf                //編輯 named.conf 內容如下

步驟2-1.安全性設定 - 隱藏 BIND DNS 版本

為何要隱藏您的 BIND DNS 版本呢? 原因在於有心人士可以透過先瞭解您 DNS 主機所運作的 BIND 版本來尋找相關漏洞攻擊程式,因此在 ISC BIND 建議下可透過設定來隱藏 BIND 系統版本。

 options {
        directory       "/etc/namedb";
        pid-file        "/var/run/named/pid";
        dump-file       "/var/dump/named_dump.db";   //將資料庫內容 Dump 出來路徑 (執行rndc dumpdb)
        statistics-file "/var/stats/named.stats";    //統計資訊路徑 (執行rndc stats)
        version         "None of your business";     //當別人查詢您的 BIND 版本時顯示的文字內容

步驟2-2.安全性設定 - 存取控制清單 ACLs

我們可以利用設定存取控制清單 (ACL,Access Control List,) 功能來限制外來對 Domain 的查詢要求並且配合 Allow-Query 參數來限制所有或特定 Zone 的查詢要求。

 acl "dns1.weithenn.org" { 61.60.59.58; };
 acl "dns2.weithenn.org" { 61.60.59.57; };

步驟2-3.限制來源查詢要求 (allow-query)

DNS Server 僅回應列表中 IP Address 的查詢要求,這裡的 allow-query 限制為針對 DNS Server

 options { 
          allow-query { 168.95.192.1/32; 168.95.1.1/32; dns1.weithenn.org; dns2.weithenn.org; };
 };

步驟2-4.限制來源查詢要求 (allow-recursion)

允許哪些來源可以使用 DNS Server 進行遞迴查詢動作。簡單說就是透過這台 DNS 來查詢任何資料,包含不是該 DNS 主機負責的 Zone 也代為查詢,您應該不想讓別人用您的 DNS Server 去探查別人的 DNS 主機資訊吧?

 options { 
          allow-recursion { 127.0.0.1/32; 61.60.59.58/32; };
 };

步驟2-5.限制特定 Zone 查詢要求 (allow-query)

DNS Server 僅回應列表中 IP Address 的查詢要求,這裡的 allow-query 限制為針對區域 (Zone),當您設定限制所有或特定 Zone 的查詢要求時,其特定 Zone 設定優先權將大為限制所有查詢要求。

 zone "weithenn.org" {
        type master;
        file "master/named.weithenn.for";
        allow-query { dns2.weithenn.org; };        //僅回應這個 IP 的查詢要求
 };

步驟2-6.安全性設定 - Zone Transfer 限制

DNS 架構下常需透過更新 Zone File 動作來更新 DNS Master 及 DNS Slave 間 Zone File 的資料,在信任網域下將 Zone File 資料列出是 OK 的,但若是能由外界進行查詢您 Zone 資料時將會演變為具有危險的行為,想想若有人知道您 Zone File 設定都一清二楚那他即可針對特定主機進行攻擊行為,因此限制您的 Zone Transfer 將更顯重要。比較常被忘記的部份為會記得設定 DNS Master 其 allow-transfer 對象為 DNS Slave,但別忘記了 DNS Slave 必須設定 allow-transfer { "none"; }; 避免您的 Zone File 從 DNS Slave 端被傳送出去這是比較容易被忘記的設定。

 zone "weithenn.org" {
        type master;
        file "master/named.weithenn.for";
        allow-transfer { 61.60.59.57; };           //僅此 IP 能 Zone Transfer 此 Zone File
        allow-transfer { dns2.weithenn.org; };     //可配合 ACLs 使用
 };

步驟2-7.進階性設定 - 代詢伺服器機制

代詢伺服器 (Forwarders) 機制為當您為您的站台指派代詢伺服器後,那麼所有對外的 DNS 查詢都會先送到您所指定的代詢伺服器,讓代詢伺服器利用快取資訊幫您快速回應 DNS 查詢,在台灣我們可設定全台最大的 DNS 快取伺服器其設定內容如下:

 forwarders {
                168.95.192.1;
                168.95.1.1;
 };

設定好 named.conf 後可利用 BIND 9 新增加的指令 named-checkconf 來檢查 named.conf 設定檔語法是否正確,若語法正確則執行完指令後將不會有任何訊息,若語法有錯會顯示錯誤訊息及行數。

 /usr/sbin/named-checkconf                        //檢查 named.conf 語法是否有錯
                           -v                     //顯示 named-checkconf 版本

步驟3.建立 named.weithenn.for 檔案 (Forward)

建議您可複製剛才建立的反解範例檔案 localhost.rev 再進行修改可避免 keyin 錯誤。

 #vi /var/named/etc/namedb/master/named.weithenn.for   //建立正解檔內容如下
 $TTL      86400 
 @       IN      SOA     user.weithenn.org. hostmaster.weithenn.org. ( 
                                      2005042601 ; Serial 
                                      28800      ; Refresh 
                                      14400      ; Retry 
                                      3600000    ; Expire 
                                      86400 )    ; Minimum 
               IN      NS      gateway
               IN      A       61.60.59.58 
 gateway       IN      A       61.60.59.58 
 www           IN      A       61.60.59.58 
 mail          IN      A       61.60.59.58   
 @             IN      MX  10  mail 

設定好 named.weithenn.for 後可利用 BIND 9 新增加的指令 named-checkzone 來檢查 named.weithenn.for 設定檔語法是否正確,若語法正確則執行完指令後將不會有任何訊息,若語法有錯會顯示錯誤訊息及行數。

 /usr/sbin/named-checkzone weithenn.org named.weithenn.for         //檢查語法是否有錯
 /usr/sbin/named-checkzone -d weithenn.org named.weithenn.org      //開啟除錯功能
                           -v                                      //顯示 named-checkconf 版本

步驟4.修改服務設定檔 (rc.conf)

修改 /etc/rc.conf 中加入下列的設定以便在系統重新開機時時會啟動 DNS 服務

 #vi /etc/rc.conf                                                  //編輯rc.conf內容如下 
 named_enable="YES"                                                //啟動 named 服務  
 named_flags="-u bind"                                             //採用 bind 這個帳號來啟動 DNS 服務 (安全性設定) 

步驟5.修改本機 DNS 查詢設定檔 (resolv.conf)

修改本機 DNS 查詢設定檔 /etc/resolv.conf 加上 Domain Name 及本機 IP Address,關於此設定檔詳細內容可參考站內文章 resolv.conf

 #vi /etc/resolv.conf                                              //修改設定檔加入如下三行
 domain weithenn.org 
 nameserver 127.0.0.1                                               
 nameserver 61.60.59.58 

步驟6.啟動 DNS 服務

請鍵入如下指令啟動 DNS 服務

 #/etc/rc.d/named start                                            //啟動 DNS 服務
                  stop                                             //停止 DNS 服務
                  restart                                          //重新啟動 DNS 服務
                  rcvar                                            //顯示應該填入 rc.conf 的內容
                  reload                                           //重新讀取 DNS 設定檔
                  status                                           //顯示目前 DNS 狀態

安全性設定測試

剛才上面的安全性設定完成後,我們測試一下剛才的安全性設定是否生效

測試1.隱藏 BIND DNS 版本

透過下列指令來測試是否無法查詢到 BIND 版本 (DNS_Server就是您要測那一台的 domain name 或是 IP 也可以),不過隱藏 BIND DNS 版本不代表就絕對安全,只是讓攻擊者無法馬上得知您的 BIND DNS 版本 (好讓他方便找該版本漏洞)。

 #dig -t txt -c chaos VERSION.BIND DNS_Server

若設定正確則可看到回應 VERSION.BIND 就是您填入的內容,若沒設定好當然版本就被順利查詢到啦。

 ;; ANSWER SECTION:
 VERSION.BIND.           0       CH      TXT     "None of your business" //隱藏版本成功 
 VERSION.BIND.           0       CH      TXT     "9.3.0"                 //隱藏版本失敗

測試2.Zone Transfer 限制

檢測方式 (以 nslookup 為例 )

 #nslookup                                                               //進入 nslookup 交談模式
 >server weithenn.org                                                    //指定以 weithenn.org 為 NS 做查詢
 Default Server: weithenn.org
 Address: 61.60.59.58    
 >ls -d weitenn.org                                                      //檢查是否限制無法查尋 Zone File
 [weithenn.org] ***
  Can't list domain weitenn.org: Unspecified error

參考

[FreeBSD Handbook-BIND9 and FreeBSD]

[FreeBSD 使用手册-BIND9 和 FreeBSD]

[ DNS系統的強化與保護]

[BIND - logging file not found - LinuxQuestions.org]

[サーバ設定手順・パソコントラブル解決・エラー解決・コマンド集・プログラミング/「GOBU」(ゴブ)]

[DNS/BIND Issue: “named: the working directory is not writable” | Slaptijack]

[named: the working directory is not writable - The FreeBSD Forums]

Me FAQ

Q.logging channel 'security_log' file '/var/log/named/dns-security.log': file not found?

Error Message:

啟動 DNS 服務後,在系統訊息中看見如下錯誤訊息

 #tail /var/log/messages
 Jul 14 13:21:06 ms1 named[59648]: starting BIND 9.4.3-P2 -u bind -t /var/named -u bind
 Jul 14 13:21:06 ms1 named[59648]: command channel listening on 127.0.0.1#953
 Jul 14 13:21:06 ms1 named[59648]: the working directory is not writable
 Jul 14 13:21:06 ms1 named[59648]: logging channel 'default_log' file '/var/log/named/dns-default.log': file not found
 Jul 14 13:21:06 ms1 named[59648]: logging channel 'lamer_log' file '/var/log/named/dns-lamer.log': file not found
 Jul 14 13:21:06 ms1 named[59648]: logging channel 'query_log' file '/var/log/named/dns-query.log': file not found
 Jul 14 13:21:06 ms1 named[59648]: logging channel 'security_log' file '/var/log/named/dns-security.log': file not found
 Jul 14 13:21:06 ms1 named[59648]: isc_log_open '/var/log/named/dns-default.log' failed: file not found
 Jul 14 13:21:07 ms1 named[59648]: isc_log_open '/var/log/named/dns-query.log' failed: file not found
 Jul 14 13:21:13 ms1 named[59648]: isc_log_open '/var/log/named/dns-lamer.log' failed: file not found

Ans:

原因在於設定檔中指定的路徑並非實體路徑,而是相對於 Chroot 服務的相對路徑,可看到 DNS 執行序為 -t /var/named 配合 named.conf 中指定的相對路徑才是最後 Log 寫入路徑。

 #ps aux |grep named
 bind     59648  0.0  0.5 20724 16852  ??  Ss    1:21PM   0:00.12 /usr/sbin/named -u bind -t /var/named -u bind

而 named.conf 設定檔中內容如下

 logging {
    category lame-servers { lamer_log; };                            //在本DNS上查不到的記錄(遞迴查詢)
    category security{ security_log;};                               //安全記錄
    category queries { query_log;};                                  //查詢記錄
    category default {default_log;};                                 //BIND啟動記錄
    channel default_log {
        file "/var/log/named/dns-default.log" versions 10 size 20m;  //此 Log 寫入路徑為 /var/named/var/log/named/dns-default.log (修改前)
        file "/var/log/dns-default.log" versions 10 size 20m;        //此 Log 寫入路徑為 /var/named/var/log/dns-default.log (修改後)
        severity info;
    };

Q.the working directory is not writable?

Error Message:

啟動 DNS 服務後,在系統訊息中看見如下錯誤訊息

 #tail /var/log/messages
 Jul 14 15:18:01 ms1 named[64145]: starting BIND 9.4.3-P2 -t /var/named -u bind
 Jul 14 15:18:01 ms1 named[64145]: command channel listening on 127.0.0.1#953
 Jul 14 15:18:01 ms1 named[64145]: the working directory is not writable

Ans:

若您確定在 /var/named 下權限設定正確 (owner bind) 後啟動 DNS 服務仍看到錯誤訊息,請依如下步驟進行修改後再重新啟動 DNS 服務即可解決。

 #vi /etc/mtree/BIND.chroot.dist
 /set type=dir uname=root gname=wheel mode=0755             //預設值
 /set type=dir uname=bind gname=wheel mode=0755             //修改後
 #/etc/rc.d/named restart                                   //修改完成後重新啟動 DNS 服務

Q.connection timed out; no servers could be reached?

Error Message:

架設好 DNS 服務後使用 nslookup 去 Hinet DNS (168.95.1.1) 時回應如下錯誤訊息

 connection timed out; no servers could be reached

Ans:

此次的狀況為該網域 (Domain) 中設定的 DNS Server 指向不正確所造成,所以雖然 Bind 設定皆正確但找不到相對應的 Name Server,所以仍然無法正確查找到相關的 DNS Record,更改為 Domain 中正確的 Name Server 指向後運作即正常。

Q.failed while receiving responses: file not found?

Error Message:

設定好 DNS Slave 相關設定後,從 DNS Master 中有看到 DNS Slave 來進行 Zone Transfer 的動作 (資訊如下)

 client 61.60.59.58#45080: transfer of 'weithenn.org/IN': AXFR started
 client 61.60.59.58#45080: transfer of 'weithenn.org/IN': AXFR ended

但是在 DNS Slave 中「/var/named/etc/namedb/slave」資料夾內就是沒有 Zone File,查看 Log 之後發現如下錯誤訊息:

 transfer of 'weithenn.org/IN' from 71.70.69.68#53: failed while receiving responses: file not found

Ans:

當然在「Firewall」以及「相關權限部份」我都已經檢查過沒問題,但是 Zone File 就是無法同步過來,後來在仔細檢查一下 named.conf 內容後,發現個問題照理來說應該是「directory "/etc/namedb";」 才對,但我新裝的 FreeBSD 8.3 其預設值居然是 「directory "/etc/namedb/working";」,沒錯!! 就是這個問題導致,經過修改後問題就解決了!!

Go To Oddmuse OrgGo To FreeBSD OrgCreative Commons 2.5 Taiwansitestates.com