在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 | 通用主機1 | host1.nyc3.example.com | 10.128.100.101 |
host2 | 通用主機2 | host2.nyc3.example.com | 10.128.200.102 |
你的伺服器應該會有不同的主機名和內網IP,在本教程進行中只需將相關主機名和IP替換為你自己的即可。子網的命名也不一定要使用資料中心的region名稱,如果你在多個數據中心都有伺服器,那麼這樣以每個資料中心來命名各自的內網DNS還是比較方便的。
目標
本教程結束時,我們應該已經配置好一臺ns1作為主DNS伺服器,以及一臺ns2作為備用DNS伺服器。
主機 | 功能 | 內網FQDN | 內網IP地址 |
---|---|---|---|
ns1 | 主DNS伺服器 | ns1.nyc3.example.com | 10.128.10.11 |
ns2 | 備用DNS伺服器 | ns2.nyc3.example.com | 10.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.com
和db.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