轉載:https://www.linuxprobe.com/chapter-13.html
章節簡述:
本章講解了DNS域名解析服務的原理以及作用,介紹了域名查詢功能中正向解析與反向解析的作用,并通過實驗的方式演示了如何在DNS主服務器上部署正、反解析工作模式,以便讓大家深刻體會到DNS域名查詢的便利以及強大。
本章還介紹了如何部署DNS從服務器以及DNS緩存服務器來提升用戶的域名查詢體驗,以及如何使用chroot牢籠機制插件來保障bind服務程序的可靠性,并向大家演示如何在主服務器與從服務器之間部署TSIG密鑰加密功能,來進一步保障迭代查詢中數據的安全性。最后,本章還從實戰層面講解了DNS分離解析技術,讓來自不同國家、不同地區的用戶都能獲得最優的網站訪問體驗。
相信大家在學完本章內容之后,一定會對bind服務程序有更深入的了解和認識,并能深刻地體會到作為互聯網基礎設施中重要一環的DNS域名解析服務,在互聯網中所承擔的重要角色和發揮的重要作用。
13.1 DNS域名解析服務
相較于由數字構成的IP地址,域名更容易被理解和記憶,所以我們通常更習慣通過域名的方式來訪問網絡中的資源。但是,網絡中的計算機之間只能基于IP地址來相互識別對方的身份,而且要想在互聯網中傳輸數據,也必須基于外網的IP地址來完成。
為了降低用戶訪問網絡資源的門檻,DNS(Domain Name System,域名系統)技術應運而生。這是一項用于管理和解析域名與IP地址對應關系的技術,簡單來說,就是能夠接受用戶輸入的域名或IP地址,然后自動查找與之匹配(或者說具有映射關系)的IP地址或域名,即將域名解析為IP地址(正向解析),或將IP地址解析為域名(反向解析)。這樣一來,我們只需要在瀏覽器中輸入域名就能打開想要訪問的網站了。DNS域名解析技術的正向解析也是我們最常使用的一種工作模式。
鑒于互聯網中的域名和IP地址對應關系數據庫太過龐大,DNS域名解析服務采用了類似目錄樹的層次結構來記錄域名與IP地址之間的對應關系,從而形成了一個分布式的數據庫系統,如圖13-1所示。
圖13-1 DNS域名解析服務采用的目錄樹層次結構
域名后綴一般分為國際域名和國內域名。原則上來講,域名后綴都有嚴格的定義,但在實際使用時可以不必嚴格遵守。目前最常見的域名后綴有.com(商業組織)、.org(非營利組織)、.gov(政府部門)、.net(網絡服務商)、.edu(教研機構)、.pub(公共大眾)、.cn(中國國家頂級域名)等。
當今世界的信息化程度越來越高,大數據、云計算、物聯網、人工智能等新技術不斷涌現,全球網民的數量據說也超過了35億,而且每年還在以10%的速度迅速增長。這些因素導致互聯網中的域名數量進一步激增,被訪問的頻率也進一步加大。假設全球網民每人每天只訪問一個網站域名,而且只訪問一次,也會產生35億次的查詢請求,如此龐大的請求數量肯定無法被某一臺服務器全部處理掉。DNS技術作為互聯網基礎設施中重要的一環,為了為網民提供不間斷、穩定且快速的域名查詢服務,保證互聯網的正常運轉,提供了下面三種類型的服務器。
主服務器:在特定區域內具有唯一性,負責維護該區域內的域名與IP地址之間的對應關系。
從服務器:從主服務器中獲得域名與IP地址的對應關系并進行維護,以防主服務器宕機等情況。
緩存服務器:通過向其他域名解析服務器查詢獲得域名與IP地址的對應關系,并將經常查詢的域名信息保存到服務器本地,以此來提高重復查詢時的效率。
簡單來說,主服務器是用于管理域名和IP地址對應關系的真正服務器,從服務器幫助主服務器“打下手”,分散部署在各個國家、省市或地區,以便讓用戶就近查詢域名,從而減輕主服務器的負載壓力。緩存服務器不太常用,一般部署在企業內網的網關位置,用于加速用戶的域名查詢請求。
DNS域名解析服務采用分布式的數據結構來存放海量的“區域數據”信息,在執行用戶發起的域名查詢請求時,具有遞歸查詢和迭代查詢兩種方式。所謂遞歸查詢,是指DNS服務器在收到用戶發起的請求時,必須向用戶返回一個準確的查詢結果。如果DNS服務器本地沒有存儲與之對應的信息,則該服務器需要詢問其他服務器,并將返回的查詢結果提交給用戶。而迭代查詢則是指,DNS服務器在收到用戶發起的請求時,并不直接回復查詢結果,而是告訴另一臺DNS服務器的地址,用戶再向這臺DNS服務器提交請求,這樣依次反復,直到返回查詢結果。
由此可見,當用戶向就近的一臺DNS服務器發起對某個域名的查詢請求之后(這里以www.linuxprobe.com為例),其查詢流程大致如圖13-2所示。
圖13-2 向DNS服務器發起域名查詢請求的流程
當用戶向網絡指定的DNS服務器發起一個域名請求時,通常情況下會有本地由此DNS服務器向上級的DNS服務器發送迭代查詢請求;如果該DNS服務器沒有要查詢的信息,則會進一步向上級DNS服務器發送迭代查詢請求,直到獲得準確的查詢結果為止。其中最高級、最權威的根DNS服務器總共有13臺,分布在世界各地,其管理單位、具體的地理位置,以及IP地址如表13-1所示。
表13-1 13臺根DNS服務器的具體信息
名稱 | 管理單位 | 地理位置 | IP地址 |
---|---|---|---|
A | INTERNIC.NET | 美國-弗吉尼亞州 | 198.41.0.4 |
B | 美國信息科學研究所 | 美國-加利弗尼亞州 | 128.9.0.107 |
C | PSINet公司 | 美國-弗吉尼亞州 | 192.33.4.12 |
D | 馬里蘭大學 | 美國-馬里蘭州 | 128.8.10.90 |
E | 美國航空航天管理局 | 美國加利弗尼亞州 | 192.203.230.10 |
F | 因特網軟件聯盟 | 美國加利弗尼亞州 | 192.5.5.241 |
G | 美國國防部網絡信息中心 | 美國弗吉尼亞州 | 192.112.36.4 |
H | 美國陸軍研究所 | 美國-馬里蘭州 | 128.63.2.53 |
I | Autonomica公司 | 瑞典-斯德哥爾摩 | 192.36.148.17 |
J | VeriSign公司 | 美國-弗吉尼亞州 | 192.58.128.30 |
K | RIPE NCC | 英國-倫敦 | 193.0.14.129 |
L | IANA | 美國-弗吉尼亞州 | 199.7.83.42 |
M | WIDE Project | 日本-東京 | 202.12.27.33 |
13.2 安裝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";
58
如前所述,bind服務程序的區域配置文件(/etc/named.rfc1912.zones)用來保存域名和IP地址對應關系的所在位置。在這個文件中,定義了域名與IP地址解析規則保存的文件位置以及服務類型等內容,而沒有包含具體的域名、IP地址對應關系等信息。服務類型有三種,分別為hint(根區域)、master(主區域)、slave(輔助區域),其中常用的master和slave指的就是主服務器和從服務器。將域名解析為IP地址的正向解析參數和將IP地址解析為域名的反向解析參數分別如圖13-3和圖13-4所示。
圖13-3 正向解析參數
圖13-4 反向解析參數
下面的實驗中會分別修改bind服務程序的主配置文件、區域配置文件與數據配置文件。如果在實驗中遇到了bind服務程序啟動失敗的情況,而您認為這是由于參數寫錯而導致的,則可以執行named-checkconf命令和named-checkzone命令,分別檢查主配置文件與數據配置文件中語法或參數的錯誤。
13.2.1 正向解析實驗
在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
$TTL 1D | #生存周期為1天 | ||||
---|---|---|---|---|---|
@ | IN SOA | linuxprobe.com. | root.linuxprobe.com. | ( | |
#授權信息開始: | #DNS區域的地址 | #域名管理員的郵箱(不要用@符號) | |||
0;serial | #更新序列號 | ||||
1D;refresh | #更新時間 | ||||
1H;retry | #重試延時 | ||||
1W;expire | #失效時間 | ||||
3H;)minimum | #無效解析記錄的緩存時間 | ||||
NS | ns.linuxprobe.com. | #域名服務器記錄 | |||
ns | IN A | 192.168.10.10 | #地址記錄(ns.linuxprobe.com.) | ||
IN MX 10 | mail.linuxprobe.com. | #郵箱交換記錄 | |||
IN A | 192.168.10.10 | #地址記錄(mail.linuxprobe.com.) | |||
www | IN A | 192.168.10.10 | #地址記錄(www.linuxprobe.com.) | ||
bbs | IN A | 192.168.10.20 | #地址記錄(bbs.linuxprobe.com.) |
第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
13.2.2 反向解析實驗
在DNS域名解析服務中,反向解析的作用是將用戶提交的IP地址解析為對應的域名信息,它一般用于對某個IP地址上綁定的所有域名進行整體屏蔽,屏蔽由某些域名發送的垃圾郵件。它也可以針對某個IP地址進行反向解析,大致判斷出有多少個網站運行在上面。當購買虛擬主機時,可以使用這一功能驗證虛擬主機提供商是否有嚴重的超售問題。
第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所示。
圖13-5 反向解析文件中IP地址參數規范
[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
$TTL 1D | ||||
---|---|---|---|---|
@ | IN SOA | linuxprobe.com. | root.linuxprobe.com. | ( |
0;serial | ||||
1D;refresh | ||||
1H;retry | ||||
1W;expire | ||||
3H);minimum | ||||
NS | ns.linuxprobe.com. | |||
ns | A | 192.168.10.10 | ||
10 | PTR | ns.linuxprobe.com. | #PTR為指針記錄,僅用于反向解析中。 | |
10 | PTR | mail.linuxprobe.com. | ||
10 | PTR | www.linuxprobe.com. | ||
20 | PTR | bbs.linuxprobe.com. |
第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.
13.3 部署從服務器
作為重要的互聯網基礎設施服務,保證DNS域名解析服務的正常運轉至關重要,只有這樣才能提供穩定、快速且不間斷的域名查詢服務。在DNS域名解析服務中,從服務器可以從主服務器上獲取指定的區域數據文件,從而起到備份解析記錄與負載均衡的作用,因此通過部署從服務器可以減輕主服務器的負載壓力,還可以提升用戶的查詢效率。
在本實驗中,主服務器與從服務器分別使用的操作系統和IP地址如表13-2所示。
表13-2 主服務器與從服務器分別使用的操作系統與IP地址信息
主機名稱 | 操作系統 | IP地址 |
---|---|---|
主服務器 | RHEL 7 | 192.168.10.10 |
從服務器 | RHEL 7 | 192.168.10.20 |
第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.
13.4 安全的加密傳輸
前文反復提及,域名解析服務是互聯網基礎設施中重要的一環,幾乎所有的網絡應用都依賴于DNS才能正常運行。如果DNS服務發生故障,那么即便Web網站或電子郵件系統服務等都正常運行,用戶也無法找到并使用它們了。
互聯網中的絕大多數DNS服務器(超過95%)都是基于BIND域名解析服務搭建的,而bind服務程序為了提供安全的解析服務,已經對TSIG(RFC 2845)加密機制提供了支持。TSIG主要是利用了密碼編碼的方式來保護區域信息的傳輸(Zone Transfer),即TSIG加密機制保證了DNS服務器之間傳輸域名區域信息的安全性。
接下來的實驗依然使用了表13-2中的兩臺服務器。
書接上回。前面在從服務器上配妥bind服務程序并重啟后,即可看到從主服務器中獲取到的數據配置文件。
主機名稱 | 操作系統 | IP地址 |
---|---|---|
主服務器 | RHEL 7 | 192.168.10.10 |
從服務器 | RHEL 7 | 192.168.10.20 |
[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命令的常用參數
參數 | 作用 |
---|---|
-a | 指定加密算法,包括RSAMD5(RSA)、RSASHA1、DSA、NSEC3RSASHA1、NSEC3DSA等 |
-b | 密鑰長度(HMAC-MD5的密鑰長度在1~512位之間) |
-n | 密鑰的類型(HOST表示與主機相關) |
使用下述命令生成一個主機名稱為master-slave的128位HMAC-MD5算法的密鑰文件。在執行該命令后默認會在當前目錄中生成公鑰和私鑰文件,我們需要把私鑰文件中Key參數后面的值記錄下來,一會兒要將其寫入傳輸配置文件中。
[root@linuxprobe ~]# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST master-slave
Kmaster-slave.+157+46845
[root@linuxprobe ~]# ls -al Kmaster-slave.+157+46845.*
-rw-------. 1 root root 56 Jun 7 16:06 Kmaster-slave.+157+46845.key
-rw-------. 1 root root 165 Jun 7 16:06 Kmaster-slave.+157+46845.private
[root@linuxprobe ~]# cat Kmaster-slave.+157+46845.private
Private-key-format: v1.3
Algorithm: 157 (HMAC_MD5)
**Key: 1XEEL3tG5DNLOw+1WHfE3Q==**
Bits: AAA=
Created: 20170607080621
Publish: 20170607080621
Activate: 20170607080621
第2步:在主服務器中創建密鑰驗證文件。進入bind服務程序用于保存配置文件的目錄,把剛剛生成的密鑰名稱、加密算法和私鑰加密字符串按照下面格式寫入到tansfer.key傳輸配置文件中。為了安全起見,我們需要將文件的所屬組修改成named,并將文件權限設置得要小一點,然后把該文件做一個硬鏈接到/etc目錄中。
[root@linuxprobe ~]# cd /var/named/chroot/etc/
[root@linuxprobe etc]# vim transfer.key
key "master-slave" {
algorithm hmac-md5;
secret "1XEEL3tG5DNLOw+1WHfE3Q==";
};
[root@linuxprobe etc]# chown root:named transfer.key
[root@linuxprobe etc]# chmod 640 transfer.key
[root@linuxprobe etc]# ln transfer.key /etc/transfer.key
第3步:開啟并加載Bind服務的密鑰驗證功能。首先需要在主服務器的主配置文件中加載密鑰驗證文件,然后進行設置,使得只允許帶有master-slave密鑰認證的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 **include "/etc/transfer.key";**
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 **allow-transfer { key master-slave; };**
………………省略部分輸出信息………………
[root@linuxprobe ~]# systemctl restart named
至此,DNS主服務器的TSIG密鑰加密傳輸功能就已經配置完成。此時清空DNS從服務器同步目錄中所有的數據配置文件,然后再次重啟bind服務程序,這時就已經不能像剛才那樣自動獲取到數據配置文件了。
[root@linuxprobe ~]# rm -rf /var/named/slaves/*
[root@linuxprobe ~]# systemctl restart named
[root@linuxprobe ~]# ls /var/named/slaves/
第4步:配置從服務器,使其支持密鑰驗證。配置DNS從服務器和主服務器的方法大致相同,都需要在bind服務程序的配置文件目錄中創建密鑰認證文件,并設置相應的權限,然后把該文件做一個硬鏈接到/etc目錄中。
[root@linuxprobe ~]# cd /var/named/chroot/etc
[root@linuxprobe etc]# vim transfer.key
key "master-slave" {
algorithm hmac-md5;
secret "1XEEL3tG5DNLOw+1WHfE3Q==";
};
[root@linuxprobe etc]# chown root:named transfer.key
[root@linuxprobe etc]# chmod 640 transfer.key
[root@linuxprobe etc]# ln transfer.key /etc/transfer.key
第5步:開啟并加載從服務器的密鑰驗證功能。這一步的操作步驟也同樣是在主配置文件中加載密鑰認證文件,然后按照指定格式寫上主服務器的IP地址和密鑰名稱。注意,密鑰名稱等參數位置不要太靠前,大約在第43行比較合適,否則bind服務程序會因為沒有加載完預設參數而報錯:
[root@linuxprobe etc]# 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 **include "/etc/transfer.key";**
10 options {
11 listen-on port 53 { 127.0.0.1; };
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 { localhost; };
18
19 /*
20 - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
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 enable 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 **server 192.168.10.10**
44 **{**
45 **keys { master-slave; };**
46 **};**
47 logging {
48 channel default_debug {
49 file "data/named.run";
50 severity dynamic;
51 };
52 };
53
54 zone "." IN {
55 type hint;
56 file "named.ca";
57 };
58
59 include "/etc/named.rfc1912.zones";
60 include "/etc/named.root.key";
61
第6步:DNS從服務器同步域名區域數據。現在,兩臺服務器的bind服務程序都已經配置妥當,并匹配到了相同的密鑰認證文件。接下來在從服務器上重啟bind服務程序,可以發現又能順利地同步到數據配置文件了。
[root@linuxprobe ~]# systemctl restart named
[root@linuxprobe ~]# ls /var/named/slaves/
192.168.10.arpa linuxprobe.com.zone
13.5 部署緩存服務器
DNS緩存服務器(Caching DNS Server)是一種不負責域名數據維護的DNS服務器。簡單來說,緩存服務器就是把用戶經常使用到的域名與IP地址的解析記錄保存在主機本地,從而提升下次解析的效率。DNS緩存服務器一般用于經常訪問某些固定站點而且對這些網站的訪問速度有較高要求的企業內網中,但實際的應用并不廣泛。而且,緩存服務器是否可以成功解析還與指定的上級DNS服務器的允許策略有關,因此當前僅需了解即可。
第1步:配置系統的雙網卡參數。前面講到,緩存服務器一般用于企業內網,旨在降低內網用戶查詢DNS的時間消耗。因此,為了更加貼近真實的網絡環境,實現外網查詢功能,我們需要在緩存服務器中再添加一塊網卡,并按照表13-4所示的信息來配置出兩臺Linux虛擬機系統。而且,還需要在虛擬機軟件中將新添加的網卡設置為“橋接模式”,然后設置成與物理設備相同的網絡參數(此處需要大家按照物理設備真實的網絡參數來配置,圖13-6所示為以DHCP方式獲取IP地址與網關等信息,重啟網絡服務后的效果如圖13-7所示)。
表13-4 用于配置Linux虛擬機系統所需的參數信息
主機名稱 | 操作系統 | IP地址 |
---|---|---|
緩存服務器 | RHEL 7 | 網卡(外網):根據物理設備的網絡參數進行配置(通過DHCP或手動方式指定IP地址與網關等信息) |
網卡(內網):192.168.10.10 | ||
客戶端 | RHEL 7 | 192.168.10.20 |
圖13-6 以DHCP方式獲取網絡參數
圖13-7 查看網卡的工作狀態
第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緩存服務器提供的域名查詢解析服務。
圖13-8 設置客戶端主機的DNS服務器地址參數
在將客戶端主機的網絡參數設置妥當后重啟網絡服務,即可使用nslookup命令來驗證實驗結果(如果解析失敗,請讀者留意是否是上級DNS服務器選擇的問題)。其中,Server參數為域名解析記錄提供的服務器地址,因此可見是由本地DNS緩存服務器提供的解析內容。
[root@linuxprobe ~]# nslookup
> **www.linuxprobe.com**
Server: 192.168.10.10
Address: 192.168.10.10#53
Non-authoritative answer:
Name: www.linuxprobe.com
Address: 113.207.76.73
Name: www.linuxprobe.com
Address: 116.211.121.154
> **8.8.8.8**
Server: 192.168.10.10
Address: 192.168.10.10#53
Non-authoritative answer:
8.8.8.8.in-addr.arpa name = google-public-dns-a.google.com.
Authoritative answers can be found from:
in-addr.arpa nameserver = f.in-addr-servers.arpa.
in-addr.arpa nameserver = b.in-addr-servers.arpa.
in-addr.arpa nameserver = a.in-addr-servers.arpa.
in-addr.arpa nameserver = e.in-addr-servers.arpa.
in-addr.arpa nameserver = d.in-addr-servers.arpa.
in-addr.arpa nameserver = c.in-addr-servers.arpa.
a.in-addr-servers.arpa internet address = 199.212.0.73
a.in-addr-servers.arpa has AAAA address 2001:500:13::73
b.in-addr-servers.arpa internet address = 199.253.183.183
b.in-addr-servers.arpa has AAAA address 2001:500:87::87
c.in-addr-servers.arpa internet address = 196.216.169.10
c.in-addr-servers.arpa has AAAA address 2001:43f8:110::10
d.in-addr-servers.arpa internet address = 200.10.60.53
d.in-addr-servers.arpa has AAAA address 2001:13c7:7010::53
e.in-addr-servers.arpa internet address = 203.119.86.101
e.in-addr-servers.arpa has AAAA address 2001:dd8:6::101
f.in-addr-servers.arpa internet address = 193.0.9.1
f.in-addr-servers.arpa has AAAA address 2001:67c:e0::1
13.6 分離解析技術
現在,喜歡看我們這本《Linux就該這么學》的海外讀者越來越多,如果繼續把本書配套的網站服務器(https://www.linuxprobe.com)架設在北京市的機房內,則海外讀者的訪問速度勢必會很慢。可如果把服務器架設在美國那邊的機房,也將增大國內讀者的訪問難度。
為了滿足海內外讀者的需求,外加劉遄老師不差錢,于是可以購買多臺服務器并分別部署在全球各地,然后再使用DNS服務的分離解析功能,即可讓位于不同地理范圍內的讀者通過訪問相同的網址,而從不同的服務器獲取到相同的數據。例如,我們可以按照表13-5所示,分別為處于北京的DNS服務器和處于美國的DNS服務器分配不同的IP地址,然后讓國內讀者在訪問時自動匹配到北京的服務器,而讓海外讀者自動匹配到美國的服務器,如圖13-9所示。
表13-5 不同主機的操作系統與IP地址情況
主機名稱 | 操作系統 | IP地址 |
---|---|---|
DNS服務器 | RHEL 7 | 北京網絡:122.71.115.10 |
美國網絡:106.185.25.10 | ||
北京用戶 | Windows 7 | 122.71.115.1 |
海外用戶 | Windows 7 | 106.185.25.1 |
圖13-9 DNS分離解析技術
為了解決海外讀者訪問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
$TTL 1D | #生存周期為1天 | ||||
---|---|---|---|---|---|
@ | IN SOA | linuxprobe.com. | root.linuxprobe.com. | ( | |
#授權信息開始: | #DNS區域的地址 | #域名管理員的郵箱(不要用@符號) | |||
0;serial | #更新序列號 | ||||
1D;refresh | #更新時間 | ||||
1H;retry | #重試延時 | ||||
1W;expire | #失效時間 | ||||
3H;)minimum | #無效解析記錄的緩存時間 | ||||
NS | ns.linuxprobe.com. | #域名服務器記錄 | |||
ns | IN A | 122.71.115.10 | #地址記錄(ns.linuxprobe.com.) | ||
www | IN A | 122.71.115.15 | #地址記錄(www.linuxprobe.com.) |
[root@linuxprobe named]# vim linuxprobe.com.american
$TTL 1D | #生存周期為1天 | ||||
---|---|---|---|---|---|
@ | IN SOA | linuxprobe.com. | root.linuxprobe.com. | ( | |
#授權信息開始: | #DNS區域的地址 | #域名管理員的郵箱(不要用@符號) | |||
0;serial | #更新序列號 | ||||
1D;refresh | #更新時間 | ||||
1H;retry | #重試延時 | ||||
1W;expire | #失效時間 | ||||
3H;)minimum | #無效解析記錄的緩存時間 | ||||
NS | ns.linuxprobe.com. | #域名服務器記錄 | |||
ns | IN A | 106.185.25.10 | #地址記錄(ns.linuxprobe.com.) | ||
www | IN A | 106.185.25.15 | #地址記錄(www.linuxprobe.com.) |
第4步:重新啟動named服務程序,驗證結果。將客戶端主機(Windows系統或Linux系統均可)的IP地址分別設置為122.71.115.1與106.185.25.1,將DNS地址分別設置為服務器主機的兩個IP地址。這樣,當嘗試使用nslookup命令解析域名時就能清晰地看到解析結果,分別如圖13-10與圖13-11所示。
圖13-10 模擬中國用戶的域名解析操作
圖13-11 模擬美國用戶的域名解析