本文目錄: 7.1 DNS必懂基礎 7.1.1 域的分類 7.1.2 主機名、功能變數名稱、FQDN 7.1.3 域的分層授權 7.1.4 DNS解析流程 7.1.5 /etc/resolv.conf 7.2 DNS術語 7.2.1 遞歸查詢和迭代查詢 7.2.2 權威伺服器和(非)權威應答 7.2.3 D ...
本文目錄:
7.2.5 資源記錄(Resource Record,RR)
DNS是Domain name system的簡稱,有些地方也成為Domain name server,這東西是一個很大的話題。如果不是要配置DNS服務,只需要理解DNS的解析流程和DNS有關的基本知識即可。如果要配置DNS服務,則可以看完全文。
7.1 DNS必懂基礎
DNS主要是用於將功能變數名稱解析為IP地址的協議,有時候也用於將IP地址反向解析成功能變數名稱,所以DNS可以實現雙向解析。
DNS可以使用TCP和UDP的53埠,基本使用UDP協議的53埠。
7.1.1 域的分類
域是分層管理的,就像中國的行政級別。
最高層的域是根域(root)".",就是一個點,它就像國家主席一樣。全球只有13個根域伺服器,基本上都在美國,中國一臺根域伺服器都沒有。
根域的下一層就是第二層次的頂級域(TLD)了,那麼它就是各省省長了。頂級域一般兩種劃分方法:按國家劃分和按組織性質劃分。
◇ 按國家劃分:.cn(中國)、.tw(臺灣)、.hk(香港)。基本都是兩個字母的。
◇ 按組織性質劃分:.org、.net、.com、.edu、.gov、.cc等。
◇ 反向域:arpa。這是反向解析的特殊頂級域。
頂級域下來就是普通的域,公司或個人在互聯網上註冊的功能變數名稱一般都是這些普通的域,如baidu.com。
7.1.2 主機名、功能變數名稱、FQDN
以百度(www.baidu.com)和百度貼吧(tieba.baidu.com)來舉例。
◇ 功能變數名稱
不論是www.baidu.com還是tieba.baidu.com,它們的功能變數名稱都是baidu.com,嚴格地說是"baidu.com."。這是百度所購買的com域下的一個子功能變數名稱。
◇ 主機名
對於www.baidu.com來說,主機名是www,對於tieba.baidu.com來說,主機名是tieba。其實嚴格來說,www.baidu.com和tieba.baidu.com才是主機名,它們都是baidu.com域下的主機。一個域下可以定義很多主機,只需配置好它的主機名和對應主機的IP地址即可。
◇ FQDN
FQDN是Fully Qualified Domain Name的縮寫,稱為完全合格功能變數名稱,是指包含了所有域的主機名,其中包括根域。FQDN可以說是主機名的一種完全表示形式,它從邏輯上準確地表示出主機在什麼地方。
例如www.baidu.com的FQDN是"www.baidu.com.",com後面還有個點,這是根域;tieba.baidu.com的FQDN是"tieba.baidu.com."。
7.1.3 域的分層授權
域是從上到下授權的,每一層都只負責自己的直轄下層,而不負責下下層。例如根域給頂級域授權,頂級域給普通域授權,但是根域不會給普通域授權。和現實中的行政管理不一樣,域的授權和管理絕對不會向下越級,因為它根本不知道下下級的功能變數名稱是否存在。
7.1.4 DNS解析流程
以訪問www.baidu.com為例。
(1).客戶端要訪問www.baidu.com,首先會查找本機DNS緩存,再查找自己的hosts文件,還沒有的話就找DNS伺服器(這個DNS伺服器就是電腦里設置指向的DNS)。
(2).DNS伺服器收到詢問請求,首先查看自己是否有www.baidu.com的緩存,如果有就直接返回給客戶端,沒有就越級上訪到根域".",並詢問根域。
(3).根域看到是找.com域的,把到.com域的路(地址)告訴DNS伺服器,讓DNS伺服器去找.com詢問。
(4).DNS伺服器去找.com,".com"一看是自己轄下的baidu.com,就把baidu.com的IP地址給DNS伺服器,讓它去找baidu.com。
(5).DNS找到baidu.com,baidu.com發現DNS伺服器要找的是自己區域里的www主機,就把這個主機IP地址給了DNS伺服器。
(6).DNS伺服器把得到的www.baidu.com的IP結果告訴客戶端,並緩存一份結果在自己機器中(預設會緩存,因為該伺服器允許為客戶端遞歸,否則不會緩存非權威數據)。
(7).客戶端得到回答的IP地址後緩存下來,並去訪問www.baidu.com,然後www.baidu.com就把頁面內容發送給客戶端,也就是百度頁面。
最後要說明的是:
1.本機查找完緩存後如果沒有結果,會先查找hosts文件,如果沒有找到再把查詢發送給DNS伺服器,但這僅僅是預設情況,這個預設順序是可以改變的。在/etc/nsswitch.conf中有一行" hosts: files dns"就是定義先查找hosts文件還是先提交給DNS伺服器的,如果修改該行為"hosts: dns files"則先提交給DNS伺服器,這種情況下hosts文件幾乎就不怎麼用的上了。
2.由於緩存是多層次緩存的,所以真正的查詢可能並沒有那麼多步驟,上圖的步驟是完全沒有所需緩存的查詢情況。假如某主機曾經向DNS伺服器提交了www.baidu.com的查詢,那麼在DNS伺服器上除了緩存了www.baidu.com的記錄,還緩存了".com"和"baidu.com"的記錄,如果再有主機向該DNS伺服器提交ftp.baidu.com的查詢,那麼將跳過"."和".com"的查詢過程直接向baidu.com發出查詢請求。
7.1.5 /etc/resolv.conf文件
這個文件主要用於定義dns指向,即查詢主機名時明確指定使用哪個dns伺服器。該文件的詳細說明見Linux網路管理之:/etc/resolv.conf。
例如此文件中指定了"nameserver 8.8.8.8",則每當要查詢主機名時,都會向8.8.8.8這台dns伺服器發起遞歸查詢,這台dns伺服器會幫忙查找到最終結果並返回給你。
當然,在後文的實驗測試過程中,使用了另一種方式指定要使用的dns伺服器:dig命令中使用"@dns_server"。
7.2 DNS術語
7.2.1 遞歸查詢和迭代查詢
例如A主機要查詢C域中的一個主機,A所指向的DNS伺服器為B,遞歸和迭代查詢的方式是這樣的:
遞歸查詢:A --> B --> C --> B --> A
迭代查詢:A --> B A --> C --> A
將遞歸查詢和迭代查詢的方式放到查詢流程中,就如下圖所示。(未標出Client指向的DNS伺服器)
也就是說,遞歸的意思是找了誰誰就一定要給出答案。那麼允許遞歸的意思就是幫忙去找位置,如A對B允許遞歸,那麼B詢問A時,B就去幫忙找答案,如果A不允許對B遞歸,那麼A就會告訴B的下一層域的地址讓B自己去找。
可以想象,如果整個域系統都使用遞歸查詢,那些公共的根域和頂級域會忙到死,因此更好的方案就是把這些壓力分散到每個個人定製的DNS伺服器。
所以DNS的解析流程才會如下圖。並且在客戶端到DNS伺服器端的這一階段是遞歸查詢,從DNS伺服器之後的是迭代查詢。也就是說,頂級域和根域出於性能的考慮,是不允許給其他任何機器遞歸的。
為什麼客戶端到DNS伺服器階段是遞歸查詢?因為客戶端本身不是DNS伺服器,它自己是找不到互聯網上的功能變數名稱地址的,所以只能詢問DNS伺服器,最後一定由DNS伺服器來返回答案,所以DNS伺服器需要對這個客戶端允許遞歸。因此,dns解析器(nslookup、host、dig等)所發出的查詢都是遞歸查詢。
7.2.2 權威伺服器和(非)權威應答
權威伺服器(權威者)可以理解為直接上層域的DNS伺服器。例如www.baidu.com這台主機的上層域是baidu.com,那麼對www來說,它的權威伺服器就是baidu.com這個域內負責解析的DNS伺服器,而對於baidu.com這個主機來說,它的權威伺服器是.com這個域負責解析的DNS伺服器。
更具體的說,某域的權威伺服器是可以直接查看該域數據(即區域數據文件)的DNS伺服器,主、從DNS伺服器都是權威伺服器。
只有權威伺服器給出的應答才是權威應答,否則就是非權威應答。為什麼呢?因為一個域中所有的主機都是在DNS伺服器中的區域數據文件中記錄的,對於主機來說,它們的位置只有直接上層才知道在哪裡。
因此如果解析www.baidu.com時要獲得權威應答,應該將DNS指向baidu.com這個域內負責解析的DNS伺服器。
只有權威伺服器直接給出的答案才是永遠正確的,通過緩存得到的答案基本都是非權威應答。當然這不是一定的,因為權威伺服器給的答案也是緩存中的結果,但是這是權威答案。DNS伺服器緩存解析的資料庫時間長度是由權威伺服器決定的。
7.2.3 DNS緩存
在Client和DNS伺服器這些個人訂製的DNS解析系統中都會使用緩存來加速解析以減少網路流量和查詢壓力,就算是解析不到的否定答案也會緩存。
但是要訪問的主機IP可能會改變,所有使用緩存得到的答案不一定是對的,因此緩存給的答案是非權威的,只有對方主機的上一級給的答案才是權威答案。緩存給的非權威答案應該設定緩存時間,這個緩存時間的長短由權威者指定。
另外訪問某個域下根本不存在的主機,這個域的DNS伺服器也會給出答案,但是這是否定答案,否定答案也會緩存,並且有緩存時間。例如某個Client請求51cto.com域下的ftp主機,但是實際上51cto.com下麵可能根本沒有這個ftp主機,那麼51cto.com就會給否定答案,為了防止Client不死心的訪問ftp搞破壞,51cto.com這個域負責解析的DNS伺服器有必要給Client指定否定答案的緩存時間。
7.2.4 主、從dns伺服器
dns伺服器也稱為name server,每個域都必須有dns伺服器負責該域相關數據的解析。但dns伺服器要負責整個域的數據解析,壓力相對來說是比較大的,且一旦出現問題,整個域都崩潰無法向外提供服務,這是非常嚴重的事。所以,無論是出於負載均衡還是域數據安全可用的考慮,兩台dns伺服器已經是最低要求了,多數時候應該配置多台dns伺服器。
多台dns伺服器之間有主次之分,主dns伺服器稱為master,從dns伺服器稱為slave。slave上的域數據都是從master上獲取的,這樣slave和master就都能向外提供名稱解析服務。
7.2.5 資源記錄(Resource Record,RR)
對於提供DNS服務的系統(DNS伺服器),功能變數名稱相關的數據都需要存儲在文件(區域數據文件)中。這些數據分為多種類別,每種類別存儲在對應的資源記錄(resource record,RR)中。也就是說,資源記錄既用來區分域數據的類型,也用來存儲對應的域數據。
DNS的internet類中有非常多的資源記錄類型。常用的是SOA記錄、NS記錄、A記錄(IPV6則為AAAA記錄)、PTR記錄、CNAME記錄、MX記錄等。
其中:(以下內容如果不瞭解,可以先跳過,在配置區域數據文件時回頭來看)
(1).SOA記錄:start of authority,起始授權機構。該記錄存儲了一系列數據,若不明白SOA記錄,請結合下麵的NS記錄,SOA更多的信息見"子域"部分的內容。格式如下:
longshuai.com. IN SOA dnsserver.longshuai.com. mail.longshuai.com. ( 1 3h 1h 1w 1h )
第四列指定了"dnsserver.longshuai.com."為該域的master DNS伺服器。
第五列是該域的管理員郵箱地址,但註意不能使用@格式的郵箱,而是要將@符號替換為點".",正如上面的例子"mail.longshuai.com.",其實際表示的是"[email protected]"。
第六列使用括弧將幾個值包圍起來。第一個值是區域數據文件的序列編號serial,每次修改此區域數據文件都需要修改該編號值以便讓slave dns伺服器同步該區域數據文件。第二個值是刷新refresh時間間隔,表示slave dns伺服器找master dns伺服器更新區域數據文件的時間間隔。第三個值是重試retry時間間隔,表示slave dns伺服器找master dns伺服器更新區域數據文件時,如果聯繫不上master,則等待多久再重試聯繫,該值一般比refresh時間短,否則該值表示的重試就失去了意義。第四個值是過期expire時間值,表示slave dns伺服器上的區域數據文件多久過期。第五個值是negative ttl,表示客戶端找dns伺服器解析時,否定答案的緩存時間長度。這幾個值可以分行寫,也可以直接寫在同一行中使用空格分開,所以,上面的SOA記錄可以寫成如下格式:
longshuai.com. IN SOA dnsserver.longshuai.com. mail.longshuai.com. ( 1 3h 1h 1w 1h )
前三列是聲明性的語句,表示"longshuai.com."這個域內的起始授權機構為第四列的值"dnsserver.longshuai.com."所表示的主機。第五列和第六列是SOA的附加屬性數據。
每個區域數據文件中都有且僅能有一個SOA記錄,且一般都定義為區域數據文件中的資源記錄。
註意,資源記錄的作用之一是存儲域相關的對應數據,所以第4、5、6列表示的是該SOA記錄所存儲的相關值。
(2).NS記錄:name server,存儲的是該域內的dns伺服器相關信息。即NS記錄標識了哪台伺服器是DNS伺服器。格式如下:
longshuai.com. IN NS dnsserver.longshuai.com.
前三列仍然是聲明性語句,表示"longshuai.com."域內的DNS伺服器(name server)為第四列值所表示的"dnsserver.longshuai.com."主機。
如果一個域內有多個dns伺服器,則必然有主次之分,即master和slave之分。但在NS記錄上並不能體現主次關係。例如:
longshuai.com. IN NS dnsserver1.longshuai.com.
longshuai.com. IN NS dnsserver2.longshuai.com.
表示主機"dnsserver1.longshuai.com."和主機"dnsserver2.longshuai.com."都是域"longshuai.com."內的dns伺服器,但沒有區分出主次dns伺服器。
不少朋友搞不懂SOA記錄,也很容易混淆SOA和NS記錄。其實,僅就它們的主要作用而言,NS記錄僅僅只是聲明該域內哪台主機是dns伺服器,用來提供名稱解析服務,NS記錄不會區分哪台dns伺服器是master哪台dns伺服器是slave。而SOA記錄則用於指定哪個NS記錄對應的主機是master dns伺服器,也就是從多個dns伺服器中挑選一臺任命其為該域內的master dns伺服器,其他的都是slave,都需要從master上獲取域相關數據。由此,SOA的名稱"起始授權機構"所表示的意思也就容易理解了。
(3).A記錄:address,存儲的是域內主機名所對應的ip地址。格式如下:
dnsserver.longshuai.com. IN A 172.16.10.15
客戶端之所以能夠解析到主機名對應的ip地址,就是因為dns伺服器中的有A記錄存儲了主機名和ip的對應關係。
AAAA記錄存儲的是主機名和ipv6地址的對應關係。
(4).PTR記錄:pointer,和A記錄相反,存儲的是ip地址對應的主機名,該記錄只存在於反向解析的區域數據文件中(並非一定)。格式如下:
16.10.16.172.in-addr.arpa. IN PTR www.longshuai.com.
表示解析172.16.10.16地址時得到主機名"www.longshuai.com."的結果。
(5).CNAME記錄:canonical name,表示規範名的意思,其所代表的記錄常稱為別名記錄。之所以如此稱呼,就是因為為規範名起了一個別名。什麼是規範名?可以簡單認為是fqdn。格式如下:
www1.longshuai.com. IN CNAME www.longshuai.com.
最後一列就是規範名,而第一列是規範名即最後一列的別名。當查詢"www1.longshuai.com.",dns伺服器會找到它的規範名"www.longshuai.com.",然後再查詢規範名的A記錄,也就獲得了對應的IP地址並返回給客戶端。
CNAME記錄非常重要,很多時候使用CNAME可以解決很複雜的問題。而且目前常用的CDN技術有一個步驟就是在dns伺服器上設置CNAME記錄。
(6).MX記錄:mail exchanger,郵件交換記錄。負責轉發或處理該功能變數名稱內的郵件。和郵件伺服器有關,且話題較大,所以不多做敘述,如有深入的必要,請查看《dns & bind》中"Chapter 5. DNS and Electronic Mail"。
關於資源記錄,最需要明確的概念就是它不僅僅用來區分和標識區域數據的類型,還用來存儲對應的域數據。
7.3 安裝DNS
Linux上搭建DNS服務的軟體有bind9、NSD(Name server domain)和unbound,其中bind9是市場占有率最高的軟體。本文也以此軟體來介紹DNS服務。當前CentOS7.2上使用yum安裝的bind為bind 9.9版本,bind實現DNS的最佳最詳細說明文檔是"DNS & BIND"和"Bind97 Manual",網上都有中文版本的資源。
[root@xuexi ~]# yum -y install bind
以下是bind生成的命令程式。
[root@xuexi ~]# rpm -ql bind | grep sbin /usr/sbin/arpaname /usr/sbin/ddns-confgen /usr/sbin/dnssec-checkds /usr/sbin/dnssec-coverage /usr/sbin/dnssec-dsfromkey /usr/sbin/dnssec-importkey /usr/sbin/dnssec-keyfromlabel /usr/sbin/dnssec-keygen /usr/sbin/dnssec-revoke /usr/sbin/dnssec-settime /usr/sbin/dnssec-signzone /usr/sbin/dnssec-verify /usr/sbin/genrandom /usr/sbin/isc-hmac-fixup /usr/sbin/lwresd /usr/sbin/named /usr/sbin/named-checkconf /usr/sbin/named-checkzone /usr/sbin/named-compilezone /usr/sbin/named-journalprint /usr/sbin/nsec3hash /usr/sbin/rndc /usr/sbin/rndc-confgen
其中加粗標紅的工具在後文可能都是要用的,它們是做什麼的,可以直接man以下看看描述。其中named是提供DNS服務的主程式,它預設會讀取配置文件/etc/named.conf。
安裝bind後生成了以下幾個配置文件。
[root@xuexi ~]# rpm -ql bind | grep etc /etc/logrotate.d/named /etc/named /etc/named.conf /etc/named.iscdlv.key /etc/named.rfc1912.zones /etc/named.root.key /etc/rndc.conf /etc/rndc.key /etc/rwtab.d/named /etc/sysconfig/named /usr/share/doc/bind-9.9.4/sample/etc /usr/share/doc/bind-9.9.4/sample/etc/named.conf /usr/share/doc/bind-9.9.4/sample/etc/named.rfc1912.zones
其中named.conf是named工具預設的配置文件,它的配置指令項非常多。
7.4 配置和使用DNS
7.4.1 named.conf配置簡要說明
下文將以longshuai.com域以及這個域中的主機的定義來說明相關配置方法。
named.conf是named預設載入的配置文件,該配置文件中使用"#"或"/**/"或"//"作為註釋符號,每個非註釋語句都必須使用分號";"結束。
該配置文件中只能有一個options,在這裡面用於配置全局項。其中下例中的directory指令定義區域數據文件的存放目錄。
options { directory "/var/named"; };
除了option,還必需有區域的配置。zone關鍵字後面接的是域和類,域是自定義的功能變數名稱,IN是internet的簡稱,是bind 9中的預設類,所以可以省略。type定義該域的類型是"master | slave | stub | hint | forward"中的哪種,file定義該域的區域數據文件(區域數據文件的說明見下文),因為這裡是相對路徑db.longshuai.com,它的相對路徑是相對於/var/named的,也可以指定絕對路徑/var/named/db.longshuai.com。
zone "longshuai.com" IN{ type master; file "db.longshuai.com" };
除此外,在每個named.conf中還應該配置幾個必須的區域。
(1).根功能變數名稱"."的區域配置。
zone "." IN { type hint; file named.ca; }
type hint表示該區域"."類型為hint。回顧dns解析流程,在客戶端讓dns伺服器迭代查詢時,迭代查詢的第一步就是讓dns伺服器去找根功能變數名稱伺服器。但是dns伺服器如何知道根功能變數名稱伺服器在哪裡?這就是hint類型的作用,它提示dns伺服器根據其區域數據文件named.ca中的內容去獲取根功能變數名稱地址,並將這些數據緩存起來,下次需要根功能變數名稱地址時直接查找緩存即可。
由於根功能變數名稱地址也是會改變的,有了根區域的提示,就可以永遠能獲取到最新的根區域地址。其實也可以手動下載這些數據,地址為:https://www.internic.net/domain/named.root
因此,只有根區域"."才會設置為hint類型。
(2)."localhost"功能變數名稱(用於解析localhost為127.0.0.1)和127.0.0.1的方向查找區域。這兩個沒有定義在named.conf中,而是定義在/etc/named.rfc1912.zones中,然後在named.conf中使用include指令將其包含進來。
include "/etc/named.rfc1912.zones";
其中named.rfc1912.zones中部分內容:
zone "localhost" IN { type master; file "named.localhost"; allow-update { none; }; }; zone "1.0.0.127.in-addr.arpa" IN { type master; file "named.loopback"; allow-update { none; }; };
當然,反向查找區域可以定義為域而不是直接定義成主機。例如:
zone "0.0.127.in-addr.arpa" IN { type master; file "named.loopback"; allow-update { none; }; };
但這樣的話,就需要相對應地修改/var/named/named.loopback文件。
其實根功能變數名稱"."和"localhost"以及"1.0.0.127.in-addr.arpa"完全沒必要去改變,照搬就是了。
所以,/etc/named.conf的內容如下:
[root@xuexi ~]# cat /etc/named.conf options { directory "/var/named"; }; zone "longshuai.com" { type master; file "db.longshuai.com"; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones";
到此並沒有結束,因為/etc/named*的屬組都是named,且許可權要為640。如下:
[root@xuexi ~]# ls -l /etc/named* -rw-r--r-- 1 root root 205 Aug 12 21:58 /etc/named.conf -rw-r----- 1 root named 1705 Mar 22 2016 /etc/named.conf.bak -rw-r--r-- 1 root named 3923 Jul 5 18:15 /etc/named.iscdlv.key -rw-r----- 1 root named 931 Jun 21 2007 /etc/named.rfc1912.zones -rw-r--r-- 1 root named 1587 May 22 21:10 /etc/named.root.key
所以,對於新建的/etc/named.conf應該要改變屬組和許可權。
[root@xuexi ~]# chown root:named /etc/named.conf [root@xuexi ~]# chmod 640 /etc/named.conf
然後使用/usr/sbin/named-checkconf命令來檢查下/etc/named.conf文件的配置是否正確,如果不返回任何信息,則表示配置正確。
[root@xuexi ~]# named-checkconf
配置好配置文件後,接下來要書寫域相關資料庫——區域數據文件。
7.4.2 區域數據文件配置說明
區域數據文件即named.conf中zone關鍵字定義的域的數據文件,由zone中的file指令指定文件名,例如上面定義的"db.longshuai.com",說明longshuai.com這個zone的區域數據文件為/var/named/db.longshuai.com。
區域數據文件中很多地方都可以使用縮寫,如果不使用縮寫的書寫方式,那麼每一條記錄中的功能變數名稱或主機名都要寫全,即要寫到根域"."。
假設longshuai.com域內有3台主機www、ftp和mydb,它們的ip分別為172.16.10.{16,17,18},還有一臺DNS伺服器主機名為dnsserver,其ip為172.16.10.15。
於是,longshuai.com這個區域的數據文件可以如下書寫:區域數據文件中使用分號";"來註釋。
$TTL 6h longshuai.com. IN SOA dnsserver.longshuai.com. xyz.longshuai.com. ( 1 ; serial num 3h ; refresh time 1h ; retry time 1w ; expire time 1h ) ; negative time longshuai.com. IN NS dnsserver.longshuai.com. dnsserver.longshuai.com. IN A 172.16.10.15 www.longshuai.com. IN A 172.16.10.16 ftp.longshuai.com. IN A 172.16.10.17 mydb.longshuai.com. IN A 172.16.10.18 www1.longshuai.com. IN CNAME www.longshuai.com.
其中第一行的"$TTL 6h"表示緩存周期,即查詢該域中記錄時肯定答案的緩存時間長度。例如本地查詢www.baidu.com時,本地將緩存baidu.com域的相關查詢結果,緩存時間長度由baidu.com這個域的區域數據文件中定義的$TTL的值決定。
在區域數據文件中,"$TTL"的定義表示其後的記錄都以此TTL為準,直到遇到下一個"$TTL"。也就是說,兩個$TTL之間的所有記錄都以前面的$TTL為準。不過大多數時候,一個區域數據文件中只會在第一行定義一個$TTL值,表示該文件中所有記錄都使用該緩存周期值。
第二行定義的是SOA記錄,每個區域文件中的第一個資源記錄定義行都要是SOA記錄。在該行中除了指定了master dns伺服器,還指定了一些附加屬性,包括序列號為1,還有各種時長等信息。
第二個資源記錄行定義的是NS記錄,NS記錄行表示該行定義的主機"dnsserver.longshuai.com."是這個域"longshuai.com."內的dns伺服器。
接下來的幾個資源記錄行定義的都是A記錄,分別定義了"{dnsserver,www,ftp,mydb}.longshuai.com."這幾個主機對應的ip地址為172.16.10.{15,16,17,18}。A記錄中存儲的是主機名和IP地址之間的映射關係,在為外界主機提供主機名查詢服務時,就是從A記錄中獲取對應的ip地址。
最後一個資源記錄行定義的是CNAME記錄,它存儲的是canonical name所對應的別名。例如此處定義的是"www.longshuai.com."的別名為"www1.longshuai.com."。
然後修改/var/named/db.longshuai.com文件的屬組和許可權。
[root@xuexi ~]# chmod 640 /var/named/db.longshuai.com [root@xuexi ~]# chown root:named /var/named/db.longshuai.com
然後使用named-checkzone命令檢查區域數據文件是否書寫正確。例如,要檢查"longshuai.com"區域,其區域數據文件為/var/named/named.conf。
[root@xuexi ~]# named-checkzone longshuai.com /var/named/db.longshuai.com zone longshuai.com/IN: loaded serial 1 OK
實際上,應該對所有的區域都進行檢查,使用named-checkzone一個一個進行手動檢查,顯得非常繁瑣。在CentOS 6上,支持使用"service named configtest"來檢查,CentOS 7上沒有對應的功能。但無論是CentOS 6還是CentOS 7上,在啟動named服務的時候,都會自動檢查配置文件的正確性。
回到區域數據文件的配置說明上。在上面的配置過程中,完全沒有使用縮寫,但其實很多地方都能使用縮寫的書寫方式。以下是區域數據文件中的一些書寫規則,包括縮寫規則:
(1)."$"符號:定義巨集。最常見的是"$TTL"、"$ORIGIN"。origin的的意思是起點,可以自行定義$ORIGIN的值。
例如:"$ORIGIN ."表示定義的$ORIGIN的起點值為根域符號,"$ORIGIN longshuai.com."表示$ORIGIN的值為"longshuai.com.",未定義$ORIGIN時,值為zone "domain"的domain部分。
(2).fqdn自動補齊:在區域數據文件中,沒有使用點號"."結尾的,在實際使用的時候都會自動補上功能變數名稱,使其變為fqdn。
例如區域"longshuai.com.",以下是完全格式的資源記錄:
dnsserver.longshuai.com. IN A 172.16.10.15
可以縮寫為:
dnsserver IN A 172.16.10.15
因為dnsserver後沒有點,所以會補齊整個功能變數名稱"longshuai.com."。
實際上,自動補齊的部分是$ORIGIN的值,只不過預設沒定義$ORIGIN時,$ORIGIN的值為zone定義的功能變數名稱,所以預設是自動補齊功能變數名稱。
(3)."@"符號:可以使用@符號來縮寫$ORIGIN的值。
由於自定義的區域數據文件中,一般不會主動定義$ORIGIN的值,而第一個資源記錄一般都是SOA記錄,所以此時SOA記錄中的第一列就可以使用@符號,其它地方只要值為$ORIGIN,都可以使用@符號縮寫。例如:
@ IN SOA dnsserver xyz. ( 1 3h 1h 1w 1h ) @ IN NS dnsserver
(4).重覆最近一個名稱:區域數據文件中的第一列可以使用空格或製表符使該列繼承上一行的第一列的值。
例如第一行定義的是SOA記錄,第一列是"longshuai.com.",那麼第二行定義的NS記錄中,其第一列就可以留空來繼承第一行第一列的"longshuai.com."。不止第一行和第二行,第三行也可以繼承第二行的第一列,第n+1行也可以繼承第n行的第一列,只要它們的值一樣即可。
所以,/var/named/db.longshuai.com這個文件完全縮寫後的結果如下:
[root@xuexi named]# vim /var/named/db.longshuai.com $TTL 6h @ IN SOA dnsserver xyz ( 1 3h 1h 1w 1h ) @ IN NS dnsserver dnsserver IN A 172.16.10.15 www IN A 172.16.10.16 ftp IN A 172.16.10.17 mydb IN A 172.16.10.18 www1 IN CNAME www
是否縮寫正確,可以使用named-checkzone來檢查下,還可以使用named-compilezone命令對區域數據文件進行編譯,並輸出編譯後的結果。
[root@xuexi named]# named-compilezone -o - longshuai.com /var/named/db.longshuai.com zone longshuai.com/IN: loaded serial 1 longshuai.com. 21600 IN SOA dnsserver.longshuai.com. xyz.longshuai.com. 1 10800 3600 604800 3600 longshuai.com. 21600 IN NS dnsserver.longshuai.com. dnsserver.longshuai.com. 21600 IN A 172.16.10.15 ftp.longshuai.com. 21600 IN A 172.16.10.17 mydb.longshuai.com. 21600 IN A 172.16.10.18 www.longshuai.com. 21600 IN A 172.16.10.16 www1.longshuai.com. 21600 IN CNAME www.longshuai.com. OK
"-o"選項表示將編譯後的結果輸出到指定文件中,"-"表示輸出到標準輸出。
由上面編譯的結果可以看出,縮寫後的結果並沒有任何錯誤。
在/etc/named.conf中,還定義了3個區域,分別是"."、"localhost"和"1.0.0.127.in-addr.arpa",它們的區域數據文件分別是/var/named/{named.ca,named.localhost,loopback},這幾個文件的內容可以自行解讀。
[root@xuexi ~]# cat /var/named/named.ca ; <<>> DiG 9.9.4-RedHat-9.9.4-38.el7_3.2 <<>> +bufsize=1200 +norec @a.root-servers.net ; (2 servers found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17380 ;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 27 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1472 ;; QUESTION SECTION: ;. IN NS ;; ANSWER SECTION: . 518400 IN NS a.root-servers.net. . 518400 IN NS b.root-servers.net. . 518400 IN NS c.root-servers.net. . 518400 IN NS d.root-servers.net. . 518400 IN NS e.root-servers.net. . 518400 IN NS f.root-servers.net. . 518400 IN NS g.root-servers.net. . 518400 IN NS h.root-servers.net. . 518400 IN NS i.root-servers.net. . 518400 IN NS j.root-servers.net. . 518400 IN NS k.root-servers.net. . 518400 IN NS l.root-servers.net. . 518400 IN NS m.root-servers.net. ;; ADDITIONAL SECTION: a.root-servers.net. 3600000 IN A 198.41.0.4 a.root-servers.net. 3600000 IN AAAA 2001:503:ba3e::2:30 b.root-servers.net. 3600000 IN A 192.228.79.201 b.root-servers.net. 3600000 IN AAAA 2001:500:84::b c.root-servers.net. 3600000 IN A 192.33.4.12 c.root-servers.net. 3600000 IN AAAA 2001:500:2::c d.root-servers.net. 3600000 IN A 199.7.91.13 d.root-servers.net. 3600000 IN AAAA 2001:500:2d::d e.root-servers.net. 3600000 IN A 192.203.230.10 e.root-servers.net. 3600000 IN AAAA 2001:500:a8::e f.root-servers.net. 3600000 IN A 192.5.5.241 f.root-servers.net. 3600000 IN AAAA 2001:500:2f::f g.root-servers.net. 3600000 IN A 192.112.36.4 g.root-servers.net. 3600000 IN AAAA 2001:500:12::d0d h.root-servers.net. 3600000 IN A 198.97.190.53 h.root-servers.net. 3600000 IN AAAA 2001:500:1::53 i.root-servers.net. 3600000 IN A 192.36.148.17 i.root-servers.net. 3600000 IN AAAA 2001:7fe::53 j.root-servers.net. 3600000 IN A 192.58.128.30 j.root-servers.net. 3600000 IN AAAA 2001:503:c27::2:30 k.root-servers.net. 3600000 IN A 193.0.14.129 k.root-servers.net. 3600000 IN AAAA 2001:7fd::1 l.root-servers.net. 3600000 IN A 199.7.83.42 l.root-servers.net. 3600000 IN AAAA 2001:500:9f::42 m.root-servers.net. 3600000 IN A 202.12.27.33 m.root-servers.net. 3600000 IN AAAA 2001:dc3::35 ;; Query time: 18 msec ;; SERVER: 198.41.0.4#53(198.41.0.4) ;; WHEN: Po kvě 22 10:14:44 CEST 2017 ;; MSG SIZE rcvd: 811
該文件中記錄了獲取根區域的方法:dig +bufsize=1200 +norec @a.root-servers.net。
[root@xuexi ~]# cat /var/named/named.{localhost,loopback} $TTL 1D @ IN SOA @ rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS @ A 127.0.0.1 AAAA ::1
$TTL 1D @ IN SOA @ rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS @ A 127.0.0.1 AAAA ::1 PTR localhost.
至此,配置文件和區域數據文件都已經配置結束了,可以啟動named服務。
[root@xuexi named]# systemctl restart named.service [root@xuexi named]# netstat -tnlup | grep named tcp 0 0 172.16.10.15:53 0.0.0.0:* LISTEN 66248/named tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 66248/named tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 66248/named tcp6 0 0 ::1:953 :::* LISTEN 66248/named udp 0 0 172.16.10.15:53 0.0.0.0:* 66248/named udp 0 0 127.0.0.1:53 0.0.0.0:*