bind9 - 架設 DNS 名稱解析伺服器

1、前言

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






文章目錄

1、前言
2、實作環境
3、安裝及設定
          步驟1.安裝相關套件
          步驟2.編輯 bind 設定檔 (named.conf)
          步驟3.建立 named.weithenn.for 檔案 (Forward)
          步驟4.每次開機時啟動 DNS 服務
          步驟5.編輯 /etc/resolv.conf 改變 nameserver 查尋順序
          步驟6.手動啟動 DNS 服務
4、補充:IPTables 設定
5、安全性設定測試
          隱藏 BIND DNS 版本
          Zone Transfer 限制
6、參考
7、Me FAQ
          Q1.Locating /var/named/chroot//etc/named.conf failed: FAILED?
          Q2.slaver dns 無法同步 master dns 的 zone file - dumping master file: tmp-tdjEbsWA0W: open: permission denied?
          Q3.** server can't find www.weithenn.org: REFUSED?
          Q4.named3355: lame server resolving 'makolinks.com' (in 'makolinks.com'?): 67.18.198.174#53?
          Q5.named3355: unexpected RCODE (SERVFAIL) resolving 'us.update2.toolbar.yahoo.com/A/IN': 168.95.192.1#53?
          Q6.named2559: client 127.0.0.1#32768: query (cache) 'www.asahi.com/A/IN' denied?
          Q7.named23614: named.weithenn.org:23: test_1.weithenn.org: bad owner name (check-names)?





2、實作環境

  • CentOS 5.1 (Linux 2.6.18-53.1.4.el5)
  • bind-9.3.3-10.el5
  • bind-chroot-9.3.3-10.el5
  • system-config-bind-4.0.3-2.el5.centos (cp to /etc/named.conf)





3、安裝及設定

步驟 1. 安裝相關套件

利用 yum 來安裝 bind 及其相關套件。
yum install system-config-bind        //安裝system-config-bind套件產生named.conf範例檔
yum groupinstall "DNS Name Server"   //安裝 bind 及 bind-chroot 套件

複製相關檔案到 Bind Chroot 目錄 /var/named/chroot/ 下。
cp -p /usr/share/system-config-bind/profiles/default/named.conf /var/named/chroot/etc/
ln -s /var/named/chroot/etc/named.conf /etc/named.conf   //建立連結到/etc下
cp -p /usr/share/system-config-bind/profiles/default/named/* /var/named/chroot/var/named/   //複製範例檔
cp /usr/share/doc/bind-9.3.3/sample/var/named/named.root /var/named/chroot/var/named/   //複製範例檔
chown -R named /var/named/chroot    //把 owner 權限更改為 named




步驟 2. 編輯 bind 設定檔 (named.conf)

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

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

限制查詢 BIND DNS 版本,為何要隱藏您的 BIND DNS 版本呢?原因在於有心人士可以先瞭解您 BIND 版本來尋找相關漏洞攻擊程式,讓您 DNS 伺服器無法運作,因此在 ISC BIND 下可以透過設定來隱藏 BIND 系統版本。
 options {
     directory       "/var/named";
     dump-file       "/var/named/data/cache_dump.db";    //將資料庫內容 Dump 出來路徑(執行rndc dumpdb)
     statistics-file "/var/named/data/named_stats.txt";  //統計資訊路徑
     version         "None of your business";            //當別人查詢BIND版本時顯示內容

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

我們可以利用存取控制清單 (Access Control List,ACL),來限制外來對 Domain 的查詢要求,可以配合 allow-query 參數來限制所有或特定 Zone 的查詢要求。
 acl "dns1.weithenn.org" { 61.60.59.58; };
 acl "dns2.weithenn.org" { 61.60.59.57; };

步驟 2-3. 安全性設定 -- 限制所有查詢要求 allow-query

也就是我只回應列表 IP 的查詢要求 (ex. 可以用 nslookup 將 server 指向我來進行查尋動作),下列我只回應 LAN 網段及 Hinet Cache DNS Server 的查詢要求。
 options {
          allow-query { 192.168.1.0/24; 168.95.192.1/32; 168.95.1.1/32; };
 };

步驟 2-4. 安全性設定--限制所有查詢要求 allow-recursion

就是允許哪些來源可以使用 DNS 主機進行遞迴查詢動作。簡單說就是透過這台 DNS 來查詢任何資料,包含不是該 DNS 主機負責的 zone 也代為查詢,你不想讓別人用你的 DNS 去探查別人的 DNS 主機資訊吧?
 options {
          allow-recursion { 127.0.0.1/32; 192.168.1.0/24; 61.60.59.58/32; };
 };

步驟 2-5. 安全性設定 -- 代詢伺服器機制

代詢伺服器 (Forwarders) 機制為當你為你的站台指派代詢伺服器後,那麼所有對外的 DNS 查詢都會先送到你所指定的代詢伺服器,讓代詢伺服器利用快取資訊幫您快速回應 DNS 查詢,設定內容如下:
 forwarders {
                168.95.192.1;
                168.95.1.1;
 };

步驟 2-6. 安全性設定 -- 限制特定 Zone 查詢要求

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

要注意的是當您設定限制所有或特定 Zone 的查詢要求時,其特定 Zone 設定優先權將大為限制所有查詢要求。

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

DNS 架構下常需透過更新 Zone File 動作更新 Master 及 Slave 間 Zone File 的資料,在信任網域下,將 Zone File 資料列出是 OK 的,若是能由外界進行查找您的 Zone 資料時將為演變為具有危險的行為,想想若有人將您 Zone File 的設定都摸的一清二楚,感覺相當恐怖的,因此限制您的 Zone transfer 將是必須的。要記得的是 Slave 要設定為 allow-transfer { "none"; }; 這是比較容易被忘記的設定。
 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 使用
 };

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




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

可複製 named.local 範例檔再修正即可避免 keyin 錯誤,SOA 為標準區域中的第一筆記錄,( )內為與次要DNS溝通的資訊,依序為區域版本編號、同步更新時間、重試同步時間、同步到期時間、快取存活時間,單位為(秒)。
vi /var/named/chroot/var/named/named.weithenn.org   //建立正解檔內容如下
 $TTL      86400
 @       IN      SOA     user.weithenn.org. hostmaster.weithenn.org. (
                                      2008012101 ; 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
 dns1          IN      A       61.60.59.58
 dns2          IN      A       61.60.59.57
 @             IN      MX  10  mail 

設定好 named.weithenn.org 後可利用 BIND 9 才新增加的指令 named-checkzone 來檢查 named.weithenn.org 設定檔語法是否正確,若語法正確則執行完指令後將不會有任何訊息,若語法有錯會顯示錯誤訊息及行數。
/usr/sbin/named-checkzone weithenn.org named.weithenn.org      //檢查語法是否有錯
/usr/sbin/named-checkzone -d weithenn.org named.weithenn.org   //開啟除錯功能
                                                              -v //顯示 named-checkconf 版本



步驟 4. 每次開機時啟動 DNS 服務

使用 chkconfig 指令來查看 named 在各 runlevel 下狀態。
chkconfig --list |grep named
 named           0:off   1:off   2:off   3:off   4:off   5:off   6:off

設定 named 在開機時 (runlevel 為 2、3、4、5 時) 會啟動服務。
chkconfig named on     
檢查剛才的設定是否生效。
chkconfig --list | grep named
 named           0:off   1:off   2:on    3:on    4:on    5:on    6:off




步驟 5. 編輯 /etc/resolv.conf 改變 nameserver 查尋順序

編輯 /etc/resolv.conf 設定檔內容,改變 nameserver 查詢順序。
domain weithenn.org
 nameserver 127.0.0.1     //設定自已為 dns 查尋順序第一個
 nameserver 61.60.59.58

並確定 /etc/nsswitch.conf 內對於 hosts 的搜尋順序。
grep hosts: /etc/nsswitch.conf
 #hosts:     db files nisplus nis dns
 hosts:      files dns   //先 /etc/hosts 再 /etc/resolv.conf




步驟 6. 手動啟動 DNS 服務

鍵入如下指令啟動 DNS 服務。
/etc/rc.d/init.d/named start
 Starting named:                                              [OK]  

檢查一下 named process 是否執行。
ps ax |grep named
 17798 ?        Ssl    0:00 /usr/sbin/named -u named -t /var/named/chroot

檢查是否 LISTEN Port 53 (named)、953 (rndc)。
netstat -tnl
 Active Internet connections (only servers)
 Proto Recv-Q Send-Q Local Address   Foreign Address       State
 tcp        0      0 61.60.59.58:53  0.0.0.0:*             LISTEN
 tcp        0      0 127.0.0.1:53    0.0.0.0:*             LISTEN
 tcp        0      0 127.0.0.1:953   0.0.0.0:*             LISTEN
 tcp        0      0 ::1:953         :::*                  LISTEN






4、補充:IPTables 設定

若您的 CentOS 有開啟 IPTables Firewall 則記得開啟 Port 53 (tcp / udp),參考 /etc/services。
cat /etc/sysconfig/iptables
 *filter
 :INPUT DROP 0:0
 :FORWARD DROP 0:0
 :OUTPUT ACCEPT 0:0
 -A INPUT -i lo -j ACCEPT
 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
 -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
 -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT
 -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --dport 53 -j ACCEPT  //加入此行
 -A INPUT -i eth0 -p udp -s 192.168.1.0/24 --dport 53 -j ACCEPT  //加入此行
 -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --dport 80 -j ACCEPT
 COMMIT

加入防火牆規則後,記得重新啟動 iptables service,以便套用生效。
/etc/rc.d/init.d/iptables restart





5、安全性設定測試

隱藏 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"                 //隱藏版本失敗


Zone Transfer 限制

用 windows xp 的命令提示字元並使用 nslookup 去測試。
nslookup                    //進入nslookup交談模式
 >server dns1.weithenn.org   //指定以 weithenn.org 為 NS 做查詢
 Default Server: dns1.weithenn.org
 Address: 61.60.59.58
 >ls -d weitenn.org          //有做限制無法查尋Zone File
 [dns1.weithenn.org] ** Can't list domain weithenn.org: Query refused

並且可從 DNS Server 上看到如下訊息 (zone transfer denied)。
tail /var/log/messages
 Jan 21 17:23:20 dns1 named18861: client 192.168.1.5#3021: zone transfer 'weithenn.org/AXFR/IN' denied






6、參考






7、Me FAQ

Q1. Locating /var/named/chroot//etc/named.conf failed: FAILED?

Error Message:
使用 yum 群組安裝 "DNS Name Server" 卻出現如下訊息說找不到 named.conf 設定檔?
yum groupinstall "DNS Name Server"
 ...略
 Running Transaction
  Installing: bind                    ######################### 1/2
  Installing: bind-chroot             ######################### 2/2
 Locating /var/named/chroot//etc/named.conf failed:            //失敗?
 FAILED
 Installed: bind.i386 30:9.3.3-10.el5 bind-chroot.i386 30:9.3.3-10.el5
 Complete!


Ans:
因為安裝時只選 KDE 其它都沒選,所以也沒有 /etc/named.conf 此時只要安裝 system-config-bind 套件即可產生 Bind 9 相關範例檔。
yum install system-config-bind  //安裝 system-config-bind 套件以產生named.conf範例檔

Q2.slaver dns 無法同步 master dns 的 zone file - dumping master file: tmp-tdjEbsWA0W: open: permission denied?

Error Message:
slaver dns 設定好相關內容也使用 /usr/sbin/named-checkconf 檢查過語法沒問題,但就是無法同步 master dns 的 zone file 查看 /var/log/message 發現如下錯誤訊息
tail /var/log/messages
 Jan 21 16:10:48 dns1 named17951: zone weithenn.org/IN: Transfer started.
 Jan 21 16:10:48 dns1 named17951: dumping master file: tmp-2EyNgvNaiD: open: permission denied
 Jan 21 16:10:48 dns1 named17951: transfer of 'weithenn.org/IN' from 192.168.1.22#53: failed while receiving responses: permission denied


Ans:
看到訊息有 permission denied 的字眼,直覺想到應該是權限的問題查看了 named 的 process 是 -u (user) 是 named 但我 /var/named 下有些 owner 是 root 應該是此問題所導致的,改變 /var/named 下的權限後就可順利同步 master dns zone files 了 (當然前提是 iptables 也設定好)。
ps ax |grep named                     //查看 named process
 17951 ?        Ssl    0:00 /usr/sbin/named -u named -t /var/named/chroot
chown -R named:named /var/named/   //改變權限




Q3.** server can't find www.weithenn.org: REFUSED?

Error Message:
當要利用 nslookup 來查詢 dns 設定是否正確時,卻無法查詢並得到如下錯誤訊息。
nslookup
 >www.weithenn.org
 Server:         192.168.1.100
 Address:        192.168.1.100#53
 ** server can't find www.weithenn.org: REFUSED

且在 dns server 也看到如下拒絕 client 查詢的訊息
tail /var/log/messages
 Jan 21 16:29:56 dns1 named18861: client 192.168.1.100#32808: query 'www.weithenn.org/A/IN' denied


Ans:
原因在於我忘了把 LAN 網段加入 allow-query 內,因此 dns server 當然拒絕回應查詢要求啦,把 LAN 網段加入 allow-query 允許的網段並 reload named 即可。
 options {
          allow-query { 192.168.1.0/24; 168.95.192.1/32; 168.95.1.1/32; };  //加入 LAN 網段
 };

並重新 reload named (重新讀取設定檔內容)
/etc/rc.d/init.d/named reload
 Reloading named:                                             [OK]
tail /var/log/messages
 Jan 21 18:50:25 dns1 named18861: loading configuration from '/etc/named.conf'




Q4. named3355: lame server resolving 'makolinks.com' (in 'makolinks.com'?): 67.18.198.174#53?

Error Message:
在 /var/log/messages 內出現如下訊息
 Jan 28 09:54:17 ns2 named3355: lame server resolving 'makolinks.com' (in 'makolinks.com'?): 67.18.198.174#53
 Jan 28 13:23:05 ns2 named3355: lame server resolving 'ns2.osdedicated.net' (in 'osdedicated.NET'?): 72.52.248.169#53
 Jan 28 13:23:05 ns2 named3355: lame server resolving 'ns1.osdedicated.net' (in 'osdedicated.NET'?): 72.52.248.169#53


Ans:

原因是當我們的 DNS 主機去向外面的 DNS 查詢某些網域的正反解析名稱時,可能因為對方 DNS 主機的設定錯誤,導致無法正確解析網域的正反解此時就會發生 lame server 解析問題,這問題跟我們的 Name Server 主機沒關系但會一直看到訊息也是很煩,若不想看到此訊息請修改 named.conf 後重新啟動 named service。
vi /var/named/chroot/etc/named.conf
 logging {                        //加入此三行 (在 rndc.key 上面)
 category lame-servers { null; };
 };
 include "/etc/rndc.key";

修改完後重新啟動 named service 後就可了。
/etc/rc.d/init.d/named restart   //重新啟動 named service



Q5.named3355: unexpected RCODE (SERVFAIL) resolving 'us.update2.toolbar.yahoo.com/A/IN': 168.95.192.1#53?

Error Message:
在 /var/log/messages 內發現如下訊息
 Jan 28 10:54:30 ns-2 named3355: unexpected RCODE (SERVFAIL) resolving 'us.update2.toolbar.yahoo.com/A/IN': 168.95.192.1#53
 Jan 28 10:59:36 ns-2 named3355: unexpected RCODE (SERVFAIL) resolving 'ts.richmedia.yahoo.com/A/IN': 168.95.192.1#53
 Jan 28 11:36:26 ns-2 named3355: unexpected RCODE (SERVFAIL) resolving 'cindyflower.home.services.spaces.live.com/A/IN': 168.95.192.1#53
 Jan 28 11:36:26 ns-2 named3355: unexpected RCODE (SERVFAIL) resolving 'cindyflower.home.services.spaces.live.com/A/IN': 168.95.1.1#53
 Jan 28 11:40:05 ns-2 named3355: unexpected RCODE (SERVFAIL) resolving 'canvas415taiwan.spaces.live.com/A/IN': 168.95.1.1#53

Ans:
因為我有設定代詢伺服器 (Forwarders)所以會看到最後 Name Server 主機是 Hinet Cache Server 回應的,解決方法就是你在整個 Named Server 主機的 allow-query、allow-recursion 只設給你信任的網域,而你管理的 zone 則可設 allow-query { any; };
vi /var/named/chroot/etc/named.conf
 options {                            
    allow-query { localnets; };       //設為您信任的網域
    allow-recursion { localnets; };   //設為您信任的網域
 };
 zone "example.com" {                 //管理的 zone 設定
    allow-query { any; };             //回應任何 IP 的查詢要求
 };

修改完後重新啟動 named service 後就可了。
/etc/rc.d/init.d/named restart   //重新啟動 named service



Q6. named2559: client 127.0.0.1#32768: query (cache) 'www.asahi.com/A/IN' denied?

Error Message:
在 /var/log/messages 內發現如下訊息?
 Apr 29 15:18:10 ns-2 named2559: client 127.0.0.1#32768: query (cache) 'www.asahi.com/A/IN' denied
 Apr 29 15:18:14 ns-2 named2559: client 127.0.0.1#32768: query (cache) 'www.gslb.asahi.com/A/IN' denied


Ans:
這個問題的發生是因為你的 named.conf 內有設定 allow-query 但卻沒有允許 127.0.0.1 可以查詢所造成的,修改 named.conf 及 /etc/resolv.conf 把 127.0.0.1 加上即可。
vi /var/named/chroot/etc/named.conf
 allow-query { 127.0.0.1/32; };      //加上 127.0.0.1
vi /etc/resolv.conf
 nameserver 127.0.0.1                //加上 127.0.0.1
/etc/rc.d/init.d/named restart
 Stopping named: .                      [OK]
 Starting named:                        [OK]




Q7. named23614: named.weithenn.org:23: test_1.weithenn.org: bad owner name (check-names)?

Error Message:
啟動 named 服務後在 /var/log/messages 內發現如下訊息,而機器雖然有跑起 process 及 listen port 但服務似乎有問題。
tail /var/log/message
 May  9 17:58:30 ns-3 named23614: named.weithenn.org:23: test_1.weithenn.org: bad owner name (check-names)
 May  9 17:58:30 ns-3 named23614: zone weithenn.org/IN: loaded serial 2008050902

且用 nslookup 查尋解析的名稱也會說因為 server 有問題所以往下一個 name server 查尋?
nslookup
 >ftp
 ;; Got SERVFAIL reply from 127.0.0.1, trying next server      //無法使用
 ;; Got SERVFAIL reply from 192.168.1.10, trying next server   //無法使用
 Server:        192.168.1.11    //在 /etc/resolv.conf 指定的 named server
 Address:       192.168.1.11#53
 Name:          ftp.weithenn.org
 Address:       61.60.59.58
 >


Ans:
原因就出在於我的 zone file 內有一筆 A Record 是有底線 (_) 所造成的,解決方式就是利用在 named.conf 內的 option 加上 check-names 參數來決定。
  • warn:警告,會顯示警告訊息但 Named Server 仍可正常運作
  • fail:失敗,會顯示警告訊息且 Named Server 無法正常運作
  • ignore:忽略,不顯示警告訊息 Named Server 正常運作
 check-names (master|slave|response) (warn|fail|ignore);
所以我的解決方式為 DNS Master 設為 warn 而 DNS Slaver 則設為 ignore,因為 Slaver 的 zone 是來自 Master 所以我警告訊息只要給 Master 看就好,Slaver 就不必顯示了。

DNS Master named.conf
 options {
           check-names master warn;   //警告,會顯示警告訊息但 Named Server 仍可正常運作
 };

DNS Slaver named.conf
 options {
           check-names slave ignore;  //忽略,不顯示警告訊息 Named Server 正常運作
 };