DNS 服務器--從入門到放棄

最近和朋友討論起了當時註冊的域名,又想起來了DNS服務器,剛剛好當時學習的時候也不是很精通,就趁着這個時間段再一次回顧了以下。讓我們一起看一下DNS服務器吧


這篇文章的目錄結構如下:

  1. 什麼是 DNS 服務器?
  2. 什麼時候要用 DNS 服務器
  3. 爲什麼要用 DNS 服務器?
  4. 誰會用 DNS 服務器?
  5. 怎麼使用 DNS 服務器?

1.什麼是 DNS 服務器?

DNS(Domain Name Server ,域名服務器)是將域名(Domain name)和對應的IP地址(IP address)進行轉換的服務器。那麼什麼又是域名尼?
域名:
通俗點說就是每次上網的時候輸入的網址也可以理解爲域名,而百度給的定義是域名是由一串用點分隔的名字組成的,通常包含組織名,而且始終包括兩到三個字母的後綴,以指明組織的類型或該域所在的國家或地區。

2.什麼時候要用 DNS 服務器?

因爲我們記憶的原因,現在當我們要去上網的時候,總會記住幾個域名,然而並不會去記住一個個服務器對應的IP。因此當我們在用域名訪問別人主機的時候,DNS 服務器就已經默默的起到了作用,DNS 服務器會將我們輸入的域名一 一的轉換爲對應的IP然後再去訪問別人的主機。
因此當在一個企業的內部,要想在企業內部讓諸多個主機通過主機名訪問彼此,就要構建自己的 DNS 服務器了。

3.爲什麼要用 DNS 服務器?

在剛剛開始擁有網絡的時候,全球僅僅只有幾個大學的實驗室加入網絡,因此大家可以憑藉記住很少的IP地址來進行彼此之間的聯繫,並且在當時的每個主機上都會擁有一個爲hosts的文件用來本地解析,如今依舊擁有這個文件來進行本地的域名解析。在這兩個系統下其文件所在的地方。

linux系統:/etc/hosts
Windows:%windir%\System32\drivers\etc\hosts

但是隨着信息化的發展,越來越多的用戶加入到網絡中,大家的記憶並不能全部都記住彼此之間的ip地址,並且如果繼續使用原來的辦法(使用hosts文件)的話,hosts文件的條目越來越多,每一次的查詢越來越繁瑣,因此就出現了一個組織 IANA(The Internet Assigned Numbers Authority,互聯網數字分配機構),IANA 來保存每一個用戶的主機名與IP條目的關係。因此大家就不用再紛紛寫入自己的hosts文件,僅僅需要定下一個計劃任務(crontab)讓其隔一段的時間就從 IANA 的服務器去下載hosts文件到本地,雖然這樣擁有一定的可行性,但是互聯網的發展是爆炸性,用戶的增長是幾何的倍數增加,因此當用戶數量再一次增加的時候,就是 IANA 的策略也已經行不通了,因此就開發出了 BIND(Berkeley Internet Name Domain,伯克利Internet名字域)使用BIND軟件來構建域名服務器。而其構建的方法和Linux的目錄結構非常的相似,使用一種倒置的樹狀結構,如下圖:
DNS 服務器--從入門到放棄

當然頂級域還有很多我就不一 一列舉了,因此現在使用 BIND 就對每一個的域名劃分到了不同的分支下面了,這樣不僅減輕了根服務器的壓力而且非常的容易尋找並且管理,並且根(.)依舊會能夠管理到每一個域名,但是其僅僅管理一級域就可以了,這樣可以極大的減輕根服務器的壓力。然後通過不斷的逐個查找就能夠找尋到我們所需要的信息。並且 IANA 也不再提供原本的 hosts文件了,變爲一個全球範圍的域名供應商,管理 DNS 域名根和.int,.arpa等資源。相關的13個根服務器,1個爲主根服務器在美國。其餘12個均爲輔根服務器,其中9個在美國,歐洲2個,位於英國和瑞典,亞洲1個位於日本。

4.誰會用 DNS 服務器?

對於這個問題,很不好回答,但是我覺得如果大家感興趣,或者想要了解的都可以去接觸 DNS 服務器。

要開始真正深入瞭解並配置 DNS 服務器了。

5.如何使用 DNS 服務器?

對於如何使用 DNS服務器來說是一個比較複雜的問題,因此我們通過下面一些步驟來慢慢進一步的瞭解DNS服務器


首先我們需要知道,DNS 服務器所使用的端口是(53/UDP,53/TCP;)使用BIND軟件來進行使用的並且是在應用層的一個協議,使用 C/S 架構。並且當我們安裝 BIND 之後就能通過 named 服務來進行啓動 DNS 服務了,當然對於真正的瞭解到 DNS 服務器還是需要首先知道一些名詞的,隨後遇到的再慢慢說起來。

FQDN:Fully Qualified Domain Name,也就是上文所說的域名。
正向解析:FQDN ==> IP 表示通過DNS服務器FQDN解析爲IP的過程
反向解析:IP==>FQDN 表示通過DNS服務器由IP查詢到FQDN
domain:邏輯概念,域
zone:物理概念,區域
DNS的服務器類型:1主 DNS服務器(master)2輔助DNS服務器(slave)3緩存服務器4轉發器(forward)

下面這個圖能夠幫助我們知道什麼是 domain 與 zone。
DNS 服務器--從入門到放棄
可以看到每一個zone下面都會有很多的資源,當我們訪問其下面的資源時,其對應的主機就給我們回答,並且每個區都有自己的授權服務器,當我們要在DNS服務器查詢FQDN的時候會給我們返回兩種類型的答案,即權威答案(Authority Answer,AA)和非權威答案。

一、安裝 BIND 軟件
BIND軟件可以運行在大部分的Linux主機上,並且在RHEL6.5及以後,在系統的光盤自帶了BIND服務的安裝文件。
而我們首先使用簡單的方法進行安裝(yum),首先查看與 bind相關的軟件包。

$ yum list | grep bind

DNS 服務器--從入門到放棄
一些主要軟件的作用如下:

bind :提供了 DNS 服務的主要程序及相關文件
bind-libs :提供了bind、bind-utils需要使用的函數庫
bind-utils :提供了對 DNS 服務器的測試工具,如 nslookup等

接下來我們就安裝bind

$ yum install -y bind

二、配置 BIND 軟件
bind軟件的安裝之後會出現兩個很重要的路徑,一個是主配置文件/etc/named.conf 另一個是工作目錄/var/named ,我們分別來進行一 一探索。
1.簡單DNS服務器的主要配置
這是用於啓動 named 服務的主要配置文件,對於簡單的DNS服務器來講其中主要分爲兩個部分的定義,全局定義區域定義
對於全局定義的段使用如下的定義。

options {
                directory "/var/named"; 
};
注:named.conf 配置文件要求每一行的結束都需要一個分號結束

配置的含義就是將每個區域的資源記錄(Resource Record,簡稱RR)文件放在了/var/named/的目錄之下。
那麼RR到底什麼東西尼?

懵。。。,先記住向下看看

三.配置文件
/etc/named.conf配置文件中除了剛剛定義的全局定義之外,就是各個區域(zone)的定義了。

通常對於每一個區域(zone)的簡單定義就是如下的格式。
zone "ZONE_NAME" IN {
                type master|slave|hint|forward;
                file "ZONE_NAME.zone"
};
注:type 就表明了區域的 DNS服務器類型。
                file就是將這個區域的RR放在什麼地方,相對路徑。
比較特別的是下面這個區域的定義,表示這是一個根域的dns服務器。
zone "." IN {
                type hint;
                file "named.ca"
};

當然,DNS的配置文件也支持使用acl來自定義,訪問控制列表。並且默認就存在這樣四個列表,none,any(任何主機),local(本機),以及localnet(本地網絡)。定義就如下:

    acl acl_name{
        statement;
    };

如果安裝時候在/var/named/目錄下並沒有named.ca 的文件話可以使用dig 命令來生成named.ca文件,需要能夠訪問互聯網,否則查詢不到根服務器。

[root@rs1 named]# dig -t NS . >/var/naemd/named.ca

首先構建一個最簡單的 DNS服務器,也就是緩存 DNS 服務器。任何一個複雜的 DNS 服務器都是由簡單的緩存服務器一步步變難的,覺得學習也是這個道理哈。

緩存 DNS 服務器:不負責解析任何區域(除了(本機)localhost)

/etc/named.conf 配置如下

options {
        directory "/var/named";
};
//正向解析本機
zone "localhost" IN{
                type     master;
                file "named.localhost";

};
//反向解析本機
zone "0.0.127.in-addr.arpa" IN{
                type master;
                file "named.local";
};

反向解析比正相解析要複雜許多,區域名是比較特殊,爲網斷名+in-addr.arpa
接下來的就是上面都提到過的各個區域的 RR 文件了,在裏面會有下面幾個特殊的定義 。

TTL:Time-To-Live 每一個記錄的生存時間
SOA:Start Of Authority,起始授權記錄
A:Address IPV4的地址記錄
AAAA:IPV6的地址記錄
PTR:Pointer反向解析記錄,一般不能和A記錄出現在一起
NS:Name Server dns服務器的定義
MX:Mail eXchange 郵件的定義
CNAME:規範名字

對每一個資源記錄文件來說,首先定義的都應該是這樣的一行

ZONE_NAME     [TTL]       IN SOA  localhost.(ZONE_NAME的 DNS服務器名)  admin.localhost.(管理員的郵箱)
(
                          2018091501 ; (版本號)serial
                           1H         ; (刷新時間)refresh
                            5M          ; (重試時間,應當小於刷新時間)retry
                            1D       ; (超時時間,設置嘗試幾天之後認爲主 DNS 服務器宕機了)expire 
                            1H      ; (否定回答,對方緩存多長時間)minimum

)   

如果一開始在/var/named/下有一些文件,則可以看到有以下相應的符號

$TTL 600 :設置全局的TTL時間,定義後可以不再使用TTL
$ORIGIN :默認補充的字段,如果在一些地方使用的並非完整的FQDN則在後面補充上ORIGIN定義的字段,默認就是/etc/named.conf中定義的區域名字(ZONE_NAME)
@:本文件在/etc/named.conf 配置文件中定義的區域

因此/var/named/named.localhost 的定義如下:

$TTL 600

@       IN      SOA     localhost.      admin.localhost.        (
                                20180913
                                1H
                                5M
                                1D
                                1H )
                                IN      NS      localhost.
localhost.      IN      A       127.0.0.1

對於每一行的定義如果和上一行的第一列相同,則可以省略

相應的反向解析的配置文件

$TTL 600

@       IN      SOA     localhost.      admin.localhost.        (
                                20180913
                                1H
                                5M
                                1D
                                1H )
                IN      NS      localhost.
1       IN      PTR     localhost.

注:1 表示的主機名,如上面我們所說的如果沒有寫全就會默認補充上ORIGIN,所以其的全部就是1.0.0.127.in-addr.arpa

至此我們就構建了一個最簡單的緩存 DNS 服務器。可以使用bind帶有的命令來查看配置文件是否有錯。

named-checkconf
named-checkzone zone zone_file 

然後我們使用 dig 命令來測試一下
DNS 服務器--從入門到放棄
@後面指定爲我本地的服務器ip,因此對於不同的host 指定不同的ip,其他詳細的介紹查詢幫助文檔。
接下來我們就討論一個較爲複雜的問題,一個 FQDN==> IP 到底發生了什麼?

迭代查詢:和普通的迭代算法一樣,就是一次次不斷的去請求。
遞歸查詢:僅發出一次請求,一次應答

對於發起查詢請求的客戶端,僅觸發了一次查詢並獲得了一次結果這就是遞歸查詢,而對於當前域內的dns服務器,通過一次次不斷的迭代查找才獲得結果,因此就是迭代查詢。
DNS 服務器--從入門到放棄
這樣是一個能夠查詢到的一個過程,如果dns查詢不到我們要查詢的記錄會發什麼?
對於這樣,就在SOA記錄的minimum給出瞭解釋,例如我們查詢ftp.a.com,但是當dns再一次從根查詢到a.com的域內發現並沒有ftp.a.com的這個子域,因此a.com.域就會給dns服務器一個否定回答,然後再由dns服務器將否定回答給客戶端。
以下就是一個dns服務接受到請求然後進行查詢的主要流程。
DNS 服務器--從入門到放棄
dns 服務器查詢的詳細介紹

1.如果查詢請求是本機所負責的區域中的數據的話,要通過查詢區域數據文件返回結果
2.如果查詢請求不是本機所負責區域中的數據的話,就查詢緩存
3.如果緩存中沒有答案,則向根發起查詢請求,並不斷迭代

那麼讓我們更深一步的去探索dns的功能吧
在上面我們搭建了一個簡單的 DNS緩存服務器,現在讓我們來將他變成一個主DNS服務器,步驟很簡單,

1.將主配置文件中,加入我們的正向解析域名以及反向解析域名。
2.在工作目錄下,添加相應的數據文件。
3.重啓服務,重新載入也可以的。

是不是很簡單,首先是主配置文件,我的dns服務器的網絡是192.168.159.143.

zone "athlete.run" IN {
                type master;
                file "athlete.run.zone";
};
zone "159.168.192.in-addr.arpa" IN {
                type master;
                file "athlete.reverse";
};

然後是工作目錄文件,我定義的是athlete.run.zoneathlete.reverse所以編輯兩個文件。
這個是athlete.run.zone文件

$TTL 60
@       IN      SOA     ns1     admin (
                    2018091401
                    1M
                    5S
                    1H
                    1D )
    IN      NS      ns1
    IN      NS      ns2
    IN      MX      10      mail
ns1     IN      A       192.168.159.143
ns2     IN      A       192.168.159.146
www     IN      A       192.168.159.143
mail    IN      A       192.168.159.143

剩下這個就是athlete.reverse文件了

$TTL 600
@       IN      SOA     ns1.athlete.run admin.athlete.run (
                    2018091403
                    1D
                    5M
                    7D
                    1D )
    IN      NS      ns1.athlete.run.
143     IN      PTR     ns1.athlete.run.
143     IN      PTR     www.athlete.run.

最後

# systemctl reload named 或者 # systemctl restart named 

最後用dig工具測試一下就可以了,當然我這兩個文件可能寫的比較簡單,但是能使用的。

介紹了這麼多 DNS的配置,讓我們換個話題發現一下。
如果是通過YUM安裝bind的話,會默認給你安裝另一個工具叫做:rndc

rndc:remote name domain controller,遠程名稱域控制器

通過名字就可以瞭解到,這個工作的特性了,所以爲了安全使用的是tcp的953端口953/TCP,接下來讓我們使用這個工件吧。
首先rndc的使用也是有配置文件的,在哪裏尼?

# rpm -ql bind | grep rndc

DNS 服務器--從入門到放棄

但是,一開始/etc/rndc.conf這個目錄的文件是不存在,所以需要我們手動通過rndc 命令來實現
值得一提的就是如果兩文件都存在的話,每次執行命令就會給你警告,挺煩的,所以自己把握。

rndc-confgen >/etc/rndc.conf 就可以了

需要一提的是,這個文件裏面的後幾行是需要拷貝的/etc/named.conf中的,因此,相應的 vim 操作自己查詢一下吧。如果一切都完成的話,就可以通過一下命令來重新讀取了,當然也可以重啓,但是在大型工作中,服務器某個應用重啓會造成太多的損失,因此就需要我們通過重讀配置文件來重新應用。

# rndc reload

DNS 服務器--從入門到放棄
出現這個標誌就是成功了,如果失敗了,那麼就詳細的查看日誌文件查看把!

# cat /var/log/message

對於rndc的其他主要使用的命令,我也總結在下面:

stop :停止 DNS服務器
reload:重新載入配置文件和區域文件
reload zone:重新載入某區域文件
reconfig:重新載入配置文件和發生過更新的區域文件
status:查看dns的詳細情況
querylog:使用查詢日誌(不推薦使用)
flush:清空緩存

還有一些其他使用幫助文檔,查看把。


到這裏對一個DNS服務器應該就有了一箇中級的認識了,接下了討論就是我們的更深一步的話題了。
子域授權,我們可以通過自己來申請一個子域,例如 a.org 那麼對這個子域來說我們可以添加至多127個子域,也就是說這個樹的深度最多到127層。而在每一個不同深層次的域,其的授權都是在上一級子域中授權的。比如上面圖片的例子,d.org 的子域www.d.org和ftp.d.org分別就是d.org的子域,並且www.d.org 子域的dns服務器授權是由d.org進行。 在下一步的話就是edu.www.d.org 也可以使www.d.org授權的子域。 相應授權的子域的dns配置文件就是在子域自己的區域中定義。
轉發 DNS服務器
這個的理解也比較簡單,就是在主配置文件中加入 forwarders { IP; };,比較特殊的就是分號的左右兩邊均需要空格,分號內可以寫多項,不過需要分號隔開。這樣就能實現在本地的查詢請求,本機會轉發至指定IP的DNS服務器去查詢。值得一提的就是對於轉發也是有類別的。

first:如果DNS1去找DNS2請求解析,DNS2並未響應,則DNS1自己去解析
only:如果DNS1去找DNS2請求解析,DNS2未響應,則無查詢結果(希望全給了別人。。。)

所以我們定義轉發的話再加入一行轉發類型,結果就是這樣,就能實現轉發。

forward first|only;
forwarders { IP };

當然如果放在全局option段就是全局轉發,特定的區域就是在查詢到這個區域的時候再轉發。

主從DNS服務器
對於每一個時常在線服務器來說,都應該做出相應的冗餘,以免突然時刻主服務器宕機了,或者是數據丟失了,但是DNS服務器比較奇特的就是,當主DNS服務器宕機之後,輔助的DNS服務器多次嘗試重連主DNS服務器如果沒有響應的話,從DNS服務器會跟着主DNS服務器一起宕機。(雙宿雙飛。。。)
因此我們就要做好輔助的DNS服務器時刻保存主DNS服務器的數據文件,以免主DNS服務器宕機造成數據丟失。
因此說到傳送,對於DNS服務器來說有着兩種區域傳送:

完全增量傳送:axfr 一開始進行傳送的文件
增量傳送:ixfr 當從服務器有了區域傳送文件後,以後的傳送都將是增量傳送
因此我們可以使用dig命令來查看我定義的區域的信息
DNS 服務器--從入門到放棄

可以看到這麼多比較重要的信息,肯定不能白白的暴露給其他人,因此我們只能給特定的主機進行區域傳送,這樣就需要在主配置文件中加入

 allow-transfer { IP;  };

要定義一個主從的DNS,主的服務器就是剛剛我們一直使用,從服務器的配置很簡單,就另外啓動一臺電腦或虛擬機,然後使用yum安裝bind,並在配置文件中增加這樣一個區域。

zone "athlete.run" IN {
                type slave;
                masters { IP; };
                file "slaves/athlete.run.zone";

當然slaves是安裝bind的時候自動給我們創建的,因此我們可以它,當然也可以自己定義地方,不過需要注意的是,DNS服務器啓動的進程屬主屬組均是named所以我們創建的文件也應該均是named並且權限爲640。對於這樣的文件可以一開始不存在,然後啓動從服務器,就可以看到相應的文件生成。當然在我做實驗的時候,遇到了好多次這樣的現象,從主服務器傳送來的文件在從服務器看到的格式是data,然而其本身是一個ASCII TEXT的文件,所以我們就需要在從服務器的主配置文件中加入這樣一個定義

    masterfile-format  text;

這樣就一切完成了,當我們更改了主DNS服務器的數據文件,並增加了版本號之後,主DNS服務器就會主動的提醒從DNS服務器來更新文件。當然這樣還是需要一些額外配置的。

主從同步:
主服務器:授權允許同步,有從DNS服務器的NS記錄,並且授權允許區域傳送
從服務器:定義區域

這樣就能完成主從複製了。
最後一個也就是DNS服務器至今最流行的一個應用,CDN

CDN:Content Delivery Network ,內容分發網絡

簡單的說CDN就是將各個大型的域名進行解析到不同的IP,使不同的人來訪問就進入到不同的網段,但是網頁的頁面卻完全是一樣的

DNS 服務器--從入門到放棄
就像這樣,本來是一個DNS服務器,但是強行將其拆分成爲兩個不同的DNS服務器域,左邊的人訪問這個DNS服務器,會根據一些判斷然後讓其訪問左邊的DNS服務器,而右邊的人是相同的,因此這也能夠叫做智能DNS,也稱之爲DNS的腦裂。這樣到底有什麼用尼?
DNS 服務器--從入門到放棄
這個圖就介紹了,當不同區域的用戶去請求同一個頁面的時候,DNS服務器就會根據客戶端的地理位置進行檢測,然後將其本地的數據文件存放的IP地址返回,這樣就減少了訪問延遲,並且相當與將數據推送到了每一個互聯網用戶的家門口。
介紹了這麼多,那麼到底怎麼定義不同的區域尼?
其實定義很簡單,就是除了全局段之外,再使用view來定義每一個視圖。

view VIEW_NAEM {
    match-clients {I網段/掩碼;};
    //一些區域的定義
}

那麼匹配到的客戶端就會進入到相應的視圖之中進行解析。
使用了視圖也有需要注意的地方:

1多個view內可能需要對同一個區域進行解析,但使用不同的區域解析庫文件。
2.一旦使用了視圖,所有的zone都只能定義在view中
3.僅有必要在匹配到允許遞歸請求的客戶端所在view中定義根區域
4.客戶端請求到達後,自上而下檢查每個view所服務的客戶端列表

最後的最後 - -,這其實和一般使用的DNS作用不大,但是還是有一些相關關係的,編譯安裝BIND
首先就去bind的官網下載bind的軟件包
將其解壓到我們本地,然後進入和普通的應用軟件一樣,configure make && make install
主要是我們手動安裝的話什麼都不會給我們提供,遠遠沒有yum簡潔,但是可以使用自己的定製軟件,主要需要我們做到以下這些步驟

1.修改PATH環境變量,輸出二進制程序的搜索路徑新路徑
2.導出庫文件搜索路徑
3.導出頭文件搜索路徑
4.導出幫助文件手冊搜索路徑
5.創建配置文件
到此我們終於聊完了DNS服務器相關的東西,不過還是相信自己知道的僅僅是一點點,望自己能夠瞭解到更多的知識。


不忘初心,砥礪前行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章