歡迎您光臨本站 註冊首頁

slackware 10.1+bind9的環境下架設DNS伺服器

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

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:

[火星人 ] slackware 10.1+bind9的環境下架設DNS伺服器已經有759次圍觀

http://coctec.com/docs/service/show-post-35911.html