[DNS]ubuntu搭建DNS服務器(bind9)- IPv6

前言

       公司AP系統增加IPv6功能,爲測試基於域名-IPv6的放行規則,需要搭建支持IPv6的DNS服務器。

Ubuntu採用bind9配置DNS服務器,並增加IPv6部分內容。本文以bind9作爲DNS服務器

參考:

https://blog.csdn.net/colourzjs/article/details/44491479(搭建bind9

https://www.isc.org/downloads/bind/doc/ (bind官方使用文檔)

注意:

1、如果目標網站支持V4和v6地址 ,如果用戶(訪問目標網站的人)是使用的是v4地址則DNS返回V4的地址。如果用戶(訪問目標網站的人)是使用的是v6地址則DNS返回V6的地址。 

2、如果目標網站僅支持v4地址,這種是比較常見的 

如果用戶(訪問目標網站的人)是使用的是v4地址則DNS返回V4的地址。如果用戶(訪問目標網站的人)是使用的是v6地址則DNS返回一個可以進行V6到V4地址轉換的網關地址。

1. BIND介紹

BIND (Berkeley Internet Name Domain)是Domain Name System (DNS) 協議的一個實現,提供了DNS主要功能的開放實現,包括

* 域名服務器 (named)

* DNS解析庫函數

* DNS服務器運行調試所用的工具

是一款開放源碼的DNS服務器軟件,由美國加州大學Berkeley分校開發和維護的,按照ISC的調查報告,BIND是世界上使用最多最廣泛的域名服務系統。不論你的郵件服務器,WEB服務器或者其他的services如何的安全可靠,DNS的故障會給你帶來用戶根本無法訪問這些服務。

BIND,也是我們常說的named,由於多數網絡應用程序使用其功能,所以在很多BIND的弱點及時被發現。主要分爲三個版本:

v4:

1998年多數UNIX捆綁的是BIND4,已經被多數廠商拋棄了,除了OpenBSD還在使用。OpenBSD核心人爲BIND8過於複雜和不安全,所以繼續使用BIND4。這樣一來BIND8/9的很多優點都不包括在v4中。

v8:

就是如今使用最多最廣的版本,其詳細內容可以參閱 BIND 8+ 域名服務器安全增強

v9:

最新版本的BIND,全部重新寫過,免費(但是由商業公司資助),也添加了許多新的功能(但是安全上也可能有更多的問題)。BIND9在2000年十月份推出,現在穩定版本是9.3.2。

2. 安裝

   目前有兩種方式:源碼安裝和apt-get或者rpm安裝。

2.1 源碼安裝

源碼獲取地址:http://www.isc.org/products/BIND

解壓

tar -xvf bind-9.2.6.tar.gz

包括以下子目錄:bin(全部BIND二進制源代碼,包括named),contrib(一些工具) ,doc(BIND的文檔,包括資源手冊),lib(BIND使用的庫的源代碼),make(makefile文件). 

#./configure 

編譯BIND,輸入: 

#make all 

安裝BIND 

#make install

2.2 apt-get

apt-get install bind9

3、配置文件說明

1、配置文件目錄

一般位於/etc/bind/

2、Zone文件和資源記錄Resource Record

介紹配置文件前需要明確兩個配置中的概念:zone和RR。

BIND的配置文件描述了一個域名服務器的所有屬性,這些屬性BIND的行爲和功能。

zone文件描述了域名服務器中包含的主機,所提供的服務類型等信息,BIND通過將zone文件中的信息加載到內存數據結構中並有效組織起來,然後對外部的DNS請求提供驗證和查詢請求。需要注意的是,zone文件的格式不是由BIND制定的,而是DNS標準文檔制定的(見RFC1035)。通常情況下,一個zone文件描述該DNS服務器服務的一個授權服務器域。例如我有一個DNS服務器可以解析taobao.com的域名和baidu.com的域名,那麼我的DNS服務器的配置文件中就可以設置兩個zone標籤,一個描述taobao.com的域名信息,另一個描述baidu.com的域名信息。

資源記錄resource Record記錄了一個域(domain)的屬性和特性

3、配置文件簡介

named.conf:  Bind主配置文件

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

named.conf.options 一些配置選項

named.conf.default-zones 默認的本地規則,包含跟文件、正向區文件、反向區文件等

named.conf.local:一般放置zone

 

主配置文件/etc/named.conf的配置語句:

acl 定義IP地址的訪問控制清單 

control 定義ndc使用的控制通道 

include 把其他文件包含到配置文件中 

key 定義授權的安全密鑰 

logging 定義日誌寫什麼,寫到哪 

opitons 定義全局配置選項和缺省值  

server 定義遠程服務器的特徵 

trunsted-keys 爲服務器定義DNSSEC加密密鑰 

zone 定義一個區

4、named.conf文件配置

named.conf是BIND的唯一的主配置文件,當然你也可以自己編寫主配置文件,但是需要在BIND主進程named啓動的時候用-c選項指定主配置文件的路徑。named.conf由一個個子句組成,每個子句都有一個頭跟一對大括號組成,大括號裏面是該子句中的因子和值(具體見下面的例子)。

下面的代碼是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中的信息被覆蓋。上面例子中的directory和pid-file的含義見代碼註釋。

4、zone文件配置

文件cobb.com.zone由用戶自定義,其示例內容如下所示:

$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

ljx     IN  A   192.168.10.30

ftp     IN  CNAME   ljx

 

上面的配置表示:

1)該zone有兩個域名服務器,一個是ns1.cobb.com,ip地址是192.168.10.1,另一個是ns2.cobb.net(它不在本域內);

2)該zone有一個郵件服務器,域名是mail.cobb.com,IP地址是192.168.10.20;

3)該zone有兩個對外服務的萬維網服務器,其域名是www.cobb.com,IP地址是192.168.10.10和192.168.10.11;

4)該zone有一個對外服務的ftp服務器,其域名是ftp.cobb.com,IP地址是192.168.10.30;

5)該zone有一個主機,其域名是ljx.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地址的主機的別名記錄。通常用來爲已經存在的主機分配一個或多個服務。示例中的主機ljx.cobb.com既做主機又提供ftp服務。從上面的分析可以看出,我們也可以不用CNAME,只需要爲不同的服務指定相同的IP地址即可。但是實際上兩種情況下必須用CNAME記錄:1)真是主機或別名主機在不同的域中,我們不知道外部域中的IP地址,所以必須要用CNAME,例如ftp.cobb.comftp.cobb.net的一個別名,但是在域cobb.com中無法知道ftp.cobb.net的IP地址,只能用CNAME記錄;2)用戶希望訪問一個站點時用cobb.com產生www.cobb.com的效果,這時我們需要有如下的CNAME定義:

; 定義一個解析cobb.com的IP地址

                 IN              A              cobb.com

; 爲www.cobb.com建立別名cobb.com

www     IN               A              cobb.com.

 

當然,上面介紹的只是一個最小配置,但是已經包含了大部分情況下我們需要配置的選項。更多的配置選項請參見:http://www.zytrax.com/books/dns/ch7/view.html

4、實例(實測可用)

測試域名:smart-clouds.cn

測試ip: 192.168.206.138 主域名服務器 

1、增加zone

在named.conf.local中增加

zone "smart-clouds.cn"{

    type master;

    file "/etc/bind/db.smart-clouds.cn";

    allow-query { any; };

    allow-update { any; };

};

zone "206.168.192.in-addr.arpa"{

    type master;

    file "/etc/bind/db.192.smart-clouds.cn";

};

2、創建db文件

文件名稱應該與zone中的file名稱相同

 

域名轉ip

vi db.smart-clouds.cn

添加一下內容:

**********************************************************************

;ND data file for local loopback interface

;

$TTL 604800

$ORIGIN smart-clouds.cn.

@ IN SOA smart-clouds.cn. root.smart-clouds.cn. (

2006080401 ; Serial

604800 ; Refresh

86400 ; Retry

2419200 ; Expire

604800 ) ; Negative Cache TTL

;

@ IN NS ns1

@ IN A 192.168.206.138

ns1 IN A 192.168.206.138

www IN A 192.168.206.138

 

@ IN NS ns2

@ IN AAAA 3ffe:321f:0000:07c2:0000:0000:0000:0001

ns2 IN AAAA 3ffe:321f:0000:07c2:0000:0000:0000:0001

www IN AAAA 3ffe:321f:0000:07c2:0000:0000:0000:0001

*******************************************************************

上述四行代碼爲支持ipv6功能的dns

使用命令nslookup -querytype=AAAA smart-clouds.cn 0:0:0:0:0:0:0:1

可以測試是否工作。

 

IP轉域名:

vi /etc/bind/db.192.smart-clouds.cn 

添加一下內容

*****************************************************

$TTL 60480

@ IN SOA smart-clouds.cn. root.smart-clouds.cn. (

2006080401 ; Serial

604800 ; Refresh

86400 ; Retry

2419200 ; Expire

604800 ) ; Negative Cache TTL

;

@ IN NS smart-clouds.cn.

138 IN PTR www.smart-clouds.cn.

138 IN PTR ns1.smart-clouds.cn.

****************************************************************

5、啓動

重新啓動bind9

/etc/init.d/bind9 restart  

查看啓動日誌文件

tail /var/log/syslog

 

Mar 19 22:43:14 ubuntu named[61378]: managed-keys-zone: loaded serial 3

Mar 19 22:43:14 ubuntu named[61378]: zone 0.in-addr.arpa/IN: loaded serial 1

Mar 19 22:43:14 ubuntu named[61378]: zone 255.in-addr.arpa/IN: loaded serial 1

Mar 19 22:43:14 ubuntu named[61378]: zone 127.in-addr.arpa/IN: loaded serial 1

Mar 19 22:43:14 ubuntu named[61378]: zone localhost/IN: loaded serial 2

Mar 19 22:43:14 ubuntu named[61378]: zone smart-clouds.cn/IN: loaded serial 2006080401

Mar 19 22:43:14 ubuntu named[61378]: all zones loaded

Mar 19 22:43:14 ubuntu named[61378]: running

Mar 19 22:43:14 ubuntu named[61378]: zone smart-clouds.cn/IN: sending notifies (serial 2006080401)

啓動異常信息都從該日誌中查看

查看bind進程是否啓動 

ps -aux|grep named

bind     61378  0.0  0.8 164688 12904 ?        Ssl  22:43   0:00 /usr/sbin/named -u bind

root     61440  0.0  0.0  15940   916 pts/11   S+   22:47   0:00 grep --color=auto named

 

遇到的問題

   1、rndc: connect failed: 127.0.0.1#953: connection

      解決http://blog.csdn.net/lujisheng/article/details/4637204

 

   2、出現文件不能生成

      chown -R bind 某文件夾 如chown -R named /etc/bind/

   修改/etc/resolv.conf文件 該文件用來設置採用dns服務器 修改爲nameserver 127.0.0.1即採用本地dns服務

6、設置log

啓動日誌

在默認情況下,BIND把日誌消息寫到/var/log/messages

而這些日誌消息是非常少的,主要就是啓動,關閉的日誌記錄和一些嚴重錯誤的消息,

詳細日誌

       在named.conf中設置,可以將服務器的運行情況和配置服務器的行爲等記錄到log文件中

       1、配置log生成位置:

              在named.conf中;說明日誌配置信息統一放到named.conf.options;日誌生成到哪取決於named.conf.options中的   directory "/var/cache/bind";的設置。如果日誌不能生成同前面提到的chown -R bind

       2、配置log生成信息

在配置文件named.conf中使用logging語句來定製自己所需要的日誌記錄,logging語句的語法爲:

logging {

                channel <string>; {

                file <logfile>;;

                        syslog <optional_facility>;;

                null;

                stderr;

                        severity <logseverity>;;

                        print-time <boolean>;;

                        print-severity <boolean>;;

                        print-category <boolean>;;

        };

        category <string>; { <string>;; ... };

};

 

在日誌中主要有兩個概念:通道(channel)和類別(category)。通道指定了應該向哪裏發送日誌數據:是發送給syslog,還是寫在一個文件裏,或是發送給named的標準錯誤輸出,還是發送到位存儲桶(bit bucket)。類別則規定了哪些數據需要記錄。下面我們主要介紹一下文件通道和類別。

在定義通道的語句中,severity是指定記錄消息的級別。在bind中主要有以下幾個級別(按照嚴重性遞減的順序):

critical

error

warning

notice

info

debug [ level ]

dynamic

 

定義了某個級別後,系統會記錄包括該級別以及比該級別更嚴重的級別的所有消息。比如定義級別爲error,則會記錄critical和error兩個級別的信息。一般情況下,我們記錄到info級別就可以了。print-time是設定在日誌中是否需要寫入時間,print-severity是設定在日誌中是否需要寫入消息級別,print-category是設定在日誌中是否需要寫入日誌類別。

category語句是指定哪一種類別的數據使用哪個或者哪幾個已經定義了的通道。在bind9中類別有:

default

        default類別匹配所有未明確指定通道的類別,但是不匹配不屬於任何類別的消息。這些不屬於任何類別的消息屬於下面列出的這些類別。

general

        包括所有未明確分類的BIND消息。

client

        處理客戶端請求。

config

        配置文件分析和處理。

database

        同BIND內部數據庫相關的消息,用來存儲區數據和緩存記錄。

dnssec

        處理DNSSEC簽名的響應。

lame-servers

        發現錯誤授權。

network

        網絡操作

notify

        異步區變動通知。

queries

        查詢日誌

resolver

        名字解析,包括對來自解析器的遞歸查詢的處理。

security

        認可/非認可的請求。

update

        動態更新事件。

xfer-in

        從遠程名字服務器到本地名字服務器的區傳送。

xfer-out

        從本地名字服務器到遠程名字服務器的區傳送。

 

例如要記錄queries消息,就可以如下配置(把以下語句添加到named.conf中就可以了):

      logging {

              channel query_log {

                      file "query.log"        versions 3 size 20m;

                      severity        info;

                      print-time        yes;

                      print-category  yes;

              };

              category queries {

                      query_log;

              };

      };

 

這樣服務器會在工作目錄(directory語句所指定的目錄)下創建query.log這個文件,並把運行過程產生的queries消息寫如到query.log文件中, 另外解釋一下“file "query.log" versions 3 size 20m;”語句中“version”和“size”的意義:version是指定允許同時存在多少個版本的該文件,比如指定3個版本(version 3),bind9會保存query.log、query.log0、query.log1和query.log2。

Size是指定文件大小的上限,如果只設定了size而沒有設定version的話,當文件達到指定的文件大小上限時,服務器停止寫入該文件。如果設定了version的話,服務器會進行循環,比如把query.log變成query.log1,query.log1變成query.log2等,然後建立一個新的query.log進行寫入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章