Linux學習之CentOS(三十四)--配置域主DNS服務器



您可以通過點擊 右下角 的按鈕 來對文章內容作出評價, 也可以通過左下方的 關注按鈕 來關注我的博客的最新動態。 如果文章內容對您有幫助, 不要忘記點擊右下角的 推薦按鈕 來支持一下哦 如果您對文章內容有任何疑問, 可以通過評論或發郵件的方式聯系我: 501395377@qq.com / lzp501395377@gmail.com 如果需要轉載,請注明出處,謝謝!!

 

在上一篇隨筆里 Linux學習之CentOS(三十三)--DNS基礎及域名系統架構,講解了DNS的一些基礎知識以及域名系統架構,在本篇隨筆里將詳細地講解主DNS服務器的配置...

一、DNS服務器的類型

Primary DNS Server(Master)

一個域的主服務器保存着該域的zone配置文件,該域所有的配置、更改都是在該服務器上進行,本篇隨筆要講解的也是如何配置一個域的主DNS服務器

Secondary DNS Server(Slave)

域從服務器一般都是作為冗余負載使用,一個域的從服務器是從該域的主服務器上抓取zone配置文件,從服務器不會進行任何信息的更改,zone配置文件的修改只能在主DNS服務器上進行,所有的修改都有主服務器同步

Caching only Server

DNS緩存服務器不存在任何的zone配置文件,僅僅依靠緩存來為客戶端提供服務,通常用於負載均衡及加速訪問操作

二、安裝BIND

對於DNS服務器軟件現在有許多的程序可以使用,但是現今為止使用的最多最廣泛的DNS服務器軟件還是BIND(Berkeley Internet Name Domain),最早是由伯克利大學的一個學生開發的,現在的最新版本是版本9,由ISC進行編寫和維護。

BIND支持目前市面上所有的主流操作系統,包括Linux、Windows、Mac OS等

我們的CentOS上並沒有默認安裝BIND這個軟件,所以我們需要手動對其進行安裝,這里使用yum的方式來進行安裝

[root@xiaoluo ~]# yum install -y bind bind-chroot bind-utils
Loaded plugins: fastestmirror, refresh-packagekit, security Loading mirror speeds from cached hostfile * base: mirrors.stuhome.net * extras: mirrors.stuhome.net * updates: mirrors.stuhome.net Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package bind.x86_64 32:9.8.2-0.17.rc1.el6_4.4 will be installed --> Processing Dependency: bind-libs = 32:9.8.2-0.17.rc1.el6_4.4 for package: 32:bind-9.8.2-0.17.rc1.el6_4.4.x86_64 ---> Package bind-chroot.x86_64 32:9.8.2-0.17.rc1.el6_4.4 will be installed ---> Package bind-utils.x86_64 32:9.8.2-0.17.rc1.el6 will be updated ---> Package bind-utils.x86_64 32:9.8.2-0.17.rc1.el6_4.4 will be an update --> Running transaction check ---> Package bind-libs.x86_64 32:9.8.2-0.17.rc1.el6 will be updated ---> Package bind-libs.x86_64 32:9.8.2-0.17.rc1.el6_4.4 will be an update --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: bind x86_64 32:9.8.2-0.17.rc1.el6_4.4 updates 4.0 M bind-chroot x86_64 32:9.8.2-0.17.rc1.el6_4.4 updates 71 k Updating: bind-utils x86_64 32:9.8.2-0.17.rc1.el6_4.4 updates 182 k Updating for dependencies: bind-libs x86_64 32:9.8.2-0.17.rc1.el6_4.4 updates 878 k Transaction Summary ================================================================================ Install 2 Package(s) Upgrade 2 Package(s) Total download size: 5.1 M Downloading Packages: (1/4): bind-9.8.2-0.17.rc1.el6_4.4.x86_64.rpm | 4.0 MB 00:01 (2/4): bind-chroot-9.8.2-0.17.rc1.el6_4.4.x86_64.rpm | 71 kB 00:00 (3/4): bind-libs-9.8.2-0.17.rc1.el6_4.4.x86_64.rpm | 878 kB 00:00 (4/4): bind-utils-9.8.2-0.17.rc1.el6_4.4.x86_64.rpm | 182 kB 00:00 -------------------------------------------------------------------------------- Total 1.4 MB/s | 5.1 MB 00:03 warning: rpmts_HdrFromFdno: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 Importing GPG key 0xC105B9DE: Userid : CentOS-6 Key (CentOS 6 Official Signing Key)
<centos-6-key@centos.org> Package: centos-release-6-4.el6.centos.10.x86_64 (@anaconda-CentOS-201303020151.x86_64/6.4) From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Updating : 32:bind-libs-9.8.2-0.17.rc1.el6_4.4.x86_64 1/6 Installing : 32:bind-9.8.2-0.17.rc1.el6_4.4.x86_64 2/6 Installing : 32:bind-chroot-9.8.2-0.17.rc1.el6_4.4.x86_64 3/6 Updating : 32:bind-utils-9.8.2-0.17.rc1.el6_4.4.x86_64 4/6 Cleanup : 32:bind-utils-9.8.2-0.17.rc1.el6.x86_64 5/6 Cleanup : 32:bind-libs-9.8.2-0.17.rc1.el6.x86_64 6/6 Verifying : 32:bind-libs-9.8.2-0.17.rc1.el6_4.4.x86_64 1/6 Verifying : 32:bind-chroot-9.8.2-0.17.rc1.el6_4.4.x86_64 2/6 Verifying : 32:bind-9.8.2-0.17.rc1.el6_4.4.x86_64 3/6 Verifying : 32:bind-utils-9.8.2-0.17.rc1.el6_4.4.x86_64 4/6 Verifying : 32:bind-utils-9.8.2-0.17.rc1.el6.x86_64 5/6 Verifying : 32:bind-libs-9.8.2-0.17.rc1.el6.x86_64 6/6 Installed: bind.x86_64 32:9.8.2-0.17.rc1.el6_4.4 bind-chroot.x86_64 32:9.8.2-0.17.rc1.el6_4.4 Updated: bind-utils.x86_64 32:9.8.2-0.17.rc1.el6_4.4 Dependency Updated: bind-libs.x86_64 32:9.8.2-0.17.rc1.el6_4.4 Complete!

 

我們這里一共安裝了三個文件,一個是bind的主程序,一個是bind-chroot,還有一個是bind-utils,這兩個包一般我們在安裝bind時都要用到的,包括bind的拓展功能以及偽根等等,所以我們一並將其安裝了

BIND的服務名是 named,因為BIND提供的是DNS服務,而DNS默認的協議是TCP與UDP協議,所以BIND服務在啟動以后會占用53(Domain), 953(mdc)這兩個端口號

三、BIND的配置文件

安裝完BIND以后,BIND的主配置文件通常是保存在兩個位置:

/etc/named.conf  -BIND服務主配置文件

/var/named/  -域的zone配置文件

但是我們如果在安裝了 bind-chroot 這個程序以后,BIND的主配置文件存放位置就變了,此時BIND的主配置文件會被封裝到一個偽根目錄內,此時的配置文件位置為:

/var/named/chroot/etc/named.conf  -BIND服務主配置文件

/var/named/chroot/var/named  -域的zone配置文件

為什么安裝了bind-chroot以后,BIND的主配置文件的存放位置變了呢?這里就涉及到了一個偽根的知識,chroot是通過將相關文件封裝到一個偽根目錄內,已達到安全防護的目的,一旦該程序被攻破,將只能訪問到偽根目錄內的內容,而並不是真實的根目錄。我們知道Linux的根目錄是 / ,我們的服務如果安裝了chroot這個程序,此時我們的服務的配置文件都會被安裝到我們的偽根里面,會在里面生成一個與原來服務完全相同的一個目錄體系結構。我們知道 /var/named/chroot 這個肯定不是我們的根目錄,但是如果在安裝了chroot以后,該服務的根目錄就會把 /var/named/chroot 當成是自己的根目錄,這樣就可以對我們的真實根目錄進行保護,所以建議大家在安裝網絡服務時最好都附帶安裝上chroot這個程序,有關chroot的更多知識,可以參考這篇文章   理解chroot  

不同於其他的服務,BIND服務在安裝完以后不會有預置的配置文件,其他服務比如samba、httpd服務安裝完以后其目錄下都會有一些配置文件,而BIND服務是沒有的,怎么辦呢?我們通常在安裝完BIND服務以后,有關該服務的一些文檔都會保存在 /usr/share/doc 這個目錄下,在 (/usr/share/doc/bind-9.8.2/)這個目錄下有我們BIND配置文件的模板,我們只需要將其拷貝到其偽根目錄下即可:

[root@xiaoluo ~]# cd /usr/share/doc/bind-9.8.2/sample/
[root@xiaoluo sample]# ls
etc  var

我們看到,在sample目錄下有兩個文件夾,etc和var,我們將其拷貝過去即可

[root@xiaoluo ~]# cp -rv /usr/share/doc/bind-9.8.2/sample/etc/* /var/named/chroot/etc/
`/usr/share/doc/bind-9.8.2/sample/etc/named.conf' -> `/var/named/chroot/etc/named.conf'
`/usr/share/doc/bind-9.8.2/sample/etc/named.rfc1912.zones' -> `/var/named/chroot/etc/named.rfc1912.zones'
[root@xiaoluo ~]# cp -rv /usr/share/doc/bind-9.8.2/sample/var/* /var/named/chroot/var/ `/usr/share/doc/bind-9.8.2/sample/var/named/named.loopback' -> `/var/named/chroot/var/named/named.loopback' `/usr/share/doc/bind-9.8.2/sample/var/named/named.ca' -> `/var/named/chroot/var/named/named.ca' `/usr/share/doc/bind-9.8.2/sample/var/named/named.empty' -> `/var/named/chroot/var/named/named.empty' `/usr/share/doc/bind-9.8.2/sample/var/named/slaves' -> `/var/named/chroot/var/named/slaves' `/usr/share/doc/bind-9.8.2/sample/var/named/slaves/my.slave.internal.zone.db' -> `/var/named/chroot/var/named/slaves/my.slave.internal.zone.db' `/usr/share/doc/bind-9.8.2/sample/var/named/slaves/my.ddns.internal.zone.db' -> `/var/named/chroot/var/named/slaves/my.ddns.internal.zone.db' `/usr/share/doc/bind-9.8.2/sample/var/named/named.localhost' -> `/var/named/chroot/var/named/named.localhost' `/usr/share/doc/bind-9.8.2/sample/var/named/my.internal.zone.db' -> `/var/named/chroot/var/named/my.internal.zone.db' `/usr/share/doc/bind-9.8.2/sample/var/named/my.external.zone.db' -> `/var/named/chroot/var/named/my.external.zone.db' `/usr/share/doc/bind-9.8.2/sample/var/named/data' -> `/var/named/chroot/var/named/data'

這個時候我們的根目錄下就有了配置文件模板了,我們先來看看 named.conf 這個主配置文件的內容,其里面的代碼行數非常多啊,因為模板文件將所有的情況都列在里面了,但是我們其實用不了那么多的東西,這里我們只需要保留最基本的幾行即可,我們 named.conf 的最小化配置文件如下:

[root@xiaoluo etc]# vim named.conf

/*
 Sample named.conf BIND DNS server 'named' configuration file
 for the Red Hat BIND distribution.

 See the BIND Administrator's Reference Manual (ARM) for details, in:
   file:///usr/share/doc/bind-{version}/arm/Bv9ARM.html
 Also see the BIND Configuration GUI : /usr/bin/system-config-bind and 
 its manual.
*/

options
{
        // Put files that named is allowed to write in the data/ directory:
        directory               "/var/named";           // "Working" directory

        //listen-on port 53     { any; };
        listen-on port 53       { 127.0.0.1; };

        //listen-on-v6 port 53  { any; };
        listen-on-v6 port 53    { ::1; };

};

這個就是我們 named.conf 最小化的配置了,指定了 named 的工作目錄,指定了IPv4、IPv6的端口以及IP地址

四、配置域主DNS服務器

在了解了BIND服務的一些配置文件及工作目錄以后,我們接下來就要開始配置自己的域主DNS服務器了

一個域的主服務器(Master)是這個域的信息的權威服務器,所有這個域的信息都是由域的主服務器控制,配置一個域的主服務器通常需要以下幾個步驟

(比如說我現在要為 cnblogs.com 這個域配置一個主DNS服務器)

①在BIND的主配置文件中添加該域的定義

首先我們需要在named.conf這個文件里面添加 cnblogs.com 這個域的定義,需要在named.conf這個文件下面添加一行域的zone定義:

zone "cnblogs.com" {
  type master;
  file "cnblogs.com.zone";
};  // ;號一定要加上
[root@xiaoluo etc]# vim named.conf

/*
 Sample named.conf BIND DNS server 'named' configuration file
 for the Red Hat BIND distribution.

 See the BIND Administrator's Reference Manual (ARM) for details, in:
   file:///usr/share/doc/bind-{version}/arm/Bv9ARM.html
 Also see the BIND Configuration GUI : /usr/bin/system-config-bind and 
 its manual.
*/

options
{
    // Put files that named is allowed to write in the data/ directory:
    directory         "/var/named";        // "Working" directory

    //listen-on port 53    { any; };
    listen-on port 53    { 127.0.0.1; };

    //listen-on-v6 port 53    { any; };
    listen-on-v6 port 53    { ::1; };

};

zone "cnblogs.com"   // 里面寫上我們要配置的域的域名
{
    type master;  // 指定我們要配置的是域主DNS服務器
    file "cnblogs.com.zone";  // 指定域的zone文件名為 cnblogs.com.zone ,一般都是以域名.zone命名
};

這樣我們的named.conf里面就定義了 cnblogs.com 這個域的信息了

②在 /var/named/chroot/var/named 中創建該域的zone文件

因為zone文件的格式非常的復雜,包含了一些跟域從服務器同步刷新以及資源記錄等信息,所以我們手動去編寫很容易寫錯,因此我們一般使用默認的 named.localhost 這個文件來作為 zone 文件的模板,我們只需要復制出這樣一份文件即可:

[root@xiaoluo etc]# cd /var/named/chroot/var/named/
[root@xiaoluo named]# ls
data                 my.internal.zone.db  named.empty      named.loopback
my.external.zone.db  named.ca             named.localhost  slaves
[root@xiaoluo named]# cp named.localhost cnblogs.com.zone
[root@xiaoluo named]# ls
cnblogs.com.zone  my.external.zone.db  named.ca     named.localhost  slaves
data              my.internal.zone.db  named.empty  named.loopback

這樣我們的 named 目錄下就存在了一個叫做 cnblogs.com.zone的文件了,這個文件的名字要和上一步驟指定的文件名字要相同

③編輯zone文件,添加我們需要的信息

此時我們可以編輯這個 cnblogs.com.zone 文件,然后在里面添加我們需要的信息了

$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::1

        IN      MX      10      mail.cnblogs.com.  // 添加一條 郵件記錄,郵件記錄后面要跟域名,它會遞歸的解析這個域名,所以該域名的資源記錄一定要有,后面的 . 一定要寫上 
www     IN      A       192.168.1.111  // 添加了一條 www 的資源記錄 IP地址為 192.168.1.111 
mail    IN      A       192.168.1.222  // 添加了一條 mail 的資源記錄 IP地址為 192.168.1.222

注意:MX記錄一定要定義資源記錄的最前面,否則就會解析不成功,MX后面域名一定要寫完整,. 也要寫上

我們在配置好以后,都要確保配置文件擁有 r 的權限,

[root@xiaoluo named]# ls -l
total 36
-rw-r--r--. 1 root root  228 Jun  6 01:10 cnblogs.com.zone
drwxr-xr-x. 2 root root 4096 Jun  6 00:11 data
-rw-r--r--. 1 root root   56 Jun  6 00:11 my.external.zone.db
-rw-r--r--. 1 root root   56 Jun  6 00:11 my.internal.zone.db
-rw-r--r--. 1 root root 1892 Jun  6 00:11 named.ca
-rw-r--r--. 1 root root  152 Jun  6 00:11 named.empty
-rw-r--r--. 1 root root  152 Jun  6 00:11 named.localhost
-rw-r--r--. 1 root root  168 Jun  6 00:11 named.loopback
drwxr-xr-x. 2 root root 4096 Jun  6 00:11 slaves

因為DNS服務是網絡服務,之前在講SELinux時提到過,CentOS默認采用的是目標策略,即對所有的目標(網絡)進程進行限制,所以我們這里為了方便,將其設置成permissive

[root@xiaoluo named]# getenforce 
Enforcing
[root@xiaoluo named]# setenforce 0
[root@xiaoluo named]# getenforce 
Permissive

④啟動我們 BIND 服務或者通過 reload 命令刷新我們的 BIND 服務

[root@xiaoluo named]# service named start
Generating /etc/rndc.key:                                  [  OK  ]
Starting named:                                            [  OK  ]

沒有任何報錯信息,則表示我們的BIND服務就啟動正常了

這個時候我們就可以通過測試來檢驗我們的DNS主服務器是否配置成功了,如果是別的機器,我們只需要將其DNS的地址指向我這台主機地址即可,這里我就在本機上進行實驗,修改 /etc/resolv.conf 文件,將nameserver指向當前主機:

[root@xiaoluo named]# vim /etc/resolv.conf

# Generated by NetworkManager
#domain localdomain
#search localdomain com
#nameserver 192.168.198.2

nameserver 127.0.0.1

⑤使用host或者dig命令來檢測DNS是否配置成功

//  查詢www.cnblogs.com的IP地址
[root@xiaoluo named]# dig www.cnblogs.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.4 <<>> www.cnblogs.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47531
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; QUESTION SECTION:
;www.cnblogs.com.        IN    A

;; ANSWER SECTION:
www.cnblogs.com.    86400    IN    A    192.168.1.111  // 我們剛才自己定義的IP

;; AUTHORITY SECTION:
cnblogs.com.        86400    IN    NS    cnblogs.com.

;; ADDITIONAL SECTION:
cnblogs.com.        86400    IN    A    127.0.0.1
cnblogs.com.        86400    IN    AAAA    ::1

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Jun  6 01:21:05 2013
;; MSG SIZE  rcvd: 107

//  查詢cnblogs.com這個域的郵件記錄
[root@xiaoluo named]# dig -t mx cnblogs.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.4 <<>> -t mx cnblogs.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37707
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 3

;; QUESTION SECTION:
;cnblogs.com.            IN    MX

;; ANSWER SECTION:
cnblogs.com.        86400    IN    MX    10 mail.cnblogs.com.  // 我們自己定義的郵件MX記錄

;; AUTHORITY SECTION:
cnblogs.com.        86400    IN    NS    cnblogs.com.

;; ADDITIONAL SECTION:
mail.cnblogs.com.    86400    IN    A    192.168.1.222  // 解析出來的郵件MX記錄的mail主機的IP地址
cnblogs.com.        86400    IN    A    127.0.0.1
cnblogs.com.        86400    IN    AAAA    ::1

;; Query time: 2 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Jun  6 01:27:33 2013
;; MSG SIZE  rcvd: 124

//  查詢mail.cnblogs.com的IP地址
[root@xiaoluo named]# dig mail.cnblogs.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.4 <<>> mail.cnblogs.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11360
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; QUESTION SECTION:
;mail.cnblogs.com.        IN    A

;; ANSWER SECTION:
mail.cnblogs.com.    86400    IN    A    192.168.1.222  // 我們自己定義的郵件服務器主機IP地址

;; AUTHORITY SECTION:
cnblogs.com.        86400    IN    NS    cnblogs.com.

;; ADDITIONAL SECTION:
cnblogs.com.        86400    IN    A    127.0.0.1
cnblogs.com.        86400    IN    AAAA    ::1

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Jun  6 01:34:42 2013
;; MSG SIZE  rcvd: 108

我們看到此時我們的DNS主服務器以及配置成功了,因為我們剛才講 /etc/resolv.conf 里的nameserver指向了當前的主機,而不是公網的權威DNS服務器,所以此時就只會根據本機的DNS服務器去負責處理,只要當前DNS服務器上有相關的資源記錄,則就會給我們返回相關的信息

五、錯誤排查

因為BIND服務的主配置文件 named.conf 以及我們的 zone 配置文件其內容非常復雜,晦澀難懂,所以難免會出現配置出錯的情況,因此為了方便我們進行錯誤排查,BIND還提供了兩個非常的命令來對我們的 named.conf 和 zone 文件進行排錯檢查

①命令 named-checkconf 可以查看BIND的主配置文件的錯誤:

[root@xiaoluo named]# named-checkconf /var/named/chroot/etc/named.conf

②命令 named-checkzone 可以查看zone配置文件的錯誤:

[root@xiaoluo named]# named-checkzone cnblogs.com.zone /var/named/chroot/var/named/cnblogs.com.zone 
zone cnblogs.com.zone/IN: loaded serial 0
OK

通過這兩個命令我們就可以在配置完BIND主配置文件以及zone文件以后對其進行文件排查了,如果沒有返回信息,則表示配置沒有問題

 

至此,本篇隨筆的編寫就告一段落了,眨眼睛發現已經快凌晨2點了,也該睡覺了!!!!!!!!!!!!

本篇隨筆詳細講解了BIND這個常用的DNS服務軟件以及如何配置我們的DNS域主服務器.............

 


免責聲明!

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



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