DNS BIND之ACL、View、ZONE介紹
BIND主配置檔案由named程序執行時首先讀取,檔名為named.conf,預設在/etc目錄下。該檔案只包括Bind的基本配置,並不包含任何DNS的區域資料。named.conf配置檔案由語句與註釋組成,每一條主配置語句均有自己的選項引數。這些選項引數以子語句的形式組成,幷包含在花括號內,作為主語句的組成部分。每一條語句,包括主語句和子語句,都必須以分號結尾。註釋符號可以使用類似於C語言中的塊註釋"/*"和"*/"符號對,以及行註釋符"//"或"#"。BIND 9支援的主配置語句及功能如下表:
配置名 稱 | 功 能 |
acl | 定義一個訪問控制列表,用於以後對列表中的IP進行訪問控制 |
controls |
定義有關本地域名伺服器操作的控制通道,這些通道被rndc用來發送控制命令 |
include | 把另一個檔案中的內容包含進來做為主配置檔案的內容 |
key | 定義一個密匙資訊,用於通過TSIG進行授權和認證的配置中 |
logging | 設定日誌伺服器,以及日誌資訊的傳送位置 |
options | 設定DNS伺服器的全域性配置選項 |
server | 定義了與遠端伺服器互動的規則 |
trusted-keys | 定義信任的 DNSSED密匙 |
view | 定義一個檢視 |
zone | 定義一個區域 |
1.options語句
options語句設定可以被整個BIND使用的全域性選項。這個語句在每個配置檔案中只有一處,如果出現多個options語句,則第一個options的配置有效,並且會產生一個警告資訊。如果沒有options語句,每個子語句使用預設值。
2.controls語句
controls主語句定義有關本地域名伺服器操作的控制通道,這些通道被rndc用來發送控制命令。在上節的例子named.conf配置檔案中有以下語句,現解釋如下:
3.include語句controls { inet 127.0.0.1 port 953 //在127.0.0.1介面的953號埠進行監聽 allow { 127.0.0.1; } //只接受127.0.0.1的連線,即只有在本機使用rndc,才能對named進行控制 keys { "rndckey"; }; //使用名為rndckey的金鑰才能訪問 };
include主語句表示把另一個檔案的內容包含進來,作為named.conf檔案的配置內容,其效果與把那個檔案的內容直接輸入named.conf時一樣。之所以這樣做,一是為了簡化一些分散式的named.conf檔案的管理,此時,每個管理員只負責自己所管轄的配置內容。二是為了安全,因為可以把一些金鑰放在其他檔案,不讓無關的人檢視。
4.key語句
key主語句定義一個密匙,用於TSIG授權和認證。它主要在與其他DNS伺服器或rndc工具通訊時使用,可以通過執行rndc-confgen命令產生。
key "rndckey" { //定義一個金鑰,名為rndckey
algorithm hmac-md5; //採用hmac-md5演算法,這也是目前唯一支援的加密演算法
secret "TKuaJSEo58zohJBfrdF7dQ=="; //金鑰的具體資料
};
5.server語句server主語句定義了與遠端伺服器互動的規則,例如,決定本地DNS伺服器是作為主域名伺服器還是輔域名伺服器,以及與其他DNS伺服器通訊時採用的金鑰等。語句可以出現在配置檔案的頂層,也可以出現在檢視語句的內部。如果一個檢視語句包括了自己的server語句,則只有那些檢視語句內的server語句才起作用,頂層的server語句將被忽略。如果一個檢視語句內不包括server語句,則頂層server語句將被當做預設值。
6.trusted-keys語句
trusted-keys語句定義DNSSEC安全根的trusted-keys。DNSSEC指由RFC2535定義的DNS sercurity。當一個非授權域的公鑰是已知的,但不能安全地從DNS伺服器獲取時,需要加入一個trusted-keys。這種情況一般出現在singed域是一個非signed域的子域的時候,此時加了trusted key後被認為是安全的。trusted-keys語句能包含多重輸入口,由鍵的域名、標誌、協議演算法和64位鍵資料組成。
下面就ACL、VIEW、ZONE做一下介紹:
1.view語句
view語句定義了檢視功能。檢視是BIND 9提供的強大的新功能,允許DNS伺服器根據客戶端的不同有區別地回答DNS查詢,每個檢視定義了一個被特定客戶端子集見到的DNS名稱空間。這個功能在一臺主機上執行多個形式上獨立的DNS伺服器時特別有用。
檢視(view)語句的定義:
view view_name [class] {
match-clients { address_match_list } ;
match-destinations { address_match_list } ;
match-recursive-only { yes_or_no } ;
[ view_option; ...]
zone-statistics yes_or_no ; ]
[ zone_statement; ...]
};
檢視是BIND9強大的新功能,允許名稱伺服器根據詢問者的不同有區別的回答DNS查詢。特別是當執行拆分DNS設定而不需要執行多個伺服器時特別有用。每個檢視定義了一個將會在使用者的子集中見到的DNS名稱空間。
配置例項:
view "internal" {
match-clients { 10.0.0.0/8; };
// 應該與內部網路匹配.
// 只對內部使用者提供遞迴服務.
// 提供example.com zone 的完全檢視
//包括內部主機地址.
recursion yes;
zone "example.com" {
type master;
file "example-internal.db";
};
};
view "external" {
match-clients { any; };
// 拒絕對外部使用者提供遞迴服務
// 提供一個example.com zone 的受限檢視
// 只包括公共可接入主機
recursion no;
zone "example.com" {
type master;
file "example-external.db";
};
};
2.acl語句
acl主配置語句用於定義一個命名的訪問列表,裡面包含了一些用IP表示的主機,這個訪問列表可以在其他語句使用,表示其所定義的主機。其格式如下:
acl acl-name {
address_match_list
};
address_match_list表示IP地址或IP地址集。其中,none、any、localhost和localnets這4個內定的關鍵字有特別含義,分別表示沒有主機、任何主機、本地網路介面IP和本地子網IP。一個具體的例子如下所示。
acl "someips" { //定義一個名為someips的ACL
10.0.0.1; 192.168.23.1; 192.168.23.15; //包含3個單個IP
};
acl "complex" { //定義一個名為complex的ACL
"someips"; //可以包含其他ACL
10.0.15.0/24; //包含10.0.15.0子網中的所有IP
!10.0.16.1/24; //非10.0.16.1子網的IP
{10.0.17.1;10.0.18.2;}; //包含了一個IP組
localhost; //本地網路介面IP(含實際介面IP和127.0.0.1)
};
zone "example.com" {
type slave;
file "slave.example.com";
allow-notify {"complex";}; //在此處使用了前面定義的complex訪問列表
};
3.zone語句
zone語句的定義:
zone zone_name [class] [{
type ( master | slave | hint | stub | forward ) ;
[ allow-notify { address_match_list } ; ]
[ allow-query { address_match_list } ; ]
[ allow-transfer { address_match_list } ; ]
[ allow-update { address_match_list } ; ]
[ update-policy { update_policy_rule [...] } ; ]
[ allow-update-forwarding { address_match_list } ; ]
[ alsonotify
{ ip_addr [port ip_port] ; [ ip_addr [port ip_port] ; ... ] }; ]
[ check-names (warn|fail|ignore) ; ]
[ dialup dialup_option ; ]
[ file string ; ]
[ forward (only|first) ; ]
[ forwarders
{ ip_addr [port ip_port] ; [ ip_addr [port ip_port] ; ... ] }; ]
[ ixfr-base string ; ]
[ ixfr-tmp-file string ; ]
[ maintain-ixfr-base yes_or_no ; ]
[ masters [port ip_port] { ip_addr [port ip_port] [key key]; [...] } ; ]
[ max-ixfr-log-size number ; ]
[ max-transfer-idle-in number ; ]
[ max-transfer-idle-out number ; ]
[ max-transfer-time-in number ; ]
[ max-transfer-time-out number ; ]
[ notify yes_or_no | explicit ; ]
[ pubkey number number number string ; ]
[ transfer-source (ip4_addr | *) [port ip_port] ; ]
[ transfer-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ notify-source (ip4_addr | *) [port ip_port] ; ]
[ notify-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ zone-statistics yes_or_no ; ]
[ sig-validity-interval number ; ]
[ database string ; ]
[ min-refresh-time number ; ]
[ max-refresh-time number ; ]
[ min-retry-time number ; ]
[ max-retry-time number ; ]
}];
zone語句定義了DNS伺服器所管理的區,也就是哪一些域的域名是授權給該DNS伺服器回答的。一共有5種類型的區,由其type子語句指定,具體名稱和功能如下所示。
Master(主域):主域用來儲存某個區域(如www.wzvtc.cn)的資料資訊。
Slave(輔域):也叫次級域,資料來自主域,起備份作用。
Stub:Stub區與輔域相似,但它只複製主域的NS記錄,而不是整個區資料。它不是標準DNS的功能,只是BIND提供的功能。
Forward(轉發):轉發域中一般配置了 forward和forwarders子句,用於把對該域的查詢請求轉由其他DNS伺服器處理。
Hint:Hint域定義了一套最新的根DNS伺服器地址,如果沒有定義,DNS伺服器會使用內建的根DNS伺服器地址。
配置例項:
zone "." IN { //定義一個名為"."的區,查詢類為IN
type hint; //型別為hint
file "named.root"; //區檔案是named.root
};
zone "1.10.10.in-addr.arpa" IN { //定義一個名為1.10.10.in-addr.arpa的區,查詢類為IN
type master; //型別為master
file "named.1.10.10"; //區檔案是named.1.10.10
allow-update { none; }; //不允許任何客戶端對資料進行更新
};
說明:在每一個zone語句中,都用file子語句定義一個區檔案,這個檔案裡存放了域名與IP地址的對應關係。
對於ACL、VIEW、ZONE的應用,DNS伺服器有一個高階的功能,能夠實現不同的使用者訪問同一個域名,把域名解析成不同的IP地址,使使用者能夠訪問離他最近的伺服器上的資料,這就是DNS伺服器的檢視功能。使用DNS伺服器的檢視功能可以增加網站的響應速度。例如,當我們網站的資料同步在兩臺web伺服器上時,一臺是電信伺服器,一臺是網通伺服器,那麼我們肯定希望全國訪問我們網站的使用者在開啟網站的時候,能夠自動實現,電信使用者訪問電信伺服器,網通使用者訪問網通伺服器。配置這種情況的前提是,web伺服器必須要有一個電信的IP地址和一個網通的IP地址。DNS伺服器的這種解析功能通常也被稱之為智慧解析。
DNS伺服器的檢視通常在配置檔案中是使用view實現的。把要使用某些IP地址作單獨訪問的zone區域,統一放在一個命名的view段落中,並且在view中定義請求的IP地址或IP地址段,把IP地址寫入match-clients選項中。如果像上面說的,區分電信和網通路線的話,那麼可以使用兩個acl訪問控制列表寫上電信或網通IP地址,定義電信網通路線,把acl名字寫入view段落match-clients選項中。如下所示:
acl telecomip{ tele_IP; ... };
acl netcomip{ net_IP; ... };
view telecom {
match-clients { telecomip; };
zone "ZONE_NAME" IN {
type master;
file "ZONE_NAME.telecom";
};
};
view netcom {
match-clients { netcomip; };
zone "ZONE_NAME" IN {
type master;
file "ZONE_NAME.netcom";
};
};
view default {
match-clients { any; };
zone "ZONE_NAME" IN {
type master;
file "ZONE_NAME.netcom";
};
};
需要注意的是:(1)、如果使用了檢視的功能,那麼配置檔案中的所有zone區域都要必須寫在視圖裡面,如,配置檔案裡預設要配置的三個區域,根、127.0.0.1、1.0.0.127.in-addr.arpa都要寫入檢視。
(2)、在acl中定義IP地址,IP地址的寫法可以是單個IP地址也可以是一個IP地址段加掩碼,如:192.168.0.0/24。
(3)、檢視是根據配置檔案從上往下匹配的,所以希望優先訪問的資源記錄檔案,區域應該儘量寫前面。
(4)、如果定義的若干個檢視的IP地址不全的話,那麼可以在最後定義一個預設檢視,match-clients選項中的IP地址寫上any,代表如果此次訪問的IP地址上面沒有一個能匹配到,則在此處歸類。
參考文章: