slackware 10.1+bind9的環境下架設DNS伺服器
環境: slackware10.1/kernel 2.4.29/pIII550/64m/10g
使用slackware10.1的BIND包默認安裝
公網網卡eth0 地址211.137.217.251
前提:
理解 DNS 的授權模式 ? 是怎樣進行的?
理解 DNS 正解和反解 ?
理解 DNS 的查詢模式 ? 查詢過程是怎樣的?
如果您對於以上問題還不了解,那麼我建議您到這裡看看
--------------------------------------------------------------------------------
下面進入正題
1 設置named.conf
首先﹐打開named.conf文件﹐路徑 /etc/named.conf
我先將我自己的文檔列了出來﹕
options {
directory "/var/named";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
forward first;
forwarders {
202.102.224.68;
202.102.227.68;
};
};
//
// a caching only nameserver config
//
zone "." IN {
type hint;
file "caching-example/named.ca";
};
zone "localhost" IN {
type master;
file "caching-example/localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "caching-example/named.local";
allow-update { none; };
};
zone "hnzzcc.com" IN {
type master;
file "db.hnzzcc.com";
};
zone "217.137.211.in-addr.arpa" IN {
type master;
file "db.211.137.217";
};
zone "ln.hnzzcc" IN {
type forward;
forwarders { 10.87.13.87; 10.87.13.96; };
};
options 設置﹐首先用 directory 指定了 named 的資源記錄( RR - Resource Record )目錄所在位置為﹕「/var/named」﹔它說明了我們配置NAMED的設置文件都在這個目錄下
接下來看一下註釋
接下來再讓我們看下一段句子﹕ 如果您要設置的DNS伺服器和DNS client之間要是有防火牆的話,要將"「// query-source address * port 53;"前面的"//"註解拿掉.這些設置對8.1之前的版本影響
我們用的是BIND9,不必擔心.如果您設置的有防火牆我建議您在iptables 中添加以下語句:
iptables -A INPUT -p tcp -i eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --dport 53 -j ACCEPT
接下來的是轉發(forward)設定
forward first;
forwarders {
202.102.224.68;
202.102.227.68;
};
它說明了:如果伺服器查找不到相關的DNS信息,那麼轉發到202.102.224.68和202.102.227.68來查詢
接下來是zone區域
zone "." IN {
type hint;
file "caching-example/named.ca";
};
zone "localhost" IN {
type master;
file "caching-example/localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "caching-example/named.local";
allow-update { none; };
};
"."定義了根區域,它同時又是一個INTERNET類別,詳細解釋需要很多篇幅,建議大家看一下相關書籍
以上zone設置是默認設置;定義了本機的DNS﹕第一個 zone 是 localhost 的正解 zone﹐其伺服器屬於DNS master﹐記錄文件名稱是 localhost.zone (在 /var/named/caching-example 目錄下面)﹐但這個 zone 不允許客戶主機(或伺服器)自行更新 DNS 的記錄.
而第二個 zone 則是本機區域的反解 zone
現在我建議您先看一下named.conf中的directory "/var/named"
ls /var/named/caching-example我們會看到這些文件
named.ca
localhost.zone
named.local
也就是說每一個區域對應一個記錄文件
2 zone區域記錄文件
我們來打開這些文件看一下,首先是localhost.zone
$TTL 86400
$ORIGIN localhost.
@ 1D IN SOA @ root (
42 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
1D IN NS @
1D IN A 127.0.0.1
內容很簡單﹐但您是否真的了解每一行的設定意思呢﹖如果不清楚或不確定﹐那就讓我們一起探討。
首先﹐第一行是一個 TTL 設定﹐目前是定義出記錄文件裡面的各項記錄的默認 TTL 值為 86400 秒(剛好是一天)。沒有這一行並不影響功能﹐但會出現一些警告.
第二行是一個 ORIGIN 設定﹐說明下面的記錄出自何處.請您加倍留意最後的一個小小數點"."
然後﹐第三行﹐是一個 SOA 記錄的設定﹐在這裡我們看到一個特殊字元@,它就是 ORIGIN 的意思﹐也就是剛剛所定義的 $ORIGIN localhost. 內容﹐您可以寫成 localhost. 也可以用@ 來代替。假如這個文件前面沒有定義 $ORIGIN 的話﹐那這個@的值就以 named.conf 里的 zone .
在@之後﹐是 TTL 的設定﹐這裡是 1D﹐也就是一天的意思.
SOA ﹐也就是「Start Of Authority」的意思﹐表示目前區域的授權開始。每一個記錄文件只能有一個 SOA ﹐不能重複﹐而且必須是所負責的 zone 中第一個"記錄".
《解決方案》
接著 SOA 後面,指定了這個區域的授權主機和管理者的信箱,這裡分別是@和「 root 」,也就是 localhost. 主機和 root 信箱。這裡要注意的是:SOA 的主機名稱必須能夠在 DNS 系統中找到一個 A 記錄 (以後會提到);另外,我們平時使用的信箱通常是「user@host」這樣的格式,但因為@在 DNS 記錄中是個保留字元(剛才已經提過),所以在 SOA 中就用「.」來代替了@。目前這個信箱是 root (並沒有主機地址),也就是本機,您可以寫成 「root.localhost.」但不能寫成「root@localhost.」。
接下來的 SOA 設置,是被括在「( )」之間的 5 組數字,主要作為和 slave 伺服器同步 DNS 資料所使用的資料:
Serial:其格式通常會是「年月日+修改次序」(但也不一定如此,您自己能夠記得就行)。當 slave 要進行資料同步的時候,會比較這個號碼。如果發現在這裡的號碼比它那邊的數值「大」,就進行更新,否則忽略。不過設 serial 有一個地方您要留意:不能超過 10 位數字!
Refresh:這裡是是告訴 slave 要隔多久要進行資料同步(是否同步要看 Serial 的比較結果)。
Retry:如果 slave 在進行更新失敗后,要隔多久再進行重試。
Expire:這是記錄逾期時間:當 slave 一直未能成功與 master 取得聯繫,那到這裡就放棄 retry,同時這裡的資料也將標識為過期( expired )。
Minimum:這是最小默認 TTL 值,如果您在前面沒有用「$TTL」來定義,就會以此值為準。
以上的數字都是以秒為單位,但您也可以用 H(小時)、D(天)、W(星期)來做單位,如:3H 和 259200 是一樣的。
請注意:SOA 記錄中這對 「 ( ) 」符號之第一個 「 (」括弧一定要和 SOA 寫在同一行,而不能用 Enter 斷行到下一行去(有時候您在書本的範例中看到這個符號排在下一行去了,那是因為版面的關係而已),而且其左邊最好有一個空格鍵或 tab 建。而最後一個 「 )」括弧也不能寫在註解符號 「 ;」的右邊。
設置 DNS 的 RR 記錄檔,其格式要求非常嚴格,我們絲毫不能掉以輕心。比方說:如果句子不是以空格鍵、Tab 鍵、 或註解符號 ( ; )開頭,也不在 SOA 的 「 ( ) 」之內, 則表示要定義一個「新記錄項 (Entry) 」;如果句子是以空格鍵或 tab 鍵開始的話,其設置被視為上一個「記錄項」的內容。所以,如果您要為「同一個記錄項」定義多個記錄設置,而不想重複打字,您倒可以偷懶:在接著它的後面幾行用空白或 Tab 來縮排就可以了。所以,最後這兩行還是關於 localhost. 的設置,因為上一個「資料項」為 「 @ 」,也就是 localhost. 。當然,您如不喜歡,這兩行句子也可以這樣寫:
;; 修改前:
1D IN NS @
1D IN A 127.0.0.1
;; 修改後:
@1D IN NS @
@1D IN A 127.0.0.1
;; 或:
localhost.1D IN NS localhost.
localhost.1D IN A 127.0.0.1
這兩行的意思是說:負責 localhost. 這個記錄的 name server ( NS ) 是 localhost. 這台機器;而 localhost. 的 IP Address ( A ) 是 127.0.0.1 。DNS 裡面的 A 記錄應該是最常見的記錄類型之一,如果在 IPv6 版本中,地址記錄名稱則改為 AAAA 。
Tips:關於更多的記錄名稱,請參閱「學習網路」中的「DNS 協議」。
最後,讓我們檢查剩下的 named.local 文件吧。如果您還沒忘記 /etc/named.conf 的內容的話,應知道這個文件是 zone "0.0.127.in-addr.arpa" 的『反解』記錄檔,它的內容也很簡單:
$TTL 86400
@ IN SOA localhost. root.localhost. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS localhost.
1 IN PTR localhost.
前面的部份應該不用多解釋了(如果您還不清楚,那就必須重讀前面的文章)。最後一行我們看到一個「 PTR 」記錄,它是「Pointer」的意思。 PTR 通常用於反記錄當中,將 IP 指向主機名稱(剛好和 A 記錄相反)。您或許還不是很清楚這個句子為什麼是這樣設置的吧?或許您會這樣問:您不是說 PTR 是從 IP 反查詢主機名稱的嗎?為什麼這裡是 1 而不是 127.0.0.1 ?
哦
《解決方案》
,如果您有這樣的問題,那證明您對 DNS 的查詢模式還不是了解得很透徹,不過也不用緊張,在後面的實作例子中,您將獲得更進一步的感性認識。這裡,我暫時簡單解釋上面這行就是了:
我們知道 127.0.0.1 所映射的主機名稱就是 localhost ,因為這裡是反向查詢,所以 IP 順序是掉過來寫的,於是這個反查詢 IP 就是:「 1.0.0.127.in-addr.arpa. 」,由於我們這裡的 ORIGIN @ 是「 0.0.127.in-addr.arpa." 」,因為在記錄檔中,如果名稱不帶小數點,則被補上 $ORIGIN 或 zone 的名稱,所以這個 「 1 」就成了 1.0.0.127.in-addr.arpa. 」。同樣道理,後面的「 localhost. 」如果漏了最後的小點的話,則會成為「 localhost.0.0.127.in-addr.arpa. 」,這顯然是不對的。假如您喜歡,可以將這行句子修改成為下面的樣子:
;;修改前:
1 IN PTR localhost.
;;修改後:
1.0.0.127.in-addr.arpa. IN PTR localhost.
3 設定自己的NAMED
下面設置我們自己定義的域名
設置之前首先要說的是必須已經申請過自己的DNS,擁有自己的固定IP的公網主機.
那麼我的域名是 hnzzcc.com,我聯繫了ISP把DNS 區域hnzzcc.com 指向了我的主機:211.137.217.251
在named.conf中增加以下內容
zone "hnzzcc.com" IN {//正解區域名稱
type master;//區域類型
file "db.hnzzcc.com";//記錄文件名稱
};
zone "217.137.211.in-addr.arpa" IN {//反解....
type master;//......
file "db.211.137.217";//.....
};
zone "ln.hnzzcc" IN { //公司內部區域名稱,在此文中沒有作用.
type forward; //類型是轉發
forwarders { 10.87.13.87; 10.87.13.96; };//轉發的地址
};
建立db.hnzzcc.com文件,文件內容:
$TTL 86400
$ORIGIN hnzzcc.com.
@ IN SOA ns.hnzzcc.com. root.ns.hnzzcc.com. (
2005072605
28800
14400
3600000
86400 )
IN NS hnzzcc.com.
IN NS ns.hnzzcc.com.
IN MX 10 ns.hnzzcc.com. //MX記錄
@ IN A 211.137.217.251 //指定域主機地址
ns IN A 211.137.217.251 //A記錄
IN MX 0 ns.hnzzcc.com. //MX記錄
www IN A 219.154.96.5 //A記錄
bbs IN A 211.137.217.251 //A記錄
stone IN A 211.137.217.251 //A記錄
slackware IN A 211.137.217.251 //A記錄
提示:大家一定要注意別忘了域名後邊那個"."
然後建立反解文件 db.211.137.217
$TTL 86400
@ IN SOA ns.hnzzcc.com. root.ns.hnzzcc.com.(
2005072605 1H 1M 1W 1D )
@ IN NS ns.hnzzcc.com.
251 IN PTR ns.hnzzcc.com.
以上設定就是完全完成了 .
建議你
sh /etc/rc.d/rc.bind restart
然後做測試
dig hnzzcc.com 或者 nslookup hnzzcc.com 都會有正確的信息顯示
如果沒有顯示出解析的地址,那麼就要查看/var/log/message和/var/log/syslog文件了,日誌中有出錯的行數,對應更改,問題總會解決的.經常出錯的地方是少了";"或者"."如果一切正常那麼查看message應有如下顯示:
Jul 28 23:12:28 bbs named: loading configuration from '/etc/named.conf'
Jul 28 23:12:28 bbs named: no IPv6 interfaces found
Jul 28 23:12:28 bbs named: listening on IPv4 interface lo, 127.0.0.1#53
Jul 28 23:12:28 bbs named: listening on IPv4 interface eth0, 211.137.217.251#53
Jul 28 23:12:28 bbs named: listening on IPv4 interface eth1, 10.87.145.29#53
Jul 28 23:12:28 bbs named: listening on IPv4 interface eth2, 192.168.0.1#53
Jul 28 23:12:28 bbs named: listening on IPv4 interface eth2:1, 10.87.200.254#53
Jul 28 23:12:28 bbs named: listening on IPv4 interface ppp0, 10.87.200.1#53
Jul 28 23:12:28 bbs named: command channel listening on 127.0.0.1#953
Jul 28 23:12:28 bbs named: zone 200.87.10.in-addr.arpa/IN: loaded serial 2005072501
Jul 28 23:12:28 bbs named: zone 0.0.127.in-addr.arpa/IN: loaded serial 1997022700
Jul 28 23:12:28 bbs named: zone 217.137.211.in-addr.arpa/IN: loaded serial 2005072605
Jul 28 23:12:28 bbs named: zone hnzzcc.com/IN: loaded serial 2005072605
Jul 28 23:12:28 bbs named: zone localhost/IN: loaded serial 42
Jul 28 23:12:28 bbs named: zone hnzzcc.pn/IN: loaded serial 2005072501
Jul 28 23:12:28 bbs named: running
測試DNS服務是否啟動用netstat -a也比較直接,看53是否起就可以了
也許到這裡就可以結束了,但是我想還有一些不完善的地方.
4 安全設置
關於 DNS 的安全問題
DNS 系統在網路溝通上面提供了非常便利的途徑,一個設置完整的 DNS 系統,無論在管理或除錯方面都是非常有效的。然而,在許多網路入侵案例中,往往因為 DNS 提供的信息過多,而讓入侵者省卻了許多步驟和時間,這也增加了對入侵行為的偵察和預警的難度。
所以,假如您同時需要為內部和外部網路提供 DNS 服務、而又有條件的話,最好設置多台 DNS 伺服器,分別對內和對外提供服務。在所有這些對外服務的機器上,我們只設置最少的必須記錄就可以了,千萬不要把 HINFO 等一些關於主機和網路環境的記錄寫進去。同時,任何不必要對外提供的 IP 和主機記錄,一概刪除就是了。而其它的為信任網路提供服務的主機,則無論如何也不要讓過多的 DNS 信息流出 internet。您甚至可以通過火牆過濾來保護內部的 DNS 服務查詢。
為了獲得更好的安全效果,您可以在 /etc/named.conf 文件中設置一些限制,讓 DNS 僅對那些信任的網路或主機提供服務,或者擋掉來自不信任主機的查詢。下面,我提供一個安全設置的範例給大家參考一下:
logging { //把錯誤日誌定義到slackware 默認的/var/log/syslog文件中,同時建議查看messages文件中的錯誤信息
category default { default_syslog; default_debug; };
};
//---首先定義各安全群組---//
acl "local" { //定義本機IP域
127.0.0.0/8;
};
acl "CNC_net" { //定義了網通的DNS主機IP域,這樣普通主機只能通過網通的轉發來查詢以增加安全性
202.0.0.0/8;
};
acl "TRUSTED_net" { //受信任的IP域
219.156.81.0/24;
192.168.2.0/24;
};
acl "TRUSTED_host" { //受信任的主機地址
192.168.100.26/32;
10.0.1.130/32;
10.0.1.161/32;
};
acl "VPN_net" { //定義了一個VPN網路IP區域
10.87.200.0/24;
};
acl "BAD_Guys" { //定義黑名單區域
221.15.164.250;
}; //-註:以上 ip 僅作例子 :-)!-//
options {
directory "/var/named";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
forward first;
forwarders {
202.102.224.68;
202.102.227.68;
};
allow-transfer { none; }; //默認禁止區域轉移
allow-query { any; }; //默認允許查詢
blackhole { BAD_Guys; }; //默認黑名單
};
//
// a caching only nameserver config
//
zone "." IN {
type hint;
file "caching-example/named.ca";
};
zone "localhost" IN {
type master;
file "caching-example/localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "caching-example/named.local";
allow-update { none; };
};
zone "hnzzcc.pn" IN {
type master;
file "db.hnzzcc.pn";
allow-query { VPN_net; }; //允許VPN網路查詢
allow-transfer { VPN_net; }; //允許VPN網路區域轉移
};
zone "200.87.10.in-addr.arpa" IN {
type master;
file "db.10.87.200";
allow-query { VPN_net; };//允許VPN網路查詢
allow-transfer { VPN_net; }; //允許VPN網路區域轉移
};
zone "hnzzcc.com" IN {
type master;
file "db.hnzzcc.com";
allow-query { local; CNC_net; TRUSTED_net;VPN_net; }; //允許本機,網通DNS,受信任網路,VPN查詢
allow-transfer { TRUSTED_host; }; //允許受信任網路區域轉移
};
zone "217.137.211.in-addr.arpa" IN {
type master;
file "db.211.137.217";
allow-query { local; CNC_net; TRUSTED_net;VPN_net; }; //允許本機,網通DNS,受信任網路,VPN查詢
allow-transfer { TRUSTED_host; }; //允許受信任網路區域轉移
};
zone "ln.hnzzcc" IN { //定義轉發區域ln.hnzzcc
type forward;
forwarders { 10.87.13.87; 10.87.13.96; }; //轉發地址
};
在設置 DNS 的安全原則的時候,有些問題您必須注意:
如果 client (包括 localhost ) 如果不在 allow-query 範圍內的話,將不能查詢該區域的任何信息。
當這一個區域作為 master 且有其它 slave 指向它的時候,slave 主機必須同時被包括在 allow-query 和 allow-transfer 設居中才可以完成區域轉移。
那些不在 allow-query 設置當中的主機,雖然不能夠直接將 server 指向這台 DNS 來查詢所在區域。然而,如果對方先將 server 指向另一台 DNS 主機,且該主機是屬於 allow-query 設置之中的話,也可以對該區域進行查詢。
例如,如果在 zone "hnzzcc.com" 當中允許 CNC_net 的查詢。雖然從外面的主機不能直接查詢這個 zone ,但只要對方將 server 指向 CNC_net 其中任一台 DNS 主機,而該主機的 allow-query 可以讓其通過的話,那他們也就可以查詢 hnzzcc.com 了。
結束語
一個基本的公網DNS伺服器建立起來了,不過難免有不足,希望研究BIND的朋友多多交流.需要深入研究的朋友可以參考DNS & BIND 第四版 ,或者登陸我新開的站點http://slackware.zzmobile.com
《解決方案》
發帖還得分三次.累死我了。
《解決方案》
原帖由 wangsong_xinyu 於 2006-1-6 13:22 發表
發帖還得分三次.累死我了。
增加灌水量不好么?:em11:
《解決方案》
謝謝你.
但我出現了一個問題, 我也是用slackware的. 版本是10, 用了bind 9.3.2, 用tar安裝的...
但發現當 /etc/rc.d/rc.bind start 後, ps -ef 並沒有啟動named, 也未能開啟port 53, 在 /var/log/messages 內只顯示到 :
Jan 14 12:52:33 QMAIL2 named: starting BIND 9.3.2
Jan 14 12:52:33 QMAIL2 named: loading configuration from '/usr/etc/named.conf'
沒有任何錯誤訊息及警告. 但named並不能運行. 原包bind也是一樣才升級為 9.3.2
請指教. thx
《解決方案》
推一下... 請教slackware 未能成功啟動的原因....thx
《解決方案》
樓主是不是從這裡轉的貼:
http://slack.linuxsir.org/main/?q=node/157
《解決方案》
講的真好挖,好多年沒見到過了:em02: