站長新書 站長開講 首頁 最新文章 站長著作及審校 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,簡單來說就是將您所輸入的網址 tw.yahoo.com 轉成 IP,以便連結到 Yahoo 的網頁伺服器。DNS 伺服器的原理與運作流程

實作環境

安裝及設定

步驟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/      //複製 named.conf 範例檔
 #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/   //複製相關範例檔至 bind chroot 目錄下
 #cp /usr/share/doc/bind-9.3.3/sample/var/named/named.root /var/named/chroot/var/named/       //複製 bind root 檔至 bind chroot 目錄下
 #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";  //統計資訊路徑(執行rndc stats)
        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 查尋順序

 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 服務

 #/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

補充: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   -->加入此行 (less /etc/services)
 -A INPUT -i eth0 -p udp -s 192.168.1.0/24 --dport 53 -j ACCEPT   -->加入此行(less /etc/services)
 -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

安全性設定測試

隱藏 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 named[18861]: client 192.168.1.5#3021: zone transfer 'weithenn.org/AXFR/IN' denied

參考

[ DNS系統的強化與保護]

[DNS Tips - TechWiki]

[Quick HOWTO : Ch18 : Configuring DNS/zh - Ubuntu中文]

[Centos 5 problem with starting named fail - Page 2 - HowtoForge Forums | HowtoForge - Linux Howtos and Tutorials]

[ HowtoForge - Traditional DNS Howto]

[eastern-logic.com » Blog Archive » named.conf file is missing on CentOS5 systems]

[Tony Bhimani’s Blog » Blog Archive » What happened to named.conf in ISC BIND DNS on Fedora 7?]

[酷!學園 - DNS問題:Slave無法取得Master資料]

[鳥哥的 Linux 私房菜 -- DNS Server]

[Unexpected rcode (SERVFAIL) - KhoLiX Wiki]

[Solaris 資訊站 - BIND 細項功能設定]

[SuSE Linux 論壇 :: 觀看文章 - DNS Server 架設問題]

Me FAQ

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

Error Meaage:

使用 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 Meaage:

slaver dns 設定好相關內容也使用 /usr/sbin/named-checkconf 檢查過語法沒問題,但就是無法同步 master dns 的 zone file 查看 /var/log/message 發現如下錯誤訊息

 #tail /var/log/messages
 Jan 21 16:10:48 dns1 named[17951]: zone weithenn.org/IN: Transfer started.
 Jan 21 16:10:48 dns1 named[17951]: dumping master file: tmp-2EyNgvNaiD: open: permission denied
 Jan 21 16:10:48 dns1 named[17951]: 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 Meaage:

當要利用 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 named[18861]: 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 named[18861]: loading configuration from '/etc/named.conf'

Q4.named[3355]: lame server resolving 'makolinks.com' (in 'makolinks.com'?): 67.18.198.174#53?

Error Meaage:

在 /var/log/messages 內發現如下訊息

 Jan 28 09:54:17 ns2 named[3355]: lame server resolving 'makolinks.com' (in 'makolinks.com'?): 67.18.198.174#53
 Jan 28 13:23:05 ns2 named[3355]: lame server resolving 'ns2.osdedicated.net' (in 'osdedicated.NET'?): 72.52.248.169#53
 Jan 28 13:23:05 ns2 named[3355]: 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.named[3355]: unexpected RCODE (SERVFAIL) resolving 'us.update2.toolbar.yahoo.com/A/IN': 168.95.192.1#53?

Error Meaage:

在 /var/log/messages 內發現如下訊息

 Jan 28 10:54:30 ns-2 named[3355]: unexpected RCODE (SERVFAIL) resolving 'us.update2.toolbar.yahoo.com/A/IN': 168.95.192.1#53
 Jan 28 10:59:36 ns-2 named[3355]: unexpected RCODE (SERVFAIL) resolving 'ts.richmedia.yahoo.com/A/IN': 168.95.192.1#53
 Jan 28 11:36:26 ns-2 named[3355]: unexpected RCODE (SERVFAIL) resolving 'cindyflower.home.services.spaces.live.com/A/IN': 168.95.192.1#53
 Jan 28 11:36:26 ns-2 named[3355]: unexpected RCODE (SERVFAIL) resolving 'cindyflower.home.services.spaces.live.com/A/IN': 168.95.1.1#53
 Jan 28 11:40:05 ns-2 named[3355]: unexpected RCODE (SERVFAIL) resolving 'canvas415taiwan.spaces.live.com/A/IN': 168.95.1.1#53

Ans:

參考[Unexpected rcode (SERVFAIL) - KhoLiX Wiki];因為我有設定代詢伺服器 (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.named[2559]: client 127.0.0.1#32768: query (cache) 'www.asahi.com/A/IN' denied?

Error Meaage:

在 /var/log/messages 內發現如下訊息

 Apr 29 15:18:10 ns-2 named[2559]: client 127.0.0.1#32768: query (cache) 'www.asahi.com/A/IN' denied
 Apr 29 15:18:14 ns-2 named[2559]: 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          //重新啟動 named 服務即可
 Stopping named: .                                          [  OK  ]
 Starting named:                                            [  OK  ]

[BIND problem "query (cache) denied"]

[comp.unix.solaris: Re: named: client 127.0.0.1#32768: query (cache) denied]

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

Error Meaage:

啟動 named 服務後在 /var/log/messages 內發現如下訊息,而機器雖然有跑起 process 及 listen port 但服務似乎有問題。

 #tail /var/log/message
 May  9 17:58:30 ns-3 named[23614]: named.weithenn.org:23: test_1.weithenn.org: bad owner name (check-names)
 May  9 17:58:30 ns-3 named[23614]: 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 參數來決定。

 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 正常運作
 };
Go To Oddmuse OrgGo To FreeBSD OrgCreative Commons 2.5 Taiwansitestates.com