BIND簡易教程(1):安裝及基本配置


首先,為什么說是簡易教程呢?因為BIND的功能實在太多,全寫出來的話要連載好久,我覺得我沒有那么多精力去寫;而我了解的僅僅是有限的一點點,不敢造次。百度上的文章也是一抓一大把吶!所以,教點基本使用方法,有需求的同學可以再翻翻BIND管理員手冊。
那么,還是直接開始說正題吧。本次還是像PowerDNS一樣是一個連載,寫三篇。

 

目錄:
BIND簡易教程(1):安裝及基本配置(本篇)
BIND簡易教程(2):BIND視圖配置
BIND簡易教程(3):DNSSec配置

 

首先說說安裝。安裝是非常簡單的,在ubuntu下直接

apt-get install bind9 bind9-doc dnsutils

即可,相信centos中yum也可以裝。但是這樣安裝有個問題,就是不會安裝openssl。不安裝openssl的話,就不能開啟dnssec。所以,如果有dnssec的需求(比如說我司),就不能用apt了。需要用源碼安裝。其實源碼安裝也是相當輕松的。先到官網(https://www.isc.org/downloads/)下載最新的穩定版本BIND(我現在的最新穩定版是9.10.4-P2),之后

tar zxvf bind-9.10.4-P2.tar.gz
cd bind-9.10.4-P2
sudo ./configure --sysconfdir=/etc/bind --with-libtool
sudo make
sudo make install

configure的參數視自己具體情況而定。我習慣把所有配置文件放在/etc/bind下面,就加上--sysconfdir,如果不加的話,name.conf默認在/etc下面,很亂;--with-libtool據說加上之后能讓編譯出來的文件是.so而非.a,占用空間較小。不過我加上這個參數之后make編譯會報錯,我對這種編譯方式不是很熟,所以就放棄了。

如果源碼安裝有疑問,請移步http://www.cnblogs.com/anpengapple/p/5942659.html,這里不詳細解釋了。

安裝還是很簡單的。裝好的bind主要由三部分構成:解析庫(配置文件)、解析器(named)、管理器(rndc),解析庫是以named.conf為中心的一堆配置文件,具體配置方法我們后面講;named程序是bind的后台進程,是負責解析域名的;rndc是bind的遠程管理程序,可以動態的添加/刪除域名,查看bind狀態,重新加載等。在這里,我們主要使用的是解析庫。
bind配置文件提供了兩個非常巧妙的語法規則:注釋和include。注釋用// 和# 均可,滿足了不同程序猿的喜好;include則可以將不同類型的配置分開來,放在不同的文件中。其實include倒更像是宏的作用。上文說“以named.conf為中心”大概意思是,在named.conf中可以不直接寫配置,而是寫幾個include,不同的include是不同類型的配置。比如默認的named.conf中include了named.conf.options、named.conf.local、named.conf.default-zones這三個文件。后兩個我現在還用不到,就暫時注釋起來了。保留named.conf.options,把選項和日志記在這里。named.conf.options配置如下:

key "rndc-key" {
    algorithm hmac-md5;
    secret "RaxA6K9RyJLFbJeeV3PkYg==";
};
controls {
    inet 127.0.0.1 port 953
    allow { 127.0.0.1; } keys { "rndc-key"; };
};
options {
    directory "/var/cache/bind";
    max-cache-ttl 120;
    max-ncache-ttl 120;
    version "[no version.]";
    listen-on-v6 { none; };
    minimal-responses yes;
    recursion no;
    auth-nxdomain no;
    dnssec-enable no;
};

先寫這幾個,日志呆會再說。options里面有很多選項,我只寫了這幾個。具體都有什么,應該怎么寫,可以參考管理員手冊。

寫好options之后,在named.conf中加入include "/etc/bind/named.conf.options";就好了(其實默認的named.conf文件中已經有了)。
接下來是說明本DNS服務器能解析哪些域,也就是zone部分。因為內容比較少,我就懶得單獨建立文件了,直接寫進了named.conf中:

zone "apple.tree" IN {
    type master;
    file "/etc/bind/views/zones/db.apple.zone";
};

有時候我們希望在某個特定域解析的時候使用一種options的屬性,而其他域使用其他屬性,那么就可以把options里面的屬性放在zone里面寫。管理員手冊中有相應的寫法。注意一下,各種配置,句末都要加分號,包括花括號結束,也要加分號。

這里我只說明了本機是主DNS服務器(這個選項可以設置主從),而本域的具體解析內容是在db.apple.zone文件中。db.apple.zone的配置為:

$TTL 86400
@   IN  SOA apple.tree. apple.apple.tree. (
          2016090100     ; Serial
               28800     ; Refresh
                7200     ; Retry
              604800     ; Expire
               86400     ; Negative Cache TTL
)
@   IN  NS  apple.tree.
@   IN  A   192.168.4.43
aaa     IN      A       192.168.4.100
bbb     IN      A       192.168.4.101
ccc     IN      CNAME   bbb

最前面的SOA,NS和A的部分是必須有的,具體寫法是:

  • @符號代表對本機的解析;
  • IN表示Internet,表示是解析的是因特網中的域名。這個在RFC1035中也有介紹。據說以前也有別的東西,但是現在基本只剩下IN了。
  • SOA的寫法可以參考這篇文章:https://bobcares.com/blog/understanding-soa-records/ 解釋的比較詳細。
  • NS寫本域。
  • A寫對本機解析到的A地址。

后面的是詳細的可以解析的主機。在這里也許還需要簡單的解釋一下,一個域名是由“主機+域”共同組成的,比如我們常見的www.baidu.com這個域名,baidu.com是它的域,而www表示這個頁面保存在這個主機上。像map.baidu.com,image.baidu.com都是存放在不同的主機的,對域名解析出來的地址有可能也不是同一個(我只是說有可能啊,當然扔同一個服務器上也沒什么)。
我這里的aaa,bbb,ccc就表示3個主機,其中aaa和bbb解析到不同的地址,而ccc設定為bbb的別名。(A是IP地址,CNAME是別名。也有別的東西。具體參見RFC1035。)要注意,我這三個主機都在apple.tree這個域中,也就是aaa.apple.tree,bbb.apple.tree,ccc.apple.tree這三個域名,在解析時需要將后面的域名省略掉。假設我還有個域名ddd.apple.tree想解析到www.baidu.com,需要這么寫:

ddd    IN    CNAME    www.baidu.com.

 

注意最后有個點,表示到這里結束,這是一個完整的域名,而不是一台主機。解析到A地址時候最后不加點。

以上。寫好之后,可以用sudo service bind9 restart來重啟服務器。當然我不建議這樣重啟。建議用sudo rndc reload重新加載,這樣不影響當前DNS服務器的運行。重啟OK之后測試一下:

$ dig aaa.apple.tree @192.168.4.43
; <<>> DiG 9.9.5-3ubuntu0.8-Ubuntu <<>> aaa.apple.tree @192.168.4.43
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53833
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;aaa.apple.tree. IN A
;; ANSWER SECTION:
aaa.apple.tree. 86400 IN A 192.168.4.100
;; Query time: 4 msec
;; SERVER: 192.168.4.43#53(192.168.4.43)
;; WHEN: Fri Jan 08 14:47:48 CST 2016
;; MSG SIZE rcvd: 59

 

就醬。如果重啟沒有成功,就把服務關掉(sudo service bind9 stop,使用之前可以先ps -ef | grep bind看看,有沒有個named -u bind的進程,如果有再關,關不掉的就直接殺進程),然后用sudo named -g來檢查一下,看看服務器是在哪一步掛掉的。說不定配置語法里少個分號。

最后說說日志的配法:
我直接在named.conf.options最后加上了logging選項:

logging {
    channel defaults {
        file "/var/log/named/default.log";
        severity dynamic;
        print-time yes;
        print-category yes;
        print-severity yes;
    };
    channel securitys {
        file "/var/log/named/securitys.log";
        severity dynamic;
        print-time yes;
        print-category yes;
        print-severity yes;
    };
    channel gsquery {
        file "/var/log/named/query.log"   versions 3 size 20m;
        severity info;
        print-time yes;
        print-category yes;
        print-severity yes;
    };
    category queries { gsquery; };
    category security { securitys; };
    category default { defaults; };
    category general { defaults; };
};

 

這里要注意:

(1)注意寫到/var/log/named目錄中的時候,可能會涉及到權限問題,如果bind啟動不了,需要檢查一下apparmor對bind的權限控制。具體檢查方法:

sudo vim /etc/apparmor.d/usr.sbin.named

 

在最下面找到

# some people like to put logs in /var/log/named/ instead of having
# syslog do the heavy lifting.
/var/log/named/** rw,
/var/log/named/ rw,

 

加入一行

/var/log/named/* rw,

 

然后保存,用

sudo /etc/init.d/apparmor reload

 

或者

sudo /etc/init.d/apparmor restart

 

使配置生效。

(2)如果不特意配置logging,也會有默認的日志記錄,是跟系統日志一起的。如果要徹底關閉日志,需要寫成醬嬸的:

logging {
    channel "null" { null; };
    category "default" { null; };
};

 

測試性能的時候需要關閉日志,否則QPS差到不能忍。因為經常需要打開關閉日志,所以,我發現有注釋功能實在是太爽了!

BIND除了這種一般的域名解析功能,還可以對IP進行反解析,也就是從ip解析到域名。具體配置方法可以自行查找(我沒用到,所以懶得寫了。。囧。。)
好啦,基本配置就講這么多。

 

最后的最后,還是配上圖,以免無聊廣告亂入:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM