一、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檔案以後對其進行檔案排查了,如果沒有返回資訊,則表示配置沒有問題