2014-06-20

Ubuntu 使用 bind9 架設DNS Server

這是寫給自己看的安裝筆記,所以比較簡單。

1. 首先安裝必要套件
sudo apt-get install bind9 bind9-doc dnsutils

2. 進入到/etc/bind目錄,會看到底下目錄結構:

紅框的兩個檔案是我們要修改的。
named.conf.local 裡面可以設定正反解的zone,如果不想改,也可以新增自己喜歡的檔案,但要記得在named.conf裡面include他
named.conf.options 主要在設定dns的一些選項和安全性。
其他的檔案就是預設的一些localhost的正反解相關,這裡我們不用理他沒關係。



3. 首先設定named.conf.options,比較重要的是關閉recursion。底下是我的設定
acl intra { 192.168.1.0/24; };
options {
        directory "/var/cache/bind";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

        // forwarders {
        //      0.0.0.0;
        // };

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation auto;

        auth-nxdomain no;    # conform to RFC1035
//      listen-on-v6 { none; };
        listen-on port 53 { any; };
        allow-query { any; };
        allow-query-cache { none; };
        recursion no; //allow-recursion { intra; };
        also-notify { };
};

最上面的紅框,是指定ACL群組,可以指定多個IP,等於當作變數來使用。
下面的紅框,recursion no和allow-recursion只能指定一個,要嘛全關(開),要嘛就只有特定IP才開,裡面放的變數就是上面acl所指定的。這裡我是把他全關了。

4. 接著設定zone,一個domain還包含正解和反解,所以會有兩個以上的zone。可以把zone的設定寫在named.conf.local底下。
底下是範例:
acl allow-trans-ip { x.x.x.x; y.y.y.y; };
//---正解的區域---
//主要,如果要設定的zone是主要區域,就看這部分
zone "domain1.com" {
    type master; //master為主要區域,也可設定為slave就是次要區域,可從主要區域複製資料過來
    file "/etc/bind/zones/domain1.com.fwd"; //指定dns檔案位置,檔名可自取,但如果有多個zone要設定,檔名格式最好一致
    
    //底下的是master才要設定,指定哪些IP可以從此台master複製資料,不然全開,網路所有DNS都可以從這裡取得資料也太危險
    allow-transfer {
        allow-trans-ip; //這個變數就是上面紅框處指定的
    };
}
//次要,如果要設定的zone是要從master取得資料的次要區域,就看這部分
zone "slave.com" {
    type slave;
    file "slave.com.fwd";
    //次要區域的檔案有點不太一樣,如果使用絕對路徑,應該會發生無法寫入(permission deny)的錯誤
    //所以我們只使用檔名,那麼路徑呢?ubuntu預設是放在/var/cache/bind/底下
    //可在named.conf.options底下看到directory的設定就是預設檔案存放路徑
    //底下的是slave才要設定
    masters { x.x.x.x; }; //指定master是哪幾台,一樣可用acl指定IP群組
}
//...

//---反解的區域---
zone "3.2.1.in-addr.arpa" { //反解的命名規則,如果IP是1.2.3.x,那麼就要倒過來寫變成3.2.1.in-addr.arpa,格式要對
    type master; //這裡就只寫master了,要設定slave的話跟上面一樣
    file "/etc/bind/zonez/1.2.3.rev"; //檔名一樣可自取,多個zone的話檔名格式最好一致
    allow-transfer { allow-trans-ip; };
};


5. 接下來就是編輯每個zone的檔案了。如果是master的話一定要編輯,不然沒資料怎麼讓slave抓啊~
如果是slave的話檔案不存在也可,從master抓來之後會自己產生,但要確定檔案存放的目錄能夠讓named有寫入權限。

底下是正解檔案範例:
$TTL    3600
;指定SOA紀錄
@       IN      SOA     ns1.domain1.com. webadmin.domain1.com. ( ;注意webadmin.domain1.com其實是email,只是把@改成.,所以意思是webadmin@domain1.com
                        2014062007 ;Serial,每次編輯該檔都要改序號,這個是為了通知slave,master有改變,要他們來更新資料,建議格式是YYYYMMDDnn,nn為當日流水號
                        1800  ;Refresh
                        900   ;Retry
                        86400 ;Expire
                        3600 );Default TTL

;指定NS紀錄
;一般DNS都會有兩台備用,所以如果有第二台當slave的話也記得要把該台寫到NS紀錄裡
@       IN      NS      ns1.domain1.com.
@       IN      NS      ns2.domain2.com.

;指定A紀錄
@       IN      A       1.2.3.4 ;@表示該domain名稱,在本例也就是domain1.com
ns1.domain1.com.     IN      A       1.2.3.4 ;master的IP
ns2.domain1.com.     IN      A       1.2.3.5 ;slave的IP
web.domain1.com.     IN      A       1.2.3.6
mail1.domain1.com.   IN      A       1.2.3.7
main2.domain1.com.   IN      A       1.2.3.8

;指定CNAME
www.domain1.com.     IN      CNAME   web.domain1.com.

;指定MX
@       3600    IN      MX      1 mail1.domain1.com. ;數字1表示優先權最大
@       3600    IN      MX      5 main2.domain2.com.

底下是反解檔案範例:
$TTL    3600
;指定SOA紀錄
@       IN      SOA     ns1.domain1.com. webadmin.domain1.com. (
                        2014062003
                        1800
                        900
                        86400
                        3600 )
;
;指定NS紀錄,SOA跟NS的寫法都跟正解一樣
@       IN      NS      ns1.domain1.com.
@       IN      NS      ns2.domain1.com

;指定PTR紀錄,反解裡面就只有PTR紀錄,說明IP要對應到哪個名稱
4.3.2.1.in-addr.arpa.     IN      PTR     ns1.domain1.com. ;注意最前面的IP順序是相反的
4       IN      PTR     ns2.domain1.com. ;也可以用簡寫,只寫IP最後一碼即可,但注意簡寫後面不可加.
;...


6. 接著重新啟動一下:/etc/init.d/bind9 restart
這樣就啟動我們的dns服務了,如果是slave的話也就自動向master抓好資料了。

參考資料:
鳥哥