1. 程式人生 > 實用技巧 >使用Bind提供域名解析服務

使用Bind提供域名解析服務

DNS域名解析服務

相較於由數字構成的IP地址,域名更容易被理解和記憶,所以我們通常更習慣通過域名的方式來訪問網路中的資源。但是,網路中的計算機之間只能基於IP地址來相互識別對方的身份,而且要想在網際網路中傳輸資料,也必須基於外網的IP地址來完成。

鑑於網際網路中的域名和IP地址對應關係資料庫太過龐大,DNS域名解析服務採用了類似目錄樹的層次結構來記錄域名與IP地址之間的對應關係,從而形成了一個分散式的資料庫系統,如圖13-1所示。

域名字尾一般分為國際域名和國內域名。原則上來講,域名字尾都有嚴格的定義,但在實際使用時可以不必嚴格遵守。目前最常見的域名字尾有.com(商業組織)、.org(非營利組織)、.gov(政府部門)、.net(網路服務商)、.edu(教研機構)、.pub(公共大眾)、.cn(中國國家頂級域名)等。

主伺服器:在特定區域內具有唯一性,負責維護該區域內的域名與IP地址之間的對應關係。

從伺服器:從主伺服器中獲得域名與IP地址的對應關係並進行維護,以防主伺服器宕機等情況。

快取伺服器:通過向其他域名解析伺服器查詢獲得域名與IP地址的對應關係,並將經常查詢的域名資訊儲存到伺服器本地,以此來提高重複查詢時的效率。

DNS域名解析服務採用分散式的資料結構來存放海量的“區域資料”資訊,在執行使用者發起的域名查詢請求時,具有遞迴查詢和迭代查詢兩種方式。所謂遞迴查詢,是指DNS伺服器在收到使用者發起的請求時,必須向用戶返回一個準確的查詢結果。如果DNS伺服器本地沒有儲存與之對應的資訊,則該伺服器需要詢問其他伺服器,並將返回的查詢結果提交給使用者。而迭代查詢則是指,DNS伺服器在收到使用者發起的請求時,並不直接回複查詢結果,而是告訴另一臺DNS伺服器的地址,使用者再向這臺DNS伺服器提交請求,這樣依次反覆,直到返回查詢結果。

由此可見,當用戶向就近的一臺DNS伺服器發起對某個域名的查詢請求之後(這裡以www.linuxprobe.com為例),其查詢流程大致如圖13-2所示。

當用戶向網路指定的DNS伺服器發起一個域名請求時,通常情況下會有本地由此DNS伺服器向上級的DNS伺服器傳送迭代查詢請求;如果該DNS伺服器沒有要查詢的資訊,則會進一步向上級DNS伺服器傳送迭代查詢請求,直到獲得準確的查詢結果為止。其中最高階、最權威的根DNS伺服器總共有13臺,分佈在世界各地,其管理單位、具體的地理位置,以及IP地址如表13-1所示。

安裝Bind服務程式

BIND(Berkeley Internet Name Domain,伯克利因特網名稱域)服務是全球範圍內使用最廣泛、最安全可靠且高效的域名解析服務程式。DNS域名解析服務作為網際網路基礎設施服務,其責任之重可想而知,因此建議大家在生產環境中安裝部署bind服務程式時加上chroot(俗稱牢籠機制)擴充套件包,以便有效地限制bind服務程式僅能對自身的配置檔案進行操作,以確保整個伺服器的安全

[root@linuxprobe ~]# yum install bind-chroot
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分輸出資訊………………
Installing:
 bind-chroot x86_64 32:9.9.4-14.el7 rhel 81 k
Installing for dependencies:
 bind x86_64 32:9.9.4-14.el7 rhel 1.8 M
Transaction Summary
================================================================================
Install 1 Package (+1 Dependent package)
Total download size: 1.8 M
Installed size: 4.3 M
Is this ok [y/d/N]: y
Downloading packages:
--------------------------------------------------------------------------------
Total 28 MB/s | 1.8 MB 00:00 
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
 Installing : 32:bind-9.9.4-14.el7.x86_64 1/2 
 Installing : 32:bind-chroot-9.9.4-14.el7.x86_64 2/2 
 Verifying : 32:bind-9.9.4-14.el7.x86_64 1/2 
 Verifying : 32:bind-chroot-9.9.4-14.el7.x86_64 2/2 
Installed:
 bind-chroot.x86_64 32:9.9.4-14.el7 
Dependency Installed:
 bind.x86_64 32:9.9.4-14.el7 
Complete!



bind服務程式的配置並不簡單,因為要想為使用者提供健全的DNS查詢服務,要在本地儲存相關的域名資料庫,而如果把所有域名和IP地址的對應關係都寫入到某個配置檔案中,估計要有上千萬條的引數,
這樣既不利於程式的執行效率,也不方便日後的修改和維護。因此在bind服務程式中有下面這三個比較關鍵的檔案。

主配置檔案(/etc/named.conf):只有58行,而且在去除註釋資訊和空行之後,實際有效的引數僅有30行左右,這些引數用來定義bind服務程式的執行。

區域配置檔案(/etc/named.rfc1912.zones):用來儲存域名和IP地址對應關係的所在位置。類似於圖書的目錄,對應著每個域和相應IP地址所在的具體位置,當需要檢視或修改時,可根據這個位置找到相關檔案。

資料配置檔案目錄(/var/named):該目錄用來儲存域名和IP地址真實對應關係的資料配置檔案。

Linux系統中,bind服務程式的名稱為named。首先需要在/etc目錄中找到該服務程式的主配置檔案,然後把第11行和第17行的地址均修改為any,分別表示伺服器上的所有IP地址均可提供DNS域名解析服務,以及允許所有人對本伺服器傳送DNS查詢請求。這兩個地方一定要修改準確。

[root@linuxprobe ~]# vim /etc/named.conf
 1 //
 2 // named.conf
 3 //
 4 // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
 5 // server as a caching only nameserver (as a localhost DNS resolver only).
 6 //
 7 // See /usr/share/doc/bind*/sample/ for example named configuration files.
 8 //
 9 
 10 options {
 11 listen-on port 53 { any; };
 12 listen-on-v6 port 53 { ::1; };
 13 directory "/var/named";
 14 dump-file "/var/named/data/cache_dump.db";
 15 statistics-file "/var/named/data/named_stats.txt";
 16 memstatistics-file "/var/named/data/named_mem_stats.txt";
 17 allow-query { any; };
 18 
 19 /* 
 20 - If you are building an AUTHORITATIVE DNS server, do NOT enable re cursion.
 1,1 Top
21 - If you are building a RECURSIVE (caching) DNS server, you need to enable 
 22 recursion. 
 23 - If your recursive DNS server has a public IP address, you MUST en able access 
 24 control to limit queries to your legitimate users. Failing to do so will
 25 cause your server to become part of large scale DNS amplification 
 26 attacks. Implementing BCP38 within your network would greatly
 27 reduce such attack surface 
 28 */
 29 recursion yes;
 30 
 31 dnssec-enable yes;
 32 dnssec-validation yes;
 33 dnssec-lookaside auto;
 34 
 35 /* Path to ISC DLV key */
 36 bindkeys-file "/etc/named.iscdlv.key";
 37 
 38 managed-keys-directory "/var/named/dynamic";
 39 
 40 pid-file "/run/named/named.pid";
 41 session-keyfile "/run/named/session.key";
 42 };
 43 
 44 logging {
 45 channel default_debug {
 46 file "data/named.run";
 47 severity dynamic;
 48 };
 49 };
 50 
 51 zone "." IN {
 52 type hint;
 53 file "named.ca";
 54 };
 55 
 56 include "/etc/named.rfc1912.zones";
 57 include "/etc/named.root.key";


bind服務程式的區域配置檔案(/etc/named.rfc1912.zones)用來儲存域名和IP地址對應關係的所在位置。在這個檔案中,定義了域名與IP地址解析規則儲存的檔案位置以及服務型別等內容
,而沒有包含具體的域名、IP地址對應關係等資訊。服務型別有三種,分別為hint(根區域)、master(主區域)、slave(輔助區域),其中常用的master和slave指的就是主伺服器和從伺服器。
將域名解析為IP地址的正向解析引數和將IP地址解析為域名的反向解析引數分別如圖13-3和圖13-4所示。

正向解析實驗

在DNS域名解析服務中,正向解析是指根據域名(主機名)查詢到對應的IP地址。也就是說,當用戶輸入了一個域名後,bind服務程式會自動進行查詢,並將匹配到的IP地址返給使用者。這也是最常用的DNS工作模式。

第1步:編輯區域配置檔案。該檔案中預設已經有了一些無關緊要的解析引數,旨在讓使用者有一個參考。我們可以將下面的引數新增到區域配置檔案的最下面,當然,也可以將該檔案中的原有資訊全部清空,而只保留自己的域名解析資訊:

[root@linuxprobe ~]# vim /etc/named.rfc1912.zones
zone "linuxprobe.com" IN {
type master;
file "linuxprobe.com.zone";
allow-update {none;};
};

第2步:編輯資料配置檔案。我們可以從/var/named目錄中複製一份正向解析的模板檔案(named.localhost),然後把域名和IP地址的對應資料填寫資料配置檔案中並儲存。
在複製時記得加上-a引數,這可以保留原始檔案的所有者、所屬組、許可權屬性等資訊,以便讓bind服務程式順利讀取檔案內容:
[root@linuxprobe ~]# cd /var/named/
[root@linuxprobe named]# ls -al named.localhost
-rw-r-----. 1 root named 152 Jun 21 2007 named.localhost
[root@linuxprobe named]# cp -a named.localhost linuxprobe.com.zone

編輯資料配置檔案。在儲存並退出後文件後記得重啟named服務程式,讓新的解析資料生效。考慮到正向解析檔案中的引數較多,而且相對都比較重要,劉遄老師在每個引數後面都作了簡要的說明。

[root@linuxprobe named]# vim linuxprobe.com.zone
[root@linuxprobe named]# systemctl restart named

第3步:檢驗解析結果。為了檢驗解析結果,一定要先把Linux系統網絡卡中的DNS地址引數修改成本機IP地址,這樣就可以使用由本機提供的DNS查詢服務了。nslookup命令用於檢測能否從DNS伺服器中查詢到域名與IP地址的解析記錄,進而更準確地檢驗DNS伺服器是否已經能夠為使用者提供服務。

[root@linuxprobe ~]# systemctl restart network
[root@linuxprobe ~]# nslookup
> www.linuxprobe.com
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: www.linuxprobe.com
Address: 192.168.10.10
> bbs.linuxprobe.com
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: bbs.linuxprobe.com
Address: 192.168.10.20

反向解析實驗

第1步:編輯區域配置檔案。在編輯該檔案時,除了不要寫錯格式之外,還需要記住此處定義的資料配置檔名稱,因為一會兒還需要在/var/named目錄中建立與其對應的同名檔案。反向解析是把IP地址解析成域名格式,因此在定義zone(區域)時應該要把IP地址反寫,比如原來是192.168.10.0,反寫後應該就是10.168.192,而且只需寫出IP地址的網路位即可。把下列引數新增至正向解析引數的後面。

[root@linuxprobe ~]# vim /etc/named.rfc1912.zones
zone "linuxprobe.com" IN {
type master;
file "linuxprobe.com.zone";
allow-update {none;};
};
zone "10.168.192.in-addr.arpa" IN {
type master;
file "192.168.10.arpa";
};

第2步:編輯資料配置檔案。首先從/var/named目錄中複製一份反向解析的模板檔案(named.loopback),然後把下面的引數填寫到檔案中。
其中,IP地址僅需要寫主機位,如圖13-5所示。

[root@linuxprobe named]# cp -a named.loopback 192.168.10.arpa

[root@linuxprobe named]# vim 192.168.10.arpa

[root@linuxprobe named]# systemctl restart named

第3步:檢驗解析結果。在前面的正向解析實驗中,已經把系統網絡卡中的DNS地址引數修改成了本機IP地址,

因此可以直接使用nslookup命令來檢驗解析結果,僅需輸入IP地址即可查詢到對應的域名資訊。

[root@linuxprobe ~]# nslookup
> 192.168.10.10
Server: 127.0.0.1
Address: 127.0.0.1#53
10.10.168.192.in-addr.arpa name = ns.linuxprobe.com.
10.10.168.192.in-addr.arpa name = www.linuxprobe.com.
10.10.168.192.in-addr.arpa name = mail.linuxprobe.com.
> 192.168.10.20
Server: 127.0.0.1
Address: 127.0.0.1#53
20.10.168.192.in-addr.arpa name = bbs.linuxprobe.com.

部署從伺服器

在本實驗中,主伺服器與從伺服器分別使用的作業系統和IP地址如表13-2所示。

表13-2 主伺服器與從伺服器分別使用的作業系統與IP地址資訊

第1步:在主伺服器的區域配置檔案中允許該從伺服器的更新請求,即修改allow-update {允許更新區域資訊的主機地址;};引數,然後重啟主伺服器的DNS服務程式。

[root@linuxprobe ~]# vim /etc/named.rfc1912.zones
zone "linuxprobe.com" IN {
type master;
file "linuxprobe.com.zone";
allow-update { 192.168.10.20; };
};
zone "10.168.192.in-addr.arpa" IN {
type master;
file "192.168.10.arpa";
allow-update { 192.168.10.20; };
};
[root@linuxprobe ~]# systemctl restart named

第2步:在從伺服器中填寫主伺服器的IP地址與要抓取的區域資訊,然後重啟服務。注意此時的服務型別應該是slave(從),而不再是master(主)。masters引數後面應該為主伺服器的IP地址,而且file引數後面定義的是同步資料配置檔案後要儲存到的位置,稍後可以在該目錄內看到同步的檔案。

[root@linuxprobe ~]# vim /etc/named.rfc1912.zones
zone "linuxprobe.com" IN {
type slave;
masters { 192.168.10.10; };
file "slaves/linuxprobe.com.zone";
};
zone "10.168.192.in-addr.arpa" IN {
type slave;
masters { 192.168.10.10; };
file "slaves/192.168.10.arpa";
};
[root@linuxprobe ~]# systemctl restart named

第3步:檢驗解析結果。當從伺服器的DNS服務程式在重啟後,一般就已經自動從主伺服器上同步了資料配置檔案,而且該檔案預設會放置在區域配置檔案中所定義的目錄位置中。
隨後修改從伺服器的網路引數,把DNS地址引數修改成192.168.10.20,這樣即可使用從伺服器自身提供的DNS域名解析服務。最後就可以使用nslookup命令順利看到解析結果了。

[root@linuxprobe ~]# cd /var/named/slaves
[root@linuxprobe slaves]# ls 
192.168.10.arpa linuxprobe.com.zone
[root@linuxprobe slaves]# nslookup
> www.linuxprobe.com
Server: 192.168.10.20
Address: 192.168.10.20#53
Name: www.linuxprobe.com
Address: 192.168.10.10
> 192.168.10.10
Server: 192.168.10.20
Address: 192.168.10.20#53
10.10.168.192.in-addr.arpa name = www.linuxprobe.com.
10.10.168.192.in-addr.arpa name = ns.linuxprobe.com.
10.10.168.192.in-addr.arpa name = mail.linuxprobe.com.

安全的加密傳輸

前文反覆提及,域名解析服務是網際網路基礎設施中重要的一環,幾乎所有的網路應用都依賴於DNS才能正常執行。如果DNS服務發生故障,那麼即便Web網站或電子郵件系統服務等都正常執行,使用者也無法找到並使用它們了。

接下來的實驗依然使用了表13-2中的兩臺伺服器。

書接上回。前面在從伺服器上配妥bind服務程式並重啟後,即可看到從主伺服器中獲取到的資料配置檔案。

[root@linuxprobe ~]# ls -al /var/named/slaves/
total 12
drwxrwx---. 2 named named 54 Jun 7 16:02 .
drwxr-x---. 6 root named 4096 Jun 7 15:58 ..
-rw-r--r--. 1 named named 432 Jun 7 16:02 192.168.10.arpa
-rw-r--r--. 1 named named 439 Jun 7 16:02 linuxprobe.com.zone
[root@linuxprobe ~]# rm -rf /var/named/slaves/*

第1步:在主伺服器中生成金鑰。dnssec-keygen命令用於生成安全的DNS服務金鑰,其格式為“dnssec-keygen [引數]”,常用的引數以及作用如表13-3所示。

表13-3 dnssec-keygen命令的常用引數

部署快取伺服器

第1步:配置系統的雙網絡卡引數。前面講到,快取伺服器一般用於企業內網,旨在降低內網使用者查詢DNS的時間消耗。因此,為了更加貼近真實的網路環境,實現外網查詢功能,我們需要在快取伺服器中再新增一塊網絡卡,並按照表13-4所示的資訊來配置出兩臺Linux虛擬機器系統。而且,還需要在虛擬機器軟體中將新新增的網絡卡設定為“橋接模式”,然後設定成與物理裝置相同的網路引數(此處需要大家按照物理裝置真實的網路引數來配置,圖13-6所示為以DHCP方式獲取IP地址與閘道器等資訊,重啟網路服務後的效果如圖13-7所示)。

表13-4 用於配置Linux虛擬機器系統所需的引數資訊

第2步:在bind服務程式的主配置檔案中新增快取轉發引數。在大約第17行處新增一行引數“forwarders {上級DNS伺服器地址; };”,上級DNS伺服器地址指的是獲取資料配置檔案的伺服器。考慮到查詢速度、穩定性、安全性等因素,劉遄老師在這裡使用的是北京市公共DNS伺服器的地址210.73.64.1。如果大家也使用該地址,請先測試是否可以ping通,以免導致DNS域名解析失敗。

[root@linuxprobe ~]# vim /etc/named.conf
1 //
2 // named.conf
3 //
4 // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
5 // server as a caching only nameserver (as a localhost DNS resolver only).
6 //
7 // See /usr/share/doc/bind*/sample/ for example named configuration files.
8 //
9 options {
10 listen-on port 53 { any; };
11 listen-on-v6 port 53 { ::1; };
12 directory "/var/named";
13 dump-file "/var/named/data/cache_dump.db";
14 statistics-file "/var/named/data/named_stats.txt";
15 memstatistics-file "/var/named/data/named_mem_stats.txt";
16 allow-query { any; };
17 forwarders { 210.73.64.1; };
………………省略部分輸出資訊………………
[root@linuxprobe ~]# systemctl restart named

第3步:重啟DNS服務,驗證成果。把客戶端主機的DNS伺服器地址引數修改為DNS快取伺服器的IP地址192.168.10.10,如圖13-8所示。
這樣即可讓客戶端使用本地DNS快取伺服器提供的域名查詢解析服務。

在將客戶端主機的網路引數設定妥當後重啟網路服務,即可使用nslookup命令來驗證實驗結果(如果解析失敗,請讀者留意是否是上級DNS伺服器選擇的問題)。其中,Server引數為域名解析記錄提供的伺服器地址,因此可見是由本地DNS快取伺服器提供的解析內容。

分離解析技術

我們可以按照表13-5所示,分別為處於北京的DNS伺服器和處於美國的DNS伺服器分配不同的IP地址,然後讓國內讀者在訪問時自動匹配到北京的伺服器,而讓海外讀者自動匹配到美國的伺服器,如圖13-9所示。

表13-5 不同主機的作業系統與IP地址情況

為了解決海外讀者訪問https://www.linuxprobe.com時的速度問題,劉遄老師已經在美國機房購買並架設好了相應的網站伺服器,接下來需要手動部署DNS伺服器並實現分離解析功能,以便讓不同地理區域的讀者在訪問相同的域名時,能解析出不同的IP地址。

建議大家將虛擬機器還原到初始狀態,並重新安裝bind服務程式,以免多個實驗之間相互產生衝突。


第1步:修改bind服務程式的主配置檔案,把第11行的監聽埠與第17行的允許查詢主機修改為any。
由於配置的DNS分離解析功能與DNS根伺服器配置引數有衝突,所以需要把第51~54行的根域資訊刪除。
[root@linuxprobe ~]# vim /etc/named.conf
………………省略部分輸出資訊………………
 44 logging {
 45 channel default_debug {
 46 file "data/named.run";
 47 severity dynamic;
 48 };
 49 };
 50 
 51 zone "." IN {
 52 type hint;
 53 file "named.ca";
 54 };
 55 
 56 include "/etc/named.rfc1912.zones";
 57 include "/etc/named.root.key";
 58
………………省略部分輸出資訊………………

第2步:編輯區域配置檔案。把區域配置檔案中原有的資料清空,然後按照以下格式寫入引數。首先使用acl引數分別定義兩個變數名稱(china與american),
當下面需要匹配IP地址時只需寫入變數名稱即可,這樣不僅容易閱讀識別,而且也利於修改維護。這裡的難點是理解view引數的作用。它的作用是通過判斷使用者的IP地址是中國的還是美國的,
然後去分別載入不同的資料配置檔案(linuxprobe.com.china或linuxprobe.com.american)。這樣,當把相應的IP地址分別寫入到資料配置檔案後,即可實現DNS的分離解析功能。
這樣一來,當中國的使用者訪問linuxprobe.com域名時,便會按照linuxprobe.com.china資料配置檔案內的IP地址找到對應的伺服器。
[root@linuxprobe ~]# vim /etc/named.rfc1912.zones
1 acl "china" { 122.71.115.0/24; };
2 acl "american" { 106.185.25.0/24;};
3 view "china"{
4 match-clients { "china"; };
5 zone "linuxprobe.com" {
6 type master;
7 file "linuxprobe.com.china";
8 };
9 };
10 view "american" {
11 match-clients { "american"; };
12 zone "linuxprobe.com" {
13 type master;
14 file "linuxprobe.com.american";
15 };
16 };

第3步:建立資料配置檔案。分別通過模板檔案創建出兩份不同名稱的區域資料檔案,其名稱應與上面區域配置檔案中的引數相對應。

[root@linuxprobe ~]# cd /var/named
[root@linuxprobe named]# cp -a named.localhost linuxprobe.com.china
[root@linuxprobe named]# cp -a named.localhost linuxprobe.com.american
[root@linuxprobe named]# vim linuxprobe.com.china

[root@linuxprobe named]# vim linuxprobe.com.american

第4步:重新啟動named服務程式,驗證結果。將客戶端主機(Windows系統或Linux系統均可)的IP地址分別設定為122.71.115.1與106.185.25.1,將DNS地址分別設定為伺服器主機的兩個IP地址。這樣,當嘗試使用nslookup命令解析域名時就能清晰地看到解析結果,分別如圖13-10與圖13-11所示。


2020-11-15 20:03:14