分类:
2010-03-29 16:29:27
DNS (Domain Name Service) 主要目地為解決 Domain Name 與 IP Address 之間相互的對應問題,在網路世界間中的溝通其實就是使用 IP Address 來溝通(就像是人類使用的身份證),但一連串的數字這樣對人類來說太過於麻煩,因此便出現 Domain Name Service 服務來將 IP Address 轉換成人類可方便閱讀的 Domain Name,簡單來說就是將您所輸入的網址 tw.yahoo.com 轉成 IP,以便連結到 Yahoo 的網頁伺服器。
利用 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
#vi /var/named/chroot/etc/named.conf //編輯 named.conf 內容如下
限制查詢 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版本時顯示的內容
我們可以利用存取控制清單 (Access Control List,ACL),來限制外來對 Domain 的查詢要求,可以配合 allow-query 參數來限制所有或特定 Zone 的查詢要求。
acl "dns1.weithenn.org" { 61.60.59.58; };
acl "dns2.weithenn.org" { 61.60.59.57; };
也就是我只回應列表 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; };
};
就 是允許哪些來源可以使用 DNS 主機進行遞迴查詢動作。簡單說就是透過這台 DNS 來查詢任何資料,包含不是該 DNS 主機負責的 zone 也代為查詢,你不想讓別人用你的 DNS 去探查別人的 DNS 主機資訊吧?
options {
allow-recursion { 127.0.0.1/32; 192.168.1.0/24; 61.60.59.58/32; };
};
代詢伺服器 (Forwarders) 機制為當你為你的站台指派代詢伺服器後,那麼所有對外的 DNS 查詢都會先送到你所指定的代詢伺服器,讓代詢伺服器利用快取資訊幫您快速回應 DNS 查詢,設定內容如下:
forwarders {
168.95.192.1;
168.95.1.1;
};
zone "weithenn.org" {
type master;
file "master/named.weithenn.for";
allow-query { dns2.weithenn.org; }; //我只回應這個 IP 的查詢要求
};
要注意的是當您設定限制所有或特定 Zone 的查詢要求時,其特定 Zone 設定優先權將大為限制所有查詢要求。
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 版本
可複製 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 版本
使用 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
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
#/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
若您的 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_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" //隱藏版本失敗
用 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
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 範例檔
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/ //改變權限
Error Meaage:
當要利用 nslookup 來查詢 dns 設定是否正確時,卻無法查詢並得到如下錯誤訊息
#nslookup
>
Server: 192.168.1.100
Address: 192.168.1.100#53
** server can't find REFUSED
且在 dns server 也看到如下拒絕 client 查詢的訊息
#tail /var/log/messages
Jan 21 16:29:56 dns1 named[18861]: client 192.168.1.100#32808: query '/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'
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
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:
參 考;因為我有設定代詢伺服器 (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
Error Meaage:
在 /var/log/messages 內發現如下訊息
Apr 29 15:18:10 ns-2 named[2559]: client 127.0.0.1#32768: query (cache) '' denied
Apr 29 15:18:14 ns-2 named[2559]: client 127.0.0.1#32768: query (cache) '' 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 ]
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 正常運作
};