天天看點

bind9.8 視圖和日志功能

參考:《OReilly DNS and BIND 5th(2006)》

1.視圖(view)

    大家都知道,現在中國大陸上有三大營運商:聯通、電信、移動。他們彼此之間的網絡都是獨立的,而它們彼此之間相連的帶寬非常之小,這就導緻了我們跨營運商網絡通路的服務因為帶寬原因變得緩慢。假設我們的使用者大都是電信和移動的使用者,那麼如果我們把伺服器單獨放在電信或者移動機房都會導緻一部分人通路緩慢。解決方法就是使用雙線機房,伺服器開雙網卡,一個接入電信的網絡,一個接入移動的網絡,然後,讓電信的使用者通路電信的網,移動的通路移動的。

    這個主意确實不錯,可以完美解決我們的問題。但是,具體怎麼實作呢?假設我們一個使用者過來通路,我們怎麼知道它是哪個網絡的使用者呢? 這就意味的,我們需要一個ip庫,這個ip庫記錄着ip歸屬哪個網絡,而根據這些資訊把不同ip指揮到不同地方的功能在bind軟體的實作中就是view。 顯而易見,ip庫越龐大和準确,我們的指揮效果越好,當然,龐大的資料意味着效率的降低,是以,資料庫的優化,一直都是個值得探讨的問題。

    view的選項很多,隻提取必備的話,就可以很簡短

<code>       </code><code>view string optional_class {</code>

<code>                </code><code>match-clients { address_match_element; ... };</code>

<code>                </code><code>zone string optional_class {</code>

<code>                        </code><code>type</code> <code>( master | slave | stub | hint |</code>

<code>                     </code><code>forward | delegation-only );</code>

<code>                        </code><code>file</code> <code>quoted_string;</code>

<code>                </code><code>};</code>

<code>            </code><code>};</code>

    view的原理是,進來的連結位址比對某個ip庫,給比對到的ip使用特定的區域檔案,給其他比對到的ip使用其他的區域檔案,這樣,我們就可以在不同的區域檔案中給出不一樣的解析。

    是以它必備的參數有:

        match-clients :比對用戶端位址

        zone:區域檔案

    當然,match-clients 可以比對很多形式的ip,比如内置變量any、localhost等,還有單個ip如1.1.1.1,網段127.0.0.1/8等等。 如果我們比對的ip很多,這個時候使用match-clients 一條條寫就很費力了。 bind官方最終提出的解決方案是把這些ip放進mysql之類的資料庫裡。 

    這裡,因為我隻是做下實驗,網絡規模不大,是以直接使用match-clients了。當然,如果view比較多的話,每次都寫一大串也是很煩人的,是以這裡我使用了acl。

    acl的文法非常簡單:

        acl string { address_match_element; ... };

            string:給acl取個别名

            address_match_element:ip位址參數,比如1.1.1.1、any、127.0.0.0/8等。

    我最終的named.conf非常簡單,如下:

<code>acl </code><code>local</code> <code>{ 172.16.0.0</code><code>/16</code> <code>;};</code>

<code>options {</code>

<code>    </code><code>directory  </code><code>"/var/named"</code><code>;</code>

<code>};</code>

<code>view insides IN {</code>

<code>    </code><code>match-clients { </code><code>local</code><code>;};</code>

<code>    </code><code>zone linzb.com IN {</code>

<code>        </code><code>type</code>  <code>master;</code>

<code>        </code><code>file</code>  <code>"linzb.com.zone"</code><code>;</code>

<code>    </code><code>};</code>

<code>view besides IN {</code>

<code>    </code><code>match-clients { any;};</code>

<code>        </code><code>file</code>  <code>"linzb.com.zone.1"</code><code>;</code>

linzb.com.zone 内容如下:

<code>$TTL 600</code>

<code>@  IN     SOA ns1.linzb.com.     admin.linzb.com. (</code>

<code>                        </code><code>2 </code>

<code>                        </code><code>1H</code>

<code>                       </code><code>2W</code>

<code>                       </code><code>3D</code>

<code>                       </code><code>600 )</code>

<code>    </code><code>IN  NS  ns1</code>

<code>ns1 IN  A   172.16.1.2</code>

<code>www IN  A   172.16.1.4</code>

<code>test</code>    <code>IN  CNAME   www</code>

linzb.com.zone.1 内容如下:

<code>ns1 IN  A   192.168.2.127</code>

<code>www IN  A   192.168.2.38</code>

    之是以這麼設,是因為bind這台有兩個ip,192.168.2.127和172.16.1.2,請根據自己的實際情況來

    測試的話也很簡單:dig -t A www.linzb.com @192.168.2.127和dig -t A www.linzb.com @172.16.1.2 就能看到dns傳回不同結果了。

2.日志

    日志的作用自然不必多說,bind的提供非常彈性的日志。它有兩個關鍵參數:

        channel:即信道,指定了日志資料發送到哪,它們可以是:檔案、syslog、标準錯誤輸出、位元組桶等

        category:即類别,表明什麼樣的資料會被記錄到日志,例如queries(查詢日志)、xfer-in(區域檔案傳入日志)等

它的文法如下:

<code>logging {</code>

<code>                </code><code>channel string {</code>

<code>                     </code><code>file</code> <code>log_file;       </code><code>//</code><code>日志寫入到log_file</code>

<code>                     </code><code>syslog optional_facility;    </code><code>//</code><code>寫入到syslog</code>

<code>                     </code><code>null;             </code><code>//</code><code>不寫入</code>

<code>                     </code><code>stderr;           </code><code>//</code><code>标準錯誤輸出</code>

<code>                     </code><code>severity log_severity;       </code><code>//</code><code>日志級别</code>

<code>                     </code><code>print-</code><code>time</code> <code>yes_or_no;        </code><code>//</code><code>日志是否列印時間戳,</code><code>yes</code><code>為是</code>

<code>                     </code><code>print-severity yes_or_no;    </code><code>//</code><code>列印級别</code>

<code>                     </code><code>print-category  yes_or_no;  </code><code>//</code><code>是否列印類别</code>

<code>                </code><code>category string { string; ... };   </code><code>//</code><code>第一個string表示category的類别,有queries等,第二個string表示使用哪個channel,可以同時使用多個channel</code>

<code>           </code><code>};</code>

       channel的日志級别有以下幾種:critical、error、warning、notice、info、debug、dynamic

        其中debug和dynamic是bind特有的等級,debug自身也有級别,預設為1,serverity的預設級别為info (詳見:《OReilly DNS and BIND 5th(2006)》 第133-137頁)

    category的類别也有很多,它們的相關解釋在 《OReilly DNS and BIND 5th(2006)》137-138頁

這裡我做了簡單的配置,最終named.conf如下:

<code>acl </code><code>local</code> <code>{ 127.0.0.1</code><code>/8</code> <code>;};</code>

<code>                </code><code>channel default_log {</code>

<code>                     </code><code>file</code> <code>"/var/log/bind.log"</code><code>;</code>

<code>                     </code><code>severity info;</code>

<code>                     </code><code>print-</code><code>time</code> <code>yes</code><code>;</code>

<code>                     </code><code>print-severity </code><code>yes</code><code>;</code>

<code>                     </code><code>print-category </code><code>yes</code><code>;</code>

<code>                </code><code>category queries { default_log; };</code>

    dig -t A www.linzb.com @192.168.2.127 測試,檢視日志如下:

    28-Feb-2017 16:35:58.188 queries: info: client 192.168.2.127#57851: view besides: query: www.linzb.com IN A + (192.168.2.127)

debug:

    1.出現“/etc/named.conf:16: expected quoted string near '/'” 

        這個表示在第16行,參數後面的值需要加 “” 号。

    2.配置了日志但是沒有日志生成。

        可以tail -f  /var/log/messages 檢視相關日志資訊,一般是沒權限,比如我的是/var/log/bind.log,named使用者在這個地方沒寫權限,是以我

            touch /var/log/bind.log 

            chown -R named:named  /var/log/bind.log  解決

本文轉自biao007h51CTO部落格,原文連結:http://blog.51cto.com/linzb/1902093 ,如需轉載請自行聯系原作者

繼續閱讀