DNS Bind日誌詳述

sunnydoy發表於2021-07-27

簡介

在預設情況下,BIND9 把日誌訊息寫到 /var/log/messages 檔案中,而這些日誌訊息是非常少的,主要就是啟動,關閉的日誌記錄和一些嚴重錯誤的訊息;而將除錯日誌資訊寫入 BIND 伺服器工作目錄中的 named.run 檔案。
BIND 9 的日誌是可以靈活配置的,要詳細記錄伺服器的執行狀況,要在配置檔案 named.conf 中使用 logging 語句來定製自己所需要的日誌記錄。

BIND 日誌的常用術語

在講述 logging 語句的語法之前,先要熟悉一些常用術語

術語 含義
channel(通道) 日誌輸出方式,如:syslog、文字檔案、標準錯誤輸出或 /dev/null
category(類別) 日誌的訊息類別,如:查詢訊息或動態更新訊息等
module(模組) 產生訊息的來源模組名稱
facility(裝置) syslog 裝置名
severity(嚴重性) 訊息的嚴重性等級

logging 語句的語法

logging 語句的語法為:

logging {
    channel channel_name {                // 定義通道
        file log_file [versions number | unlimited] [size sizespec]; | syslog optional_facility; | null; | stderr;      // 定義輸出方式
        severity log_severity;           // 定義訊息嚴重性
        [print-time boolean;]            // 是否在訊息中新增時間字首,僅用於 file 日誌
        [print-severity boolean;]        // 是否在訊息中新增訊息嚴重性字首
        [print-category boolean;]        // 是否在訊息中新增訊息類別名字首
   };
   category category_name {              // 定義類別
        channel_name;
        ......
   };
};

channel 語句

配置日誌時,首先要定義通道,然後將不同的日誌類別的資料指派到指定的通道上輸出。
BIND 9 的預設配置是:

logging {
    // 由於使用了預設通道,所以沒有通道定義部分
    category "default" { "default_syslog"; "default_debug"; };
};

channel 語句用於定義通道。指定應該向哪裡傳送日誌資料,需要在以下四種之間則其一:

  • file: 輸出到純文字檔案
  • log_file: 指定一個檔名
  • version: 指定允許同時存在多少個版本的該檔案,比如指定 3 個版本(version 3),就會儲存 query.log、query.log0、query.log1 和query.log2。
  • size: 指定檔案大小的上限,如果只設定了size 而沒有設定 version,當檔案達到指定的檔案大小上限時,伺服器停止寫入該檔案。如果設定了version,伺服器會進行迴圈,如把 log_file 變成 log_file.log1,log_file.log1 變成 log_file.log2 等,然後建立一個新log_file.log 進行寫入。

syslog optional_facility :輸出到 syslog,其中 optional_facility 是 syslog 的裝置名,通常為以下幾個:

  • daemon
  • local0 到 local7
  • null :輸出到空裝置
  • stderr :輸出到標準錯誤輸出,預設為螢幕

severity 語句用於指定訊息的嚴重性等級, log_severity 的取值為(按照嚴重性遞減的順序):

  • critical
  • error
  • warning
  • notice
  • info
  • debug [ level ]

dynamic 是一個特殊的值,它匹配伺服器當前的除錯級別。定義了某個嚴重性級別後,系統會記錄包括該級別以及比該級別更嚴重的級別的所有訊息。比如定義級別為 error,則會記錄 critical 和error 兩個級別的資訊。
對於系統管理員來說,一般記錄到 info 級別就可以了。

BIND 9 預製瞭如下四個預設通道;

channel "default_syslog" {
syslog daemon;     // 傳送給 syslog 的 daemon 裝置
severity info;     // 只傳送此 info 及其更高優先順序的資訊
};
channel "default_debug" { // 只有當伺服器的 debug 級別非 0 時,才產生輸出。
file "named.run"; // 寫入工作目錄下的 named.run 檔案
severity dynamic; // 按照伺服器當前的debug 級別記錄日誌
};
channel "default_stderr" {
        stderr;           // 寫到stderr
        severity info;    // 只傳送此 info 及其更高優先順序的資訊
};
channel "null" {
        null;             // 丟棄所有發到此通道的資訊
};

category 語句
category 語句是指定哪一種類別的資訊使用哪個或者哪幾個已經定義了的通道輸出。
BIND 9 中可用的類別名(category_name)有:

類別 說明
client 處理客戶端請求。
config 配置檔案分析和處理。
database 同BIND內部資料庫相關的訊息,用來儲存區資料和快取記錄。
default 匹配所有未明確指定通道的類別。
dnssec 處理 DNSSEC 簽名的響應。
general 包括所有未明確分類的 BIND 訊息。
lame-servers 發現錯誤授權,即殘缺伺服器。
network 網路操作。
notify 區更新通知訊息。
queries 查詢日誌
resolver 名字解析,包括對來自解析器的遞迴查詢資訊。
security 批准/非批准的請求。
update 動態更新事件。
xfer-in 從遠端名字伺服器到本地名字伺服器的區傳送。
xfer-out 從本地名字伺服器到遠端名字伺服器的區傳送。

例如要記錄查詢訊息,可以在 named.conf 中新增如下配置:

logging {
    channel query_log {
        file "query.log" versions 3 size 20m;
        severity info;
        print-time yes;
        print-category yes;
    };
    category queries {
        query_log;
    };
};

這樣伺服器會在工作目錄(directory 語句所指定的目錄,Ubuntu 為:/var/cache/bind)下建立 query.log 檔案,並把執行過程產生的 queries 訊息寫如到此檔案中。

相關文章