1. 程式人生 > 實用技巧 >開源DNS伺服器BIND詳解

開源DNS伺服器BIND詳解

Zone檔案和資源記錄Resource Record介紹

明確配置中的兩個概念:zone和RR。

BIND的配置檔案描述了一個域名伺服器的所有屬性,這些屬性是BIND的行為和功能。

其中的zone檔案描述了域名伺服器中包含的主機,所提供的服務型別等資訊,BIND通過將zone檔案中的資訊載入到記憶體資料結構中並有效組織起來,然後對外部的DNS請求提供驗證和查詢請求。

通常情況下,一個zone檔案描述該DNS伺服器服務的一個授權伺服器域。例如:有一個DNS伺服器可以解析taobao.com的域名和baidu.com的域名,那麼這個DNS伺服器的配置檔案中就可以設定兩個zone標籤,一個描述taobao.com的域名資訊,另一個描述baidu.com的域名資訊。

資源記錄Resource Record記錄了一個域(domain)的屬性和特性,注意,屬性是指共有的特徵,特性指特有的特徵。

named.conf檔案詳解

named.conf是BIND的唯一的主配置檔案,由一個個子句組成,每個子句都有一個頭跟一對大括號組成,大括號裡面是該子句中的因子和值(具體見下面的例子)。

下面的程式碼是named.conf的一個最簡配置。其中假設named.conf只負責解析授權域名cobb.com。

其中的key是由rndc-confgen生成的。

key "rndc-key" {
  algorithm hmac-md5;
  secret "eoiWMiCwCYPwNLWxl05rNw==";
};

controls {
  inet 127.0.0.1 port 953;
  allow { 127.0.0.1; };
  keys { "rndc-key"; };
};

options {
  //域名檔案存放的絕對路徑
  directory "/usr/local/named/var";
  //如果bind啟動,自動會在/usr/local/named/var目錄生成一個named.pid檔案,開啟檔案就是named程序的ID
  pid-file "named.pid";
};

zone "." IN {
  //根域名伺服器
  type hint;
  //存放在//usr/local/named/var目錄,檔名為named.root
  file "named.root";
};

//域cobb.com的zone檔案
zone "cobb.com" IN {
  type master;               //該域名伺服器是主域名伺服器,這個選項主要用在主備部署中
  file "cobb.com.zone";      //解析域名cobb.com的zone檔案內容,其路徑由options中的directory指定
  allow-update { none; };    //定義了允許向主zone檔案傳送動態更新的匹配列表
};

//反向解析
zone "1.168.192.in-addr.arpa" in {
  type master;
  //存放反向解析的檔案
  file "cobb.com.rev";
  allow-update { none; };
};

說明:

controls子句定義了伺服器的控制通道的一些資訊,控制通道是named為外部提供的管理named伺服器的介面,通常情況下named都在本機的【953】埠上監聽控制資訊;allow表示允許本機上的rndc控制程式控制named伺服器,allow除了指定ip地址外,還可以指定acl中的使用者地址;keys表示rndc控制named時需要攜帶的金鑰,這個金鑰由rndc-gen生成,並在named.conf中包含。

options選項中包含一些全域性狀態描述,這些描述資訊在所有的zone檔案和view中可見,但如果zone檔案或view中重新定義這些描述資訊,則options中的資訊被覆蓋。

zone檔案詳解

檔案cobb.com.zone檔案位於/usr/local/named/var中,其內容如下所示:

$TTL 86400
$ORIGIN cobb.com.
@       IN  SOA ns1 root(
            2013031901  ;serial
            12h         ;refresh
            7200        ;retry
            604800      ;expire
            86400       ;mininum
            )
            NS  ns1.cobb.com.
            NS  ns2.cobb.net.
            MX  10  mail.cobb.com.
ns1     IN  A   192.168.10.1
www     IN  A   192.168.10.10
        IN  A   192.168.10.11
mail    IN  A   192.168.10.20
host1   IN  A   192.168.10.30
ftp     IN  CNAME   host1

上面的配置表示:

該zone有兩個域名伺服器,一個是ns1.cobb.com,ip地址是192.168.10.1,另一個是ns2.cobb.net(它不在本域內);
該zone有一個郵件伺服器,域名是mail.cobb.com,IP地址是192.168.10.20;
該zone有兩個對外服務的全球資訊網伺服器,其域名是www.cobb.com,IP地址是192.168.10.10和192.168.10.11;
該zone有一個對外服務的ftp伺服器,其域名是ftp.cobb.com,IP地址是192.168.10.30;
該zone有一個主機,其域名是host1.cobb.com,IP地址也是192.168.10.30;

其中TTL和ORIGIN等標籤在BIND中叫做指令。
zone檔案中的所有指令都以一個$開始,指令主要用來表示zone檔案中的一些控制資訊。
$TTL指令表示一個資源記錄在其他DNS伺服器中(這個DNS伺服器是請求本BIND的伺服器,一般情況下是local dns)的快取時間,在這個快取時間內,local dns不會再請求BIND,而是直接返回域名對應的IP地址。
$ORIGIN指令表示該zone檔案用來描述的域(domain)名稱。

SOA(start of authority)資源記錄:它定義了一個域的全域性特性,必須是出現在zone檔案中的第一個資源記錄,而且一個zone檔案中必須只有一個SOA資源記錄。
其中SOA後面的ns1與root分別是域名伺服器和管理員郵箱([email protected]),其全寫分別是ns1.cobb.com.和root.cobb.com.,因為$ORIGIN指明瞭域名,所以這個地方可以略去。

NS(name server)資源記錄:它定義了為本域(domain)(這個例子中是cobb.com)服務的域名伺服器。需要注意的是外部域名伺服器(例子中的ns2)必須為zone cobb.com包含一個zone檔案。

MX(mail exchanger)資源記錄:它定義了本域中的郵件伺服器。這個資源記錄是可選的,因為一個域中不一定有郵件伺服器。

A(Address)資源記錄:這是個很關鍵的記錄。它定義了zone檔案中提到的主機或服務的IPv4地址(IPv6地址叫AAAA記錄),而且這些IPv4地址必須是外部可見的。例如全球資訊網伺服器www.cobb.com的IPv4地址是192.168.10.10。

CNAME記錄:是一個已經定義了IPv4地址的主機的別名記錄。通常用來為已經存在的主機分配一個或多個服務。示例中的主機host1.cobb.com既做主機又提供ftp服務。

從上面的分析可以看出,我們也可以不用CNAME,只需要為不同的服務指定相同的IP地址即可。但是實際上兩種情況下必須用CNAME記錄:

  • 正式主機或別名主機在不同的域中,我們不知道外部域中的IP地址,所以必須要用CNAME,例如ftp.cobb.com是ftp.cobb.net的一個別名,但是在域cobb.com中無法知道ftp.cobb.net的IP地址,只能用CNAME記錄;
  • 使用者希望訪問一個站點時用cobb.com產生www.cobb.com的效果,這時我們需要有如下的CNAME定義:
; 定義一個解析cobb.com的IP地址
        IN               A              cobb.com
; 為www.cobb.com建立別名cobb.com
www     IN               A              cobb.com.

Debian系統安裝BIND

  • DNS快取伺服器:Bind9會把查詢到的域名資訊快取到伺服器上,下次直接從本伺服器上讀取。這樣可以節省頻寬和等待時間。
  • DNS主伺服器(primary master):Bind9從主伺服器的配置檔案中讀取域名區域資訊,並作為該區域的權威解析資料。
  • DNS從伺服器(slave master):Bind9作為主伺服器的備份,即使主伺服器不可用時,也仍然能夠進行解析。

1. 安裝bind9

apt-get install bind9 bind9-host dnsutils bind9-doc

2. 配置檔案

/etc/bind/named.conf
/etc/bind/named.conf.local
/etc/bind/named.conf.options

3. 建立一個DNS快取伺服器

3.1 轉發配置

編輯/etc/bind/named.conf.options檔案,新增以下內容:

    // 加入ISP提供的DNS伺服器地址
    forwards {
            192.168.22.2;
    };
    // 注意後面的分號,一定不能少!

3.2 重啟bind

/etc/init.d/bind9 restart

3.3 修改/etc/resolv.comf檔案

nameserver 192.168.22.200
#192.168.22.200為本機IP,這個根據個人情況進行填寫

修改/etc/hosts檔案:

127.0.0.1       localhost
192.168.22.200  dns

3.4 測試

dig baidu.com

4. 搭建主DNS伺服器

將配置linux.tech的主DNS伺服器,需要建立正向和反向解析的Zone區域檔案。

4.1 建立正反向Zone檔案

編輯/etc/bind/named.conf.local檔案,新增以下內容:

zone "linux.tech" {
    type master;
    file "/etc/bind/db.linux.tech";
};

zone "22.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/db.22.168.192.in-addr.arpa";
};

4.2 新增正向解析檔案

建立/etc/bind/db.linux.tech檔案,內容如下:

$TTL 604800
$ORIGIN linux.tech.
@     IN SOA dns admin (
                  1     ; Serial
             604800     ; Refresh
              86400     ; Retry
            2419200     ; Expire
             604800 )   ; Negative Cache TTL
@     IN NS    dns.linux.tech.
dns   IN A     192.168.22.200
www   IN A     10.9.36.96

4.3 新增反向解析檔案

建立/etc/bind/db.22.168.192.in-addr.arpa檔案,內容如下:

$TTL 604800
@  IN  SOA dns.linux.tech. admin.linux.tech. (
                  1     ; Serial
             604800     ; Refresh
              86400     ; Retry
            2419200     ; Expire
             604800 )   ; Negative Cache TTL
@    IN  NS  dns.linux.tech.
200  IN  PTR dns.linux.tech.

5. 重置bind並測試

/etc/init.d/bind9 reload

ping dns.linux.tech
ping www.linux.tech

dig dns.linux.tech
dig www.linux.tech

dig -x 127.0.0.1
dig -x 192.168.22.200

named-checkzone linux.tech /etc/bind/db.linux.tech
named-checkzone linux.tech /etc/bind/db.22.168.192.in-addr.arpa

6. 主從配置

zone "linux.tech" {
    type master;
    file "/etc/bind/db.linux.tech";
    allow-transfer {
        @ip_slave;
    };
};
zone "linux.tech" {
    type slave;
    file "/etc/bind/slaves/db.linux.tech";
    masters {
        @ip_master;
    };
};