BIND (Berkeley Internet Name Domain)是Domain Name System (DNS) 協議的一個實現,提供了DNS主要功能的開放實現,包括 python
1.域名服務器 (named) mysql
2.DNS解析庫函數 git
3.DNS服務器運行調試所用的工具 sql
是一款開放源碼的DNS服務器軟件,由美國加州大學Berkeley分校開發和維護的, 按照ISC的調查報告,BIND是世界上使用最多最普遍的域名服務系統。不論你的郵件服務器,WEB服務器或者其餘的services如何的安全可靠,DNS的故障會給你帶來用戶根本沒法訪問這些服務。 BIND,也是咱們常說的named,因爲多數網絡應用程序使用其功能,因此在不少BIND的弱點及時被發現。主要分爲三個版本: 數據庫
1.v4 1998年多數UNIX捆綁的是BIND4,已經被多數廠商拋棄了,除了OpenBSD還在使用。OpenBSD核心人爲BIND8過於複雜和不安全,因此繼續使用BIND4。這樣一來BIND8/9的不少優勢都不包括在v4中。 api
2.v8就是現在使用最多最廣的版本,其詳細內容能夠參閱 BIND 8+ 域名服務器安全加強 緩存
3.v9最新版本的BIND,所有從新寫過,免費(可是由商業公司資助),也添加了許多新的功能(可是安全上也可能有更多的問題)。BIND9在2000年十月份推出,如今穩定版本是9.3.2。 安全
ISC的bind一直以來基本上都是DNS的工業標準,不過BIND一直是漏洞不斷,直到出了BIND9,isc的開發人員對bind9進行了重寫,才相對好了一點.服務器
BIND9的安裝就不用多說了,這裏使用最新版本9,.2.3,說白了也就是須要named這個可執行文件就能夠了,其餘的配置文件徹底能夠本身來寫.若是須要進行服務的控制的話,則須要rndc這個文件了.named大約有4M多,strip一下也就1M多點,再裁減裁減徹底能夠作到400K的,作嵌入式的朋友也不妨考慮考慮這個了.
服務的啓動與中止能夠徹底本身來寫一個腳原本控制,啓動的話先判斷是否已經啓動,pidof named,若是已經啓動,則提示已經啓動,不然執行named –c /etc/named.conf,中止的時候先判斷是否已經啓動,是的話則killproc named,否的話提示沒有啓動,具體可在網上查找.網絡
重配置文件說明:
named.conf 設置通常的named參數,指向該服務器使用的域數據庫的信息源
named.conf.options 全局選項
db.root 根服務器指向文件, 由Internet NIC建立和維護, 無需修改, 可是須要按期更新
db.local localhost正向區文件,用於將名字localhost轉換爲本地回送IP地址 (127.0.0.1)
db.127 localhost反向區文件,用於將本地回送IP地址(127.0.0.1)轉換爲名字localhost
其中,主配置文件/etc/named.conf是bind9的最早讀取的一個文件,他的配置語句
acl 定義IP地址的訪問控制清單
control 定義ndc使用的控制通道
include 把其餘文件包含到配置文件中
key 定義受權的安全密鑰
logging 定義日誌寫什麼,寫到哪
opitons 定義全局配置選項和缺省值
server 定義遠程服務器的特徵
trunsted-keys 爲服務器定義DNSSEC加密密鑰
zone 定義一個區點
另外還支持:
Lwres
View
其中主要的是acl,controls,include,logging,key,options,view,zone其餘的不多用到咱們就來詳細的對這些進行解釋一下.
Acl用來對bind的訪問進行限制,是一個全局的設置,前面配置的acl在整個bind中都適用,和路由器裏面的access-list有同工之處,語法是
acl acl-name {
address_match_list
};
其中的address match list是一個地址列表,如」192.168.0.0/24;」,記住最後必定得有分號,有多個的話中間用分號格開,如192.168.0.0/32;192.168.1.0/24;
bind內置了4個acl分別是:
any(不是all) 對應全部的,也就是0.0.0.0/0.
none 對應爲空.
localhost 對應本地機器.
localnets 對應本地網絡.
Controls主要用於對bind進行控制,如:
key "rndc-key" {
algorithm hmac-md5;
secret "VkMaNHXfOiPQqcMVYJRyjQ==";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
設置rndc控制的端口以及端口,keys用來設置控制的密鑰,
include是一個很是有用的選項,若是須要寫程序來讀寫bind的配置文件,這個將會用到,由於bind的配置文件很不規則,可是用了include後,就能夠變的很規則,就和數據庫同樣了,功用和c語言裏面的include同樣.
Options是用於設置bind的一些選項,咱們將重點介紹,BING9支持的選項以下:
options {
blackhole { <address_match_element>;; ... };
coresize <size>;;
datasize <size>;;
deallocate-on-exit <boolean>;; // obsolete
directory <quoted_string>;;
dump-file <quoted_string>;;
fake-iquery <boolean>;; // obsolete
files <size>;;
has-old-clients <boolean>;; // obsolete
heartbeat-interval <integer>;;
host-statistics <boolean>;; // not implemented
interface-interval <integer>;;
listen-on [ port <integer>; ] { <address_match_element>;; ... };
listen-on-v6 [ port <integer>; ] { <address_match_element>;; ... };
match-mapped-addresses <boolean>;;
memstatistics-file <quoted_string>;; // not implemented
multiple-cnames <boolean>;; // obsolete
named-xfer <quoted_string>;; // obsolete
pid-file <quoted_string>;;
port <integer>;;
random-device <quoted_string>;;
recursive-clients <integer>;;
rrset-order { [ class <string>; ] [ type <string>; ] [ name
<quoted_string>; ] <string>; <string>;; ... }; // not implemented
serial-queries <integer>;; // obsolete
serial-query-rate <integer>;;
stacksize <size>;;
statistics-file <quoted_string>;;
statistics-interval <integer>;; // not yet implemented
tcp-clients <integer>;;
tkey-dhkey <quoted_string>; <integer>;;
tkey-gssapi-credential <quoted_string>;;
tkey-domain <quoted_string>;;
transfers-per-ns <integer>;;
transfers-in <integer>;;
transfers-out <integer>;;
treat-cr-as-space <boolean>;; // obsolete
use-id-pool <boolean>;; // obsolete
use-ixfr <boolean>;;
version <quoted_string>;;
allow-recursion { <address_match_element>;; ... };
allow-v6-synthesis { <address_match_element>;; ... };
sortlist { <address_match_element>;; ... };
topology { <address_match_element>;; ... }; // not implemented
auth-nxdomain <boolean>;; // default changed
minimal-responses <boolean>;;
recursion <boolean>;;
provide-ixfr <boolean>;;
request-ixfr <boolean>;;
fetch-glue <boolean>;; // obsolete
rfc2308-type1 <boolean>;; // not yet implemented
additional-from-auth <boolean>;;
additional-from-cache <boolean>;;
query-source <querysource4>;;
query-source-v6 <querysource6>;;
cleaning-interval <integer>;;
min-roots <integer>;; // not implemented
lame-ttl <integer>;;
max-ncache-ttl <integer>;;
max-cache-ttl <integer>;;
transfer-format ( many-answers | one-answer );
max-cache-size <size_no_default>;;
check-names <string>; <string>;; // not implemented
cache-file <quoted_string>;;
allow-query { <address_match_element>;; ... };
allow-transfer { <address_match_element>;; ... };
allow-update-forwarding { <address_match_element>;; ... };
allow-notify { <address_match_element>;; ... };
notify <notifytype>;;
notify-source ( <ipv4_address>; | * ) [ port ( <integer>; | * ) ];
notify-source-v6 ( <ipv6_address>; | * ) [ port ( <integer>; | * ) ];
also-notify [ port <integer>; ] { ( <ipv4_address>; | <ipv6_address>;
) [ port <integer>; ]; ... };
dialup <dialuptype>;;
forward ( first | only );
forwarders [ port <integer>; ] { ( <ipv4_address>; | <ipv6_address>; )
[ port <integer>; ]; ... };
maintain-ixfr-base <boolean>;; // obsolete
max-ixfr-log-size <size>;; // obsolete
transfer-source ( <ipv4_address>; | * ) [ port ( <integer>; | * ) ];
transfer-source-v6 ( <ipv6_address>; | * ) [ port ( <integer>; | * ) ];
max-transfer-time-in <integer>;;
max-transfer-time-out <integer>;;
max-transfer-idle-in <integer>;;
max-transfer-idle-out <integer>;;
max-retry-time <integer>;;
min-retry-time <integer>;;
max-refresh-time <integer>;;
min-refresh-time <integer>;;
sig-validity-interval <integer>;;
zone-statistics <boolean>;;
};
obsolete是已通過時的選項,這裏不用考慮, not yet implemented是還沒有完成的選項,這裏也不用考慮,下面詳細介紹這裏面的有用選項:(注意,前面打」*」的爲選項)
*directory 設置bind的數據文件的存放位置:如 directory 「/var/named」.
*dump-file 設置當執行rndc dumpdb命令後的導出文件存放絕對路徑,若是沒有指定的話,缺省文件爲named_dump.db,放在directory指定的目錄下面.
*pid-file 設置bind的進程號pid文件.
*forward 值有first和only兩項,
first則首先轉發到"forwarders"中的服務器,而後本身查詢,
only則僅轉發到 "轉發服務器列表"中的服務器,再也不本身查詢
*forwarders設置轉發服務器地址列表,語法同acl中的語法.
*listen-on 設置bind的綁定ip和端口,如listen-on 53 {192.168.0.1;};
*max-cache-size 設置最大緩存的大小,如max-cache-size 5M
*version 設置客戶查詢DNS版本好的返回信息,若是不想讓客戶探測到當前的版本好,就用這個好了,如version mydns1.0;
*auth-nxdomain 是否作爲權威服務器回答域不存在(Auth-nxdomain)
若是設置爲'yes',則容許服務器以權威性(authoritatively)的方式返回NXDOMAIN(該域不存在)的回答,不然就不會做權威性的回答,缺省值爲」是」.
*notify 在主服務器更新時是否通知輔助服務器(notify)
若是設置爲」yes」,則在主服務器區域數據發生變化時,就會向在域的」域名服務器「中列出的服務器和「亦通知」中列出的服務器發送更新通知。這些服務器接受到更新通知後,就會向主服務器發送請求傳輸的消息,而後區域文件得以更新。
*recursion 是否容許遞規查詢(recursion)
若是設置爲」yes」,則容許服務器採用遞歸的方式進行查詢,也就是當要查詢的地址不在服務器的數據庫列表中時,服務器將一級一級的查詢,直到查到爲止。(通常對局域網都打開)
設置爲」no」,並不意味着服務器對於請求的遞歸查詢不給予回答,而是對於請求的遞歸查詢,再也不向上級服務器請求,也不緩存,若是不對請求的遞歸查詢回答,能夠清空緩存,而後設置爲「NO」.
*allow-query 容許普通查詢的地址列表(allow-query):
設置容許進行普通查詢的ip地址列表,在域中的設置將覆蓋全局設置,默認狀況下是容許全部的地址進行普通查詢.
*allow-recursion容許遞歸查詢的地址列表(allow-recursion):
設置容許進行遞歸查詢的ip地址列表,缺省值是容許全部地址進行查詢,須要注意的是當設置了不容許遞歸查詢後,若是仍然可以查詢部分外部的域名,那是由於dns的緩存在起做用,將緩存清除之後就能夠了.
*allow-transfer容許服務器進行區域傳輸的地址列表(Allow-transfer):
(注意的是視區和域中的設置將覆蓋全局設置).
*allow-notify 容許更新通知的地址列表(allow-notify)
當服務器做爲輔助服務器的時候,設置這個能夠對收到的更新通知進行判斷,只是接收該列表的更新通知.默認狀況下,只是接收來自主服務器的更新通知。對於其餘服務器的更新通知,會忽略掉.
*also-notify 更新時亦通知下列地址(also-notify):
設置發送更新通知的時候,不只是域名服務器中列出的地址,亦通知此地址列表中的地址。
*interface-interval 設置bind檢查網卡變化的週期.
*blockhole 定義服務器不對查詢進行反應的地址列表,也就是」黑名單」,好比說3721的ip段:218.244.44.0/24,當設置了黑名單後,對於這個段的請求查詢,服務器將不會做出反應.