一、DNS簡介
? ? DNS是Domain Name System(域名系統(tǒng))的簡稱,DNS可以為計算機、服務以及接入互聯(lián)網(wǎng)或局域網(wǎng)的任何資源提供分層的域名解析功能。DNS提供了很多功能,其中最主要的功能就是進行域名與IP之間的解析。在互聯(lián)網(wǎng)中標記唯一一臺計算機使用的是IP地址,通過合法的IP地址,我們可以與全世界任何一臺主機進行通信。然而在當今計算機如此普及的情況下,以人類現(xiàn)有的智慧與記憶力很難將大量的IP地址背誦下來,這時使用域名系統(tǒng)就可以將難以記憶的數(shù)字IP地址與容易記憶的域名建議映射關系,用戶通過輸入域名,計算機會尋找指定的DNS服務器,請求服務器幫助解析該域名對應的IP地址,成功解析后,將獲得該域名對應的真實IP地址,然后使用該IP地址與對方通信。
? ? 域名是分級的,一般分為:主機名.三級域名.二級域名.頂級域名.。注意,最后一個點代表的是根域,是所有域名的起點。域名有點像美國人的姓名一樣,姓在后,名在前,而計算機域名中最后的點則是根,其次是根下的頂級域名,然后是二級域名等。圖1為典型的域名樹狀結構圖。例如,百度的域名為www.baidu.com,代表的是根域下有com子域,com子域下面有baidu子域,baidu子域下有主機www。注意,一般情況下,我們通過瀏覽器輸入網(wǎng)址域名時,最后一個根域(.)是不需要輸入的。一般頂級域代表國家或者組織形式,如cn代表中國;com代表商業(yè)公司;edu代表教育機構等。二級域名代表組織或者公司名稱,三級域名代表組織或者公司內部的主機名稱。最后通過完全合格的域名(FQDN)可以定位全球唯一的一臺主機。這種分層管理機制的優(yōu)勢在于根域服務器不需要管理全世界所有的域名信息,它只需要管理頂級域信息即可,而頂級域服務器只需要管理二級域信息即可。以此類推,實現(xiàn)分層管理,這類似國家的行政管理機制。
圖1:

? ? 域名查詢分為遞歸查詢和迭代查詢,如圖2所示。舉例說明,如果客戶端準備訪問百度網(wǎng)站,客戶端首先會檢查本地緩存中是否有之前的查詢記錄,如果有,直接讀取結果即可,如果沒有相關的緩存記錄,則向本地DNS服務器發(fā)送查詢請求,也就是所謂的遞歸查詢,本地DNS服務器如果有答案,就會將答案直接返回給客戶端,但本地DNS服務器沒有正確的答案時,它就需要向根服務器查詢,但不是詢問www.baidu.com對應的IP是多少,根服務器僅管理頂級域名,而且所有的頂級域名都屬于根的管理范疇,所以此時本地DNS服務器向根查詢結果是:根服務器會將它管理的com域對應的IP提供給本地DNS服務器,本地DNS服務器得到com域服務器的IP后,會再向com查詢,然而com也沒有最終的答案,com域服務器會將它所管理的baidu域服務器對應的IP提供給本地DNS服務器,最后本地DNS服務器再向baidu域服務器查詢,詢問該域下主機名為www的計算機對應的IP地址,由于www主機確實直接屬于baidu域的管理范疇,所以baidu會將最終的正確答案返回給本地DNS服務器,最后本地DNS服務器將得到的結果返回給客戶端,同時本地DNS服務器會將結果緩存起來,當下次再有相同的查詢請求時,本地DNS服務器就可以直接從緩存中找到結果返回給客戶端。
圖2:

二、安裝DNS軟件
? ? 提供DNS服務的軟件有很多,而伯克利加州大學研發(fā)的BIND(Berkeley Internet Name Domain)是目前應用最廣泛的DNS服務系統(tǒng)。該項目軟件除了BIND主程序外,在Linux平臺下還提供了chroot和utils軟件包,bind-chroot軟件包的主要功能是使BIND軟件可以運行在chroot模式下,這樣BIND運行在相對路徑的根路徑,而不是Linux系統(tǒng)真正的根路徑,即使有人對BIND軟件進行攻擊與破壞,影響的也僅僅是操作系統(tǒng)中的一個子目錄,不會影響整個操作系統(tǒng)平臺,以此來提升系統(tǒng)安全性。通過yum安裝bind-chroot后,對bind而言,/var/named/chroot目錄就是根路徑,所有BIND軟件的配置文件都在根下的某某路徑下。bind-utils軟件提供了一些DNS查詢工具,如dig、host、nslookup等。
yum -y install bind bind-chroot?bind-utils
三、配置文件說明
? ? BIND配置文件主要分為主配置文件與域數(shù)據(jù)記錄文件,主配置文件包括很多使用花括號引起來的定義語句,在定義語句中可以設置多個選項,主配置文件的核心功能就是定義域,以及告之計算機到哪里可以找到相應域的數(shù)據(jù)記錄文件。而域數(shù)據(jù)記錄文件則存儲具體的域名與IP之間的解析記錄,DNS通過讀取域數(shù)據(jù)記錄文件來解答客戶端的查詢請求。
? ? 主配置文件一般為/etc/named.conf文件,但當我們安裝了bind-chroot軟件包后,在后面的內容中提供到的一些路徑默認指的是一個虛擬路徑,都是相對于虛擬根路徑而言的,虛擬根路徑默認為/var/named/chroot目錄。如果主配置文件是/etc/named.conf,那么最終主配置文件在本機的絕對路徑應該為/var/named/chroot/named.conf,修改主配置文件時一定要注意,如果語法格式有問題,則DNS服務是無法正常啟動的,一個典型的主配置文件語法格式如下。
statement_name {
option1;
option2;
... ...;
};
? ?? 下面介紹/etc/named.conf文件中常用的定義語句。
? ? acl(Access Control List)語句允許我們預定義一組主機,從而控制是允許還是拒絕他人訪問域名服務器,BIND預定義了一些主機訪問控制列表,其中,any可以匹配任意IP地址,localhost可以匹配本地系統(tǒng)上所有的IP地址,localnets匹配本地系統(tǒng)所連接的任意網(wǎng)絡,none將不匹配任何IP地址。下面通過實例自定義了兩個訪問控制列表,一個名為黑名單,一個為白名單。
acl black {
172.16.0.0/16;
192.168.0.12;
192.168.0.18;
};
acl white {
10.0.0.0/8;
192.168.0.0/24;
};
options {
allow-query { white; };
blackhole { black; };
};
? ? options語句用來定義全局配置選項,在全局配置中至少需要定義一個工作路徑,默認的工作路徑為/var/named/,具體的常見的參數(shù)為表1 。
表1:

? ? zone語句用來定義域及相關選項,定義域也就意味著你希望維護自己公司的域名解析。該語句的重點選項有type與file,表2為zone語句內常用的選項及描述。
表2:

? ? 下面一個簡單的zone語句實例,example.com是定義的域,type定義本機為example.com域的主域名服務器,該域的解析文件保存在example.com.zone文件中,該文件被保存在/var/named/目錄下。當定義反向解析域時,需要將網(wǎng)絡地址反過來輸入,并以固定的.in-addr.arpa格式結尾。通過定義類型為hint的根域,這樣當客戶端查詢不屬于自己維護的域名時,可以尋找根服務器進行迭代查詢,最終返回正確的結果,全球的根域名服務器信息保存在named.ca文件中,該文件是在安裝BIND文件后自動生成的模板文件,我們可以在/usr/share/doc/bind-9.8.2/sample/var/named/目錄下找到它。
? ? 在BIND軟件的主配置文件中,如果定義了zone語句,還需要額外創(chuàng)建域數(shù)據(jù)文件,默認域數(shù)據(jù)文件被存儲在/var/named/目錄下,文件名稱由zone語句中的file選項定義。數(shù)據(jù)文件分為正向解析數(shù)據(jù)文件和反向解析數(shù)據(jù)文件,正向解析數(shù)據(jù)文件保存了域名到IP地址的映射記錄,反向解析數(shù)據(jù)文件保存了IP地址到域名的映射記錄,表3列出了常用的記錄類型及描述。
表3:

? ? 下面通過一個簡短的正向解析的域數(shù)據(jù)文件,說明各種記錄的語法格式,配置文件中的TTL的值為DNS記錄的緩存時間,這個值是其他域名服務器將數(shù)據(jù)存放在緩存中的時間,1D代表一天。SOA記錄后面的root.example.com.代表域的權威服務器,chytest1.163.com是管理員的郵箱,由于@在數(shù)據(jù)文件中代表特殊含義,這里使用.來代表@符號,所以實際的郵箱應該是chytest1@163.com,SOA記錄可以跨行輸入,跨越多行時使用括號引用。NS記錄代表域名服務器記錄,如果公司有多個域名服務器,可以添加多條NS記錄,但每個NS記錄在下面都需要有對應的A記錄。A記錄為正向解析記錄,格式為在域名后面輸入相應的IP地址,IN代表Internet,A代表正向解析記錄。在使用MX記錄指定郵件服務器時,我們給mai.example.com.服務器設著優(yōu)先級為10,最后CNAME記錄為別名,可以使用web.example.com來代表www.example.com。具體的配置文件如下。

? ? 關于配置文件中的簡寫,在BIND主配置文件中,zone語句后定義的域對于數(shù)據(jù)文件的簡寫來說很重要,如果區(qū)數(shù)據(jù)文件中不以"."結尾的名稱后會被自動加上該域名稱,如zone語句定義了example.com,而數(shù)據(jù)文件中有一個mail沒有以"."結尾,那么系統(tǒng)會自動追加example.com到mail后,有時候管理員將A記錄錯誤地寫成www.example.com這種形式,由于沒有以"."結尾,實際系統(tǒng)識別的應該是www.example.com.example.com.。此外,在數(shù)據(jù)文件中使用@符號也同樣代表zone所定義的域名稱。最后,如果在數(shù)據(jù)文件中某條記錄名稱為空格或制表符,那么BIND系統(tǒng)會直接使用上一條記錄的名稱,當我們?yōu)橥粋€域名設置多個A記錄,則客戶端請求該域名解析時,服務器會以輪詢的方式將結果返回給客戶端,可以從一定程度上實現(xiàn)負載均衡的功能。
四、部署主域名服務器
? ? 隨著ABC公司業(yè)務的擴張,計算機I越來越多的情況下,讓員工記憶公司內部服務器所有的IP地址簡直就是一場噩夢,因此,公司決定采用DNS解決方案,這樣所有的員工僅需要記憶域名就可以訪問各種服務。案例中使用的域為abc.com域,這個是正向解析的域,網(wǎng)絡采用的是私有網(wǎng)絡地址為:172.16.0.0/16。本次案例僅對公司主要的服務器編寫解析記錄,如果讀者需要更多的記錄,可以按照這些模板添加其他主機的信息,在公司內部服務器列表見表4.
表4:

1.安裝軟件
? ? 如前所述,在部署DNS服務器時需要安裝bind、bind-chroot以及bind-utils軟件包。
2.修改主配置文件
? ? 默認chroot之后的虛擬根目錄/var/named/chroot/etc 下面并沒有現(xiàn)成的配置文件,需要在/usr/share/doc/bind-9.8.2/sample/etc目錄下找到配置文件模板,復制該文件至/var/named/chroot/etc目錄下,并根據(jù)自己的實際情況進行修改配置文件。案例中均以表4為模型進行配置。
cd /usr/share/doc/bind-9.8.2/sample/etc/
cp named.conf? /var/named/chroot/etc/
chown? root.named? /var/named/chroot/etc/named.conf
vim /var/named/chroot/etc/named.conf

3.創(chuàng)建區(qū)數(shù)據(jù)文件
? ? 主配置文件僅是對zone域的定義,關于域內主機的具體記錄的解析,還需要依賴于數(shù)據(jù)文件的內容,常見的域名解析有正向解析記錄、反向解析記錄、CNAME記錄以及MX記錄等。在上一步完成了主配置文件中關于zone域的配置后,我們就根據(jù)模板創(chuàng)建具體的區(qū)數(shù)據(jù)解析文件,這些文件的創(chuàng)建可以根據(jù)軟件包中提供的named.localhost文件作為模板。下面我們將創(chuàng)建一個用于正向解析的abc.com.zone域數(shù)據(jù)文件,再創(chuàng)建一個用于進行反向解析的172.16.zone域數(shù)據(jù)文件。
cd /usr/share/doc/bind-9.8.2/sample/var/named
cp named.ca /var/named/chroot/var/named/
chown?root.named?/var/named/chroot/var/named/named.ca
cp?named.localhost?/var/named/chroot/var/named/abc.com.zone
chown?root.named?/var/named/chroot/var/named/abc.com.zone
vim /var/named/chroot/var/named/abc.com.zone
vim? /var/named/chroot/var/named/172.16.zone
4.服務管理
? ? 在dns主服務器部署完成后,如果不禁用防火墻或通過防火墻開啟特定的端口,客戶端主機是無法進行查詢工作的。下面我們就通過Linux自帶的防火墻iptables來演示如何開啟DNS服務所需要使用的53端口,其中,TCP的53端口用于主從復制,UDP的53端口用于數(shù)據(jù)查詢。?
iptables -I INPUT -p udp --dport 53 -j ACCEPT
iptables -I INPUT -p tcp --dport 53 -j ACCEPT
service iptables save
service named start
chkconfig named on
5.客戶端驗證
? ? 客戶端正確配置DNS服務器之后,查詢工具比較多,常用的有nslookup、dig、host,下面分別演示這些命令的基本用法。
nslookup www.abc.com
nslookup 176.16.0.100
dig abc.com? MX
host www.abc.com
五、部署從域名服務器
? ?部署從域名服務器的作用是防止出現(xiàn)單點故障或實現(xiàn)負載均衡。如果只有一臺服務器,當該服務器宕機時,將導致所有客戶機的地址解析出現(xiàn)問題。另外,為了滿足大規(guī)模的查詢請求,我們可以創(chuàng)建多臺DNS服務器實現(xiàn)負載均衡。然而如果所有的DNS都作為主服務器,會有大量的配置需要我們重復進行,再有就是當解析記錄發(fā)生改變后,各個服務器之間的區(qū)數(shù)據(jù)文件的版本比較混亂(不方便統(tǒng)一),所以我們需要部署從域名服務器,從域名服務器會從主域名服務器上下載數(shù)據(jù)文件,只要主服務器修改了數(shù)據(jù)文件中的記錄,從服務器就可以自動同步數(shù)據(jù)。
1.安裝軟件
? ? 如前所述,在部署DNS服務器時需要安裝bind、bind-chroot以及bind-utils軟件包。
2.修改配置文件
? ? 與主服務器一樣,我們需要復制模板配置文件,并修改named.conf配置文件與主服務器配置文件。有所不同的是,所有從服務器配置文件中除根域以外的所有zone域類型均為slave,依次聲明自己是從服務器,并使用masters語句指定與哪臺主服務器進行數(shù)據(jù)同步。
?cd /usr/share/doc/bind-9.8.2/sample/etc/
?cp named.conf? /var/named/chroot/etc/
?chown? root.named? /var/named/chroot/etc/named.conf
?vim /var/named/chroot/etc/named.conf
3.同步數(shù)據(jù)文件?
? ? 從服務器進行同步操作前,需要創(chuàng)建一個BIND軟件讀取操作的目錄,以便將主服務器的數(shù)據(jù)文件保存至該目錄。
? ? 在從服務器上,我們僅需要簡單設置以下BIND主配置即可,當從服務器的主配置文件修改完成后,通過啟動服務,BIND會自動根據(jù)配置文件中的masters語句尋找主域名服務器,并將主域名服務器上的數(shù)據(jù)文件下載至從服務器本地。完成第一次的數(shù)據(jù)同步后,從服務器會根據(jù)同步過來的數(shù)據(jù)文件中的SOA記錄選項,決定下次同步數(shù)據(jù)的時間,本次案例中主域名服務器的SOA記錄括號中有五個選項。
? ? 第一個選項10是序列號,從服務器會根據(jù)這個序列號來決定是否進行同步操作,只有當主服務器中數(shù)據(jù)文件的序列號大于從服務器中數(shù)據(jù)文件的序列號,從服務器才會真正與主服務器進行數(shù)據(jù)同步,該序列號建議使用時間格式,如20180610001,表示2018年6月10日的第一次修改(序列號只要數(shù)字即可,BIND不強制要求具體數(shù)字格式)。
? ? 第二個選項1D,代表從服務器多久與主服務器進行序列號的對比(僅在主服務器序列號大于從服務器的序列號時,才進行數(shù)據(jù)同步),D代表Day,這里為一天。
? ? 第三個選項1H,代表如果從服務器請求連接主服務器時,由于網(wǎng)絡延遲、主服務器故障等原因,暫時無法連接到主服務器,那么從服務器會每隔一個小時再試一次。
? ? 第四個選項1W,代表如果從服務器嘗試一周后還未能連接到主服務器,則不再進行連接。
? ? 第五個選項3H,代表的是緩存的時間為3個小時。
setsebool -P named_write_master_zones=1
mkdir -p /var/named/chroot/var/named/slaves/
chown root.named /var/named/chroot/var/named/slaves
chmod 775 /var/named/chroot/var/named/slaves
service named start
chkconfig named on
六、DNS視圖應用案例
? ? view語句用來創(chuàng)建視圖,視圖可以讓不同的網(wǎng)絡或主機在查詢同一個DNS記錄時得到不同的解析結果,也可以為不同的網(wǎng)絡或者主機創(chuàng)建不同的數(shù)據(jù)文件。大型企業(yè)可以利用視圖實現(xiàn)負載均衡,例如,當北京地區(qū)的網(wǎng)民訪問新浪網(wǎng)時,域名服務器可以將結果就解析為北京本地的新浪網(wǎng)服務器,上海地區(qū)的網(wǎng)民訪問新浪網(wǎng)時,域名服務器會將上海的新浪網(wǎng)服務器IP地址作為結果返還給用戶。這樣所有的人訪問新浪網(wǎng)頁查看新聞時,總是可以連接距離自己最近的服務器。
? ? 在BIND9版本中,如果沒有在主配置文件中使用view語句,則BIND會自動將所有的域定義一個大視圖。通過配置文件中使用view語句,并結合match-clients語句,實現(xiàn) 不同用戶查詢相同的記錄時所得到的結果不同。這樣做的最大好處是可以讓北京地區(qū)的網(wǎng)民訪問新浪網(wǎng)時連接的是北京當?shù)氐姆掌?,而上海地區(qū)的網(wǎng)民需要連接新浪網(wǎng)時,DNS解析 的結果為上海本地的新浪服務器。
? ? 一般我們會為同一個域創(chuàng)建多個視圖,不同的視圖對應不同的解析文件,此時需要注意的是,有多個視圖就需要創(chuàng)建多少個對應的數(shù)據(jù)解析文件。當客戶端發(fā)送查詢請求后,服務器根據(jù)視圖內的match-clients語句來匹配客戶端主機,匹配成功后,服務器讀取特定的視圖內file指定的數(shù)據(jù)文件,并將結果返回給客戶端,如果沒有匹配成功,則繼續(xù)查詢下一個視圖。如果所有的視圖都未能匹配成功,服務器將返回無相關數(shù)據(jù)記錄的信息給客戶端。下面的案例通過修改主域名服務器的主配置文件演示視圖的應用,當172.16.0.88請求abc.com域的相關解析記錄時,服務器會讀取abc.com.zone.develop這個數(shù)據(jù)解析文件,172.16.0.89請求abc.com域相關解析記錄時,服務器會讀取abc.com.zone.tech這個數(shù)據(jù)解析文件。注意,在此需要創(chuàng)建4個數(shù)據(jù)解析文件,相同域的正向域名解析文件有兩個,反向域名解析文件有兩個,只要在不同的數(shù)據(jù)解析文件中對相同的記錄給予不同的解析結果,就可實現(xiàn)不同的用戶得到不同的返回結果也不一樣。
? ? 只要根據(jù)自己的實際需要創(chuàng)建相應的數(shù)據(jù)文件,并在各個數(shù)據(jù)文件中對同一個數(shù)據(jù)記錄給出不同的解析數(shù)據(jù),即可實現(xiàn)智能DNS的分離解析功能。這里我們不可能將全北京或全上海的所有IP地址寫入match-clients,根據(jù)DNS解析原理我們知道,所有的終端用戶訪問網(wǎng)絡時都會連接到當?shù)豂SP服務商所提供的DNS服務器,這些服務商的DNS服務器會根據(jù)根服務器的提示迭代查詢到我們的權威服務器。也就是說,我們在match-clients后面僅需填寫全國主要的ISP所提供的DNS服務器IP地址即可。不同地區(qū)服務商的DNS,我們給予不同的解析結果,最終所有的終端用戶會間接獲得正確的解析結果。這里我們不再給出具體的數(shù)據(jù)文件記錄,讀者可以根據(jù)實際情況進行自行填寫數(shù)據(jù)記錄。
? ? 以下為主配置文件named.conf實現(xiàn)視圖應用的案例模板,讀者根據(jù)自己的實際需要進稍作修改即可。
vim /var/named/chroot/etc/named.conf
七、常見問題分析
1.由于BIND配置文件中,默認allow-query被設置為僅localhost可以進行DNS查詢,如果開放DNS服務,則需要將allow-query修改為特定的主機或任意主機可以查詢的DNS服務。
2.在主配置文件中,默認listen-on被設置為僅監(jiān)聽本地回環(huán)地址,這樣客戶端也是無法連接服務器進行查詢的。
3.客戶端連接服務器發(fā)送的查詢請求使用的是UDP的53端口,而從服務器與主服務器同步數(shù)據(jù)用的是TCP53端口,開放DNS服務后,要注意修改防火墻設置。
4.在Centos6系統(tǒng)環(huán)境下,從域名服務器與主域名服務器同步數(shù)據(jù)時,默認SELinux會拒絕從遠程下載的數(shù)據(jù)文件寫入本地磁盤,此時需要修改SELinux的布爾值,方法如下:
setsebool -P named_write_master_zones=1
5.配置文件問題,如果管理員在配置文件中的語法格式有錯誤,則named服務無法正常啟動。例如,如果在配置文件語句后面少寫了分好,啟動服務時會提示類似的提示信息:/etc/named.conf:15:missing ';'before 'view',提示named.conf文件第15行左右少';'符號。
6.文件與目錄權限。由于BIND相關進程都是以named用戶身份啟動的,當配置文件或數(shù)據(jù)文件的權限無法被正確讀取時,則系統(tǒng)將無法啟動BIND服務。查看/var/log/messages日志文件,可以看到none:0:open:/etc/named.conf:permission denied這樣的提示,說明BIND軟件啟動時無權對named.conf文件。類似的問題還可能出現(xiàn)在從服務器同步的時候,要求從服務器一定要把主服務器的數(shù)據(jù)文件同步到本地有讀寫權限的目錄下。
7.縮寫問題。由于BIND數(shù)據(jù)文件有縮寫功能,這樣就有可能產(chǎn)生低級錯誤,就是在數(shù)據(jù)文件中輸入的完整域名沒有以"."結尾。例如,www.abc.com? IN? A? 172.16.0.200,這樣客戶端無法查詢到www.abc.com的解析記錄,只能查詢www.abc.com.abc.com的解析記錄,但這應該不是我們所需要的。
原文鏈接:https://blog.csdn.net/weixin_40470303/java/article/details/80642190
相關內容:https://study.163.com/course/courseMain.htm?courseId=1210406206&share=2&shareId=480000002227524