1. 程式人生 > >在Ubuntu 14.04上用BIND配置一個私有網路DNS伺服器

在Ubuntu 14.04上用BIND配置一個私有網路DNS伺服器

系列教程

本教程為7篇系列中的第6篇:DNS管理簡介

前言

伺服器管理中很重要的一部分就是設定一個有效的域名系統(DNS),這樣可以方便的通過網路名稱連線到指定的IP地址和埠。使用有效域名(FQDN)相比IP的好處是,它們簡化了服務和應用的網路配置,提升了配置檔案的可維護性。在私有網路內設定一個自己的DNS服務可以有效加強伺服器群組的可管理性。

本教程將設定使用BIND(BIND9)在Ubuntu 14.04上搭建一個DNS伺服器,它可以將內網各主機的IP和主機名對映起來。對於主機數量不小的環境而言,這提供了非常有必要的管理能力。

本文的CentOS版本可以參閱這裡

準備工作

首先,你需要準備如下事項:

  • 幾臺執行在同一資料中心的伺服器,並且啟用了私有網路
  • 一臺新主機,用來作為主DNS伺服器——ns1
  • 可選:可以用另一臺主機作為次DNS伺服器——ns2

如果你對DNS的概念不熟悉,可以參閱這篇文章的前三部分內容

示範所用命名規範

本教程將使用如下一套命名規範:

  • 兩臺現有的伺服器分別叫做“host1”和“host2”
  • 兩臺伺服器所在資料中心為“nyc3”
  • 兩臺伺服器處於私有網路 10.128.0.0/16 子網
  • 兩臺伺服器都與我們的一個“example.com”服務有關

我們將使用“nyc3.example.com”作為私有子網。因此,“host1”的FQDN將是“host1.nyc3.example.com”。以下是兩臺主機的資訊:

主機功能內網FQDN內網IP地址
host1通用主機1host1.nyc3.example.com10.128.100.101
host2通用主機2host2.nyc3.example.com10.128.200.102

你的伺服器應該會有不同的主機名和內網IP,在本教程進行中只需將相關主機名和IP替換為你自己的即可。子網的命名也不一定要使用資料中心的region名稱,如果你在多個數據中心都有伺服器,那麼這樣以每個資料中心來命名各自的內網DNS還是比較方便的。

目標

本教程結束時,我們應該已經配置好一臺ns1作為主DNS伺服器,以及一臺ns2作為備用DNS伺服器。

主機功能內網FQDN內網IP地址
ns1主DNS伺服器ns1.nyc3.example.com10.128.10.11
ns2備用DNS伺服器ns2.nyc3.example.com10.128.20.12

安裝BIND

在ns1和ns2上,更新apt:

sudo apt-get update

安裝BIND:

sudo apt-get install bind9 bind9utils bind9-doc

IPv4模式

我們要將BIND設定為IPv4模式。在ns1和ns2上,用編輯器開啟bind9引數檔案:

sudo vi /etc/default/bind9

OPTIONS條目裡新增“-4”:

OPTIONS="-4 -u bind"

儲存退出。

配置主DNS伺服器

BIND的配置涉及多個檔案,這些檔案均被include在主配置檔案named.conf中。檔名中的“named”即是BIND執行時所用的程序名稱。

配置options檔案

在ns1上,用編輯器開啟named.conf.options檔案:

sudo vi /etc/bind/named.conf.options

在原來的options文字塊之前,建立一個名為trusted的ACL文字塊。我們將在此設定被允許前來定址的主機列表(即跟ns1處於同一資料中心內的主機)。我們將在列表中加入ns1、ns2、host1和host2:

acl "trusted" {
        10.128.10.11;    # ns1 - can be set to localhost
        10.128.20.12;    # ns2
        10.128.100.101;  # host1
        10.128.200.102;  # host2
};

然後,進入options文字塊,找到directory條目:

options {
        directory "/var/cache/bind";
...
}

directory條目下加入如下內容:

options {
        directory "/var/cache/bind";

        recursion yes;                 # 啟用遞迴定址
        allow-recursion { trusted; };  # 允許“trusted”列表前來遞迴定址
        listen-on { 10.128.10.11; };   # 此處填寫ns1的內網IP地址。僅在內網監聽
        allow-transfer { none; };      # 預設禁用zone transfer

        forwarders {
                8.8.8.8;
                8.8.4.4;
        };
...
};

儲存退出。上述變更完成後,只有指定的“trusted”主機才可到我們的DNS伺服器上查詢。

接下來是DNS zones的設定。

配置Local檔案

在ns1上用編輯器開啟named.conf.local檔案:

sudo vi /etc/bind/named.conf.local

當前,檔案中應該只有幾行註釋。我們要在檔案中定義我們的轉發和反向區(zones)。

在檔案中新增如下內容:

zone "nyc3.example.com" {
    type master;
    file "/etc/bind/zones/db.nyc3.example.com"; # 區檔案路徑
    allow-transfer { 10.128.20.12; };         # ns2的內網IP地址
};

針對我們的10.128.0.0/16子網新增如下反向區內容(其中的“128.10”是“10.128”的八進位制反轉):

zone "128.10.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.10.128";  # 10.128.0.0/16 子網
    allow-transfer { 10.128.20.12; };  # ns2的內網IP地址
};

如果你的伺服器不在同一子網(但在同一資料中心),則需要給每一個子網設定一個區以及區檔案。當所有區都新增完畢後,儲存退出。

接下來需要建立相應的區檔案。

建立轉發區檔案

我們在轉發區檔案中定義需要轉發的DNS查詢記錄,比如將針對“host1.nyc3.example.com”的請求轉發到host1的對應IP地址。

首先建立區檔案目錄。根據我們的命名規範,該目錄將位於/etc/bind/zones

sudo mkdir /etc/bind/zones

我們將基於db.local來建立這個區檔案。輸入如下命令複製檔案:

cd /etc/bind/zones
sudo cp ../db.local ./db.nyc3.example.com

用編輯器開啟:

sudo vi /etc/bind/zones/db.nyc3.example.com

找到如下部分:

$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.      ; delete this line
@       IN      A       127.0.0.1       ; delete this line
@       IN      AAAA    ::1             ; delete this line

先是SOA記錄的修改。把第一個“localhost”替換成ns1的FQDN,把“root.localhost”替換成“admin.nyc3.example.com”。此外,每次編輯一個新的區檔案時,都要把序列值(Serial)+1,這裡原來是2,所以我們要改成3。改完了應該是這樣的:

@       IN      SOA     ns1.nyc3.example.com. admin.nyc3.example.com. (
                              3         ; Serial

現在,把檔案末尾的三條記錄刪除(後面標記了“delete this line”的三行)。

在檔案末尾新增域名伺服器的記錄,注意第二列的“NS”:

; name servers - NS records
    IN      NS      ns1.nyc3.example.com.
    IN      NS      ns2.nyc3.example.com.

然後為本區內的主機新增A記錄,即所有後綴為“.nyc3.example.com”的伺服器。本教程將新增ns1、ns2、host1和host2的A記錄:

; name servers - A records
ns1.nyc3.example.com.          IN      A       10.128.10.11
ns2.nyc3.example.com.          IN      A       10.128.20.12

; 10.128.0.0/16 - A records
host1.nyc3.example.com.        IN      A      10.128.100.101
host2.nyc3.example.com.        IN      A      10.128.200.102

儲存退出。至此,本檔案應該是這個樣子的:

$TTL    604800
@       IN      SOA     ns1.nyc3.example.com. admin.nyc3.example.com. (
                  3       ; Serial
             604800     ; Refresh
              86400     ; Retry
            2419200     ; Expire
             604800 )   ; Negative Cache TTL
;
; name servers - NS records
     IN      NS      ns1.nyc3.example.com.
     IN      NS      ns2.nyc3.example.com.

; name servers - A records
ns1.nyc3.example.com.          IN      A       10.128.10.11
ns2.nyc3.example.com.          IN      A       10.128.20.12

; 10.128.0.0/16 - A records
host1.nyc3.example.com.        IN      A      10.128.100.101
host2.nyc3.example.com.        IN      A      10.128.200.102

接下來是反向區檔案。

建立反向區檔案

我們在反向區檔案中定義DNS PTR記錄,以使DNS伺服器在接受IP地址(如“10.128.100.101”)時能夠查詢到對應的FQDN(如“host1.nyc3.example.com”)。

在ns1上,為named.conf.local檔案中指定的每一個反向區建立一個檔案。我們將基於db.127區檔案建立我們自己的檔案。首先將該檔案複製到指定位置,並將其命名為我們所使用的檔名:

cd /etc/bind/zones
sudo cp ../db.127 ./db.10.128

用編輯器開啟該檔案:

sudo vi /etc/bind/zones/db.10.128

現在的檔案內容應該是這樣的:

$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.      ; delete this line
1.0.0   IN      PTR     localhost.      ; delete this line

首先還是編輯SOA記錄和序列號,如下:

@       IN      SOA     ns1.nyc3.example.com. admin.nyc3.example.com. (
                              3         ; Serial

然後刪除末尾的兩行(標記有“delete this line”)。

然後在檔案末尾新增如下內容(注意在第二欄標註NS):

; name servers - NS records
      IN      NS      ns1.nyc3.example.com.
      IN      NS      ns2.nyc3.example.com.

然後,為該子網下所有的伺服器新增PTR記錄。本文將新增10.128.0.0/16子網下的四臺伺服器(IP地址的最後兩位,要反過來寫):

; PTR Records
11.10   IN      PTR     ns1.nyc3.example.com.    ; 10.128.10.11
12.20   IN      PTR     ns2.nyc3.example.com.    ; 10.128.20.12
101.100 IN      PTR     host1.nyc3.example.com.  ; 10.128.100.101
102.200 IN      PTR     host2.nyc3.example.com.  ; 10.128.200.102

儲存退出。現在的檔案內容應該是這樣的:

$TTL    604800
@       IN      SOA     nyc3.example.com. admin.nyc3.example.com. (
                              3         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
; name servers
      IN      NS      ns1.nyc3.example.com.
      IN      NS      ns2.nyc3.example.com.

; PTR Records
11.10   IN      PTR     ns1.nyc3.example.com.    ; 10.128.10.11
12.20   IN      PTR     ns2.nyc3.example.com.    ; 10.128.20.12
101.100 IN      PTR     host1.nyc3.example.com.  ; 10.128.100.101
102.200 IN      PTR     host2.nyc3.example.com.  ; 10.128.200.102

檢查BIND配置語法

執行如下命令以檢查named.conf*檔案的語法:

sudo named-checkconf

如果配置檔案中沒有語法錯誤,該命令執行完畢後會直接返回到shell提示符而不輸出任何錯誤。如果有錯誤資訊(error),請對照之前的步驟重新檢查後再執行named-checkconf,直到沒有錯誤輸出為止。

named-checkzone命令可以檢查區檔案的正確性,使用方式是在第一個引數中寫入區名稱,第二個引數中寫入區檔名稱,兩個名稱都是在named.conf.local當中定義的。

比如,輸入如下命令以檢查“nyc3.example.com”轉發區:

sudo named-checkzone nyc3.example.com db.nyc3.example.com

輸入如下命令以檢查“128.10.in-addr.arpa”反向區:

* sudo named-checkzone 128.10.in-addr.arpa /etc/bind/zones/db.10.128

如果沒有錯誤,則可以進入下一步驟。

重啟BIND

輸入如下命令以重啟BIND:

sudo service bind9 restart

我們的主DNS伺服器現在已經配置完畢,接下來開始配置備用DNS伺服器。

配置備用DNS伺服器

在大部分情況下,最好是配置一個備用DNS伺服器以應對主伺服器故障的場景。備用DNS伺服器的配置要比主伺服器的配置簡單多了。

在ns2上,編輯named.conf.options檔案:

sudo vi /etc/bind/named.conf.options

在檔案開頭,新增可信伺服器的ACL列表:

acl "trusted" {
        10.128.10.11;   # ns1
        10.128.20.12;   # ns2 - 可以設定為localhost
        10.128.100.101;  # host1
        10.128.200.102;  # host2
};

directory條目下新增如下內容:

        recursion yes;
        allow-recursion { trusted; };
        listen-on { 10.128.20.12; };      # ns2 private IP address
        allow-transfer { none; };          # disable zone transfers by default

        forwarders {
                8.8.8.8;
                8.8.4.4;
        };

儲存退出。至此,該檔案的內容應該與ns1的named.conf.options檔案內容一樣,只是把ns1的內網IP換成了ns2的內網IP。

用編輯器開啟named.conf.local檔案:

sudo vi /etc/bind/named.conf.local

現在定義從屬區(slave zones),該區對應著主伺服器上的主區(master zones)。從屬區檔案自己不設定路徑,而是設定一個masters目錄指向主DNS伺服器的內網IP。你在ns1上設定了多少區,在這裡就需要都加上:

zone "nyc3.example.com" {
    type slave;
    file "slaves/db.nyc3.example.com";
    masters { 10.128.10.11; };  # ns1 private IP
};

zone "128.10.in-addr.arpa" {
    type slave;
    file "slaves/db.10.128";
    masters { 10.128.10.11; };  # ns1 private IP
};

儲存退出。

執行如下命令以檢查配置檔案的語法:

sudo named-checkconf

驗證成功後,重啟bind:

sudo service bind9 restart

現在,我們的主從DNS伺服器都已經設定好,可以在伺服器上把它們用起來了。

配置DNS客戶端

所有在可信ACL列表上的伺服器都可以使用上面配置好的DNS伺服器——ns1和ns2。客戶端的配置在不同的作業系統上有所不同,不過大部分Linux發行版都使用/etc/resolv.conf檔案進行配置。

Ubuntu客戶端

Ubuntu和Debian系統需要編輯一個head檔案,該檔案在系統啟動時被附加到resolv.conf

sudo vi /etc/resolvconf/resolv.conf.d/head

在檔案中新增如下內容(域名和IP地址替換成你自己的):

search nyc3.example.com  # 你的內網域名
nameserver 10.128.10.11  # ns1內網IP
nameserver 10.128.20.12  # ns2內網IP

執行resolvconf以生成resolv.conf檔案:

sudo resolvconf -u

Ubuntu和Debian的配置就此完畢。

CentOS客戶端

CentOS、紅帽和Fedora系統可直接編輯resolv.conf檔案:

sudo vi /etc/resolv.conf

在檔案頭新增如下命令(域名和IP地址替換成你自己的):

search nyc3.example.com  # 內網域名
nameserver 10.128.10.11  # ns1內網IP
nameserver 10.128.20.12  # ns2內網IP

儲存退出。

測試客戶端

使用nslookup測試客戶端是否能夠從域名伺服器得到響應。可信列表上的每一臺伺服器都應該能夠通過下述測試。

測試轉發查詢

首先測試是否能夠獲取host1.nyc3.example.com的IP地址:

* nslookup host1

這裡只需要輸入“host1”,因為我們在search選項中輸入了子網的域名。該命令的輸出結果應該是這樣的:

Output:
Server:     10.128.10.11
Address:    10.128.10.11#53

Name:   host1.nyc3.example.com
Address: 10.128.100.101

測試反向查詢

現在測試是否能夠從host1的IP獲取其名稱:

nslookup 10.128.100.101

該命令的輸出結果應該是這樣的:

Output:
Server:     10.128.10.11
Address:    10.128.10.11#53

11.10.128.10.in-addr.arpa   name = host1.nyc3.example.com.

如果測試獲得的結果均正確,則說明之前的區檔案設定是正確的。如果出現問題,請回到之前步驟檢查ns1上的區檔案內容(即db.nyc3.example.comdb.10.128)。

至此,DNS伺服器的配置已經完成。接下來講講區記錄的維護。

維護DNS記錄

實際使用中,我們需要維護DNS記錄以匹配伺服器環境的變更。

新增新主機

在資料中心新增新主機時,需要執行如下步驟將其新增到DNS。

主DNS伺服器的配置

  • 轉發區檔案:新增新主機的A記錄,“Serial”的值+1
  • 反向區檔案:新增新主機的PTR記錄,“Serial”的值+1
  • 將新主機的內網IP新增到“trusted” ACL列表(named.conf.options

然後,重啟BIND:

sudo service bind9 reload

備用DNS伺服器的配置

  • 將新主機的內網IP新增到“trusted” ACL列表(named.conf.options

然後,重啟BIND:

sudo service bind9 reload

新主機上的配置

  • 編輯resolv.conf,啟用ns1和ns2
  • nslookup命令測試

移除一臺主機

移除一臺主機,只需要把上述新增的內容逐一刪除即可(即,反向操作上述步驟)。

總結

現在,我們的環境中可以通過主機名識別主機,所以我們配置服務的時候不再需要記住一大堆的IP,而配置檔案的可讀性也提升了。因為所有的對映關係都在主DNS伺服器上管理,所以維護起來也更加方便。

DNS伺服器的維護工作是非常重要的,因為一旦ns1和ns2都不可用,你的所有服務都會癱瘓。所以,請確保你的環境中至少有一臺備用DNS伺服器,並且給兩臺DNS伺服器都做好備份工作。

翻譯:lazycai