Chinaunix首页 | 论坛 | 博客
  • 博客访问: 323348
  • 博文数量: 25
  • 博客积分: 3090
  • 博客等级: 中校
  • 技术积分: 1305
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-27 17:59
文章分类

全部博文(25)

文章存档

2012年(1)

2011年(1)

2010年(4)

2009年(5)

2008年(14)

我的朋友

分类:

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 的網頁伺服器。

實作環境

  • 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)

安裝及設定

步驟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系統的強化與保護]

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 REFUSED?

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'

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:

參 考;因為我有設定代詢伺服器 (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) '' denied?

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 參數來決定。

  • 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 正常運作
};
阅读(1317) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~