BIND 9 的高級配置

BIND 9 的高級配置

轉貼

本頁目錄
BIND 9 的高級配置
ACL
定義 ACL
使用 ACL
ACL 使用舉例
使用 View 分離內外服務器配置
關於分離內外服務器配置
View 語句
BIND 9 日誌
BIND 日誌的常用術語
logging 語句的語法
在 chroot jail 環境下運行 BIND 9
停止 bind 服務器的運行
創建 chroot jail 環境
修改 BIND 的默認啓動參數
添加 BIND 系統日誌路徑
重新啓動 bind9 和 sysklogdTags: ubuntu, dapper, netappsrv, bind, acl, view, logging, chroot

« sitemap
« dapper « netappsrv

BIND 9 的高級配置
內容提要


定義和使用訪問控制列表
使用 View 配置分離的內外服務器
BIND 9 的日誌配置
在 chroot jail 環境下運行 BIND 9
ACL
訪問控制列表(ACL)就是一個被命名的地址匹配列表。使用訪問控制列表可以使配置簡單而清晰,一次定義之後可以在多處使用,不會使配置文件因爲大量的 IP 地址而變得混亂。

定義 ACL
要定義訪問控制列表,可以在 BIND 的主配置文件 /etc/bind/named.conf 中使用 acl 語句來實現。acl 語句的語法爲:

acl acl_name {
address_match_list;
};
BIND 裏默認預定義了 4 個名稱的地址匹配列表,他們可以直接使用,分別爲:

any : 所有主機
localhost : 本機
localnets : 本地網絡上的所有主機
none : 不匹配任何主機

acl 是 named.conf 中的頂級語句,不能將其嵌入其他的語句。
要使用用戶自己定義的訪問控制列表,必須在使用之前定義。因爲可以在 options 語句裏使用訪問控制列表,所以定義訪問控制列表的 acl 語句應該位於 options 語句之前。
爲了便於維護管理員定義的訪問控制列表,可以將所有定義 acl 的語句存放在單獨的文件 /etc/bind/named.conf.acls 中,然後在主配置文件 /etc/bind/named.conf 中如下語句

include "/etc/bind/named.conf.options";
之前添加如下的配置行

include "/etc/bind/named.conf.acls";


使用 ACL
定義了 ACL 之後,可以在如下的子句中使用

子句 語句 說明
allow-query options,zone 指定哪主機或網絡可以查詢本服務器或區,默認的是允許所有主機進行查詢。
allow-transfer options,zone 指定哪些主機允許和本地服務器進行域傳輸,默認值是允許和所有主機進行域傳輸。
allow-recursion options 指定哪些主機可以進行遞歸查詢。如果沒有設定,缺省是允許所有主機進行遞歸查詢的。注意禁止一臺主機的遞歸查詢,並不能阻止這臺主機查詢已經存在於服務器緩存中的數據。
allow-update zone 指定哪些主機允許爲主域名服務器提交動態 DNS 更新。默認爲拒絕任何主機進行更新。
blackhole options 指定不接收來自哪些主機的查詢請求和地址解析。默認值是 none 。

上面列出的一些配置子句既可以出現在全局配置 options 語句裏,又可以出現在 zone 聲明語句裏,當在兩處同時出現時,zone 聲明語句中的配置將會覆蓋全局配置 options 語句中的配置。
ACL 使用舉例
限制查詢
假如要限制只有 202.0.0.0/8 和 221.0.0.0/8 查詢本地服務器的所有區信息,可以在 options 語句裏使用如下的 allow-query 子句

options {
......
allow-query { 202.0.0.0/8; 221.0.0.0/8; };
......
};
上面的配置沒有使用 ACL,若使用 acl,需要以下的配置步驟:

S1 在 /etc/bind/named.conf.acls 中添加如下的 acl 語句,對允許查詢的主機列表命名

acl aqlist {
202.0.0.0/8;
221.0.0.0/8;
};
S2 在 /etc/bind/named.conf.options 中使用定義的 acl_name 限制允許查詢的主機列表

options {
......
allow-query { aqlist; };
......
};
限制區傳輸
假如要限制只有 221.3.131.5 和 221.3.131.6 可以從本地服務器傳輸 "example.com" 的區信息,可以在 zone 語句裏使用如下的 allow-transfer 子句

zone "example.com" {
type master;
file "example.com.hosts";
allow-transfer { 221.3.131.5; 221.3.131.6; };
};
上面的配置沒有使用 ACL,若使用 acl,需要以下的配置步驟:

S1 在 /etc/bind/named.conf.acls 中添加如下的 acl 語句,對允許查詢的主機列表命名

acl atlist {
221.3.131.5;
221.3.131.6;
};
S2 在 /etc/bind/named.conf.local 中使用定義的 acl_name 限制允許進行域傳輸的主機列表

zone "example.com" {
type master;
file "example.com.hosts";
allow-transfer { atlist; };
};
防止欺騙和拒絕服務攻擊
爲了防止欺騙和拒絕服務攻擊,對於 Internet 上的每個 DNS 服務器至少應該有一個假地址的 ACL 和一個本地地址的 ACL。爲此,需要執行如下的步驟

S1 在 /etc/bind/named.conf.acls 中添加如下的 acl 語句

// 創建一個名稱爲 "bogusnets" 的 ACL 來阻止經常用於欺騙性攻擊的(RFC1918)地址空間

acl bogusnets {
0.0.0.0/8;
1.0.0.0/8;
2.0.0.0/8;
169.254.0.0/16;
192.0.2.0/24;
224.0.0.0/3;
10.0.0.0/8;
172.16.0.0/12;
192.168.0.0/16;
};

//創建一個名稱爲 "our-nets" 的 ACL,並將其配置爲實際本網的 IP 地址段。

acl our-nets { //用您的網絡地址替換下面的地址列表
x.x.x.x/24;
x.x.x.x/21;
};
S2 在 /etc/bind/named.conf.options 中使用定義的 acl_name 限制查詢和響應

options {
......
allow-query { our-nets; };
allow-recursion { our-nets; };
blackhole { bogusnets; };
......
};
使用 View 分離內外服務器配置
關於分離內外服務器配置
許多站點希望 DNS 對於內網訪問和外網(Internet)訪問看起來不一樣,這種類型的配置稱爲"分離 DNS (Split DNS)"。

這種配置可以用於如下的情況:

對內網用戶公開整個區的所有主機;對 Internet 用戶只公開幾臺主機,如 www 服務器等
對內外用戶指定不同的 RR,或對內網用戶提供更多的 RR
可以在內網使用 RFC 1918 中定義的私有地址
View 語句
在 BIND 9 中可以使用 view 語句進行配置分離 DNS 。 view 語句的語法爲

view view_name {
match-clients { address_match_list };
[ view_option; ...]
zone_statement; ...
};
其中:

match-clients 子句非常重要,它用於指定誰能看到本 view。
可以在 view 語句中使用一些選項,詳細信息請參考 named.conf 的手冊頁
zone_statement 子句指定在當前 view 中可見的區聲明

如果在配置文件中使用了 view 語句,則所有的 zone 語句都必須在 view 中出現。
對同一個 zone 而言,配置內網的 view 應該置於外網的 view 之前。

下面是一個使用 view 語句的例子,它摘自 BIND9 的文檔。

view "internal" {
match-clients { our-nets; }; // 匹配內網客戶的訪問
recursion yes; // 對內網客戶允許執行遞歸查詢
zone "example.com" { // 定義內網客戶可見的區聲明
type master;
file "example.com.hosts.internal";
};
};

view "external" {
match-clients { any; }; // 匹配 Internet 客戶的訪問
recursion no; // 對 Internet 客戶不允許執行遞歸查詢
zone "example.com" { // 定義 Internet 客戶可見的區聲明
type master;
file "example.com.hosts.external";
};
};
接下來,需要在 example.com.hosts.internal 中創建內網客戶可見的區文件,並在 example.com.hosts.external 中創建 Internet 客戶可見的區文件。可以根據您的實際情況編寫這兩個文件,此處從略。

BIND 9 日誌
在默認情況下,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;
......
};
};
配置日誌時,首先要定義通道,然後將不同的日誌類別的數據指派到指定的通道上輸出。

BIND 9 的默認配置是:

logging {
// 由於使用了默認通道,所以沒有通道定義部分
category "default" { "default_syslog"; "default_debug"; };
};
channel 語句
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 消息寫如到此文件中。

一般地,當 BIND 做了重大修改後,應該配置並監視日誌,可能還要提高日誌消息級別,一旦穩定後便可以還原配置。因爲日誌會佔用大量的磁盤空間,尤其是查詢日誌。
在 chroot jail 環境下運行 BIND 9
基於安全的考慮,應該在 chroot jail 環境下運行 BIND 9 。下面講述將 BIND 9 運行在 /chroot/named jail 環境中的配置步驟。

停止 bind 服務器的運行
sudo /etc/init.d/bind9 stop創建 chroot jail 環境
創建 chroot 目錄
sudo mkdir -p /chroot/named
sudo chmod -R 700 /chroot
sudo mkdir /chroot/named/etc
sudo mkdir /chroot/named/dev
sudo mkdir -p /chroot/named/var/cache/bind
sudo mkdir -p /chroot/named/var/run/bind/run
移動原始的 /etc/bind 目錄到 /chroot/named/etc
sudo mv /etc/bind /chroot/named/etc
sudo ln -s /chroot/named/etc/bind /etc/bind // 爲原位置創建符號鏈接,以便將來更新
創建設備並修改權限
sudo mknod /chroot/named/dev/null c 1 3
sudo mknod /chroot/named/dev/random c 1 8
sudo chmod 666 /chroot/named/dev/null
sudo chmod 666 /chroot/named/dev/random
sudo chown -R bind:bind /chroot/named/var/*
sudo chown -R bind:bind /chroot/named/etc/bind
修改 BIND 的默認啓動參數
使用如下命令修改 /etc/default/bind9

sudo vi /etc/default/bind9將如下的行

OPTIONS="-u bind"改爲

OPTIONS="-u bind -t /chroot/named"添加 BIND 系統日誌路徑
使用如下命令修改 /etc/init.d/sysklogd

sudo vi /etc/init.d/sysklogd將如下的行

SYSLOGD="-u syslog"改爲

SYSLOGD="-u syslog -a /chroot/named/dev/log"重新啓動 bind9 和 sysklogd
sudo /etc/init.d/sysklogd restart
sudo /etc/init.d/bind9 start進一步閱讀

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章