1. 程式人生 > >DNS服務器原理

DNS服務器原理

規劃 一般來說 區分 通訊協議 階層 from ... ima ace

19.1 什麽是DNS
主機名自動解析為 IP 就很重要!那就是 DNS。 19.1.1 用網絡主機名取得IP的歷史淵源 單一檔案處理上網的年代: /etc/hosts 利用某些特定的檔案將主機名與 IP 作一個對應, 如此一來,我們就可以透過主機名來取得該主機的 IP。 就是/etc/hosts 這個檔案的用途了 缺憾:
  • ip數量太多時,該檔案會大到不像
  • 主機名與IP的對應無法自動於所有計算機內更新
導致,客戶端計算機每次都得要重新下載一次檔案才能順利聯網; 技術分享 技術分享

分布式,階層式主機名管理架構:DNS系統 DNS(Domain Name System), 我們不需要知道主機的IP,只要知道該主機的名稱,就能夠輕易的連上該主機了。
  • DNS 利用類似樹狀目錄的架構,將主機名的管理分配在不同層級的 DNS 服務器當中,經由分層管理, 所以每一部 DNS 服務器記憶的信息就不會很多
  • 若有 IP 異動時也相當容易修改!因為你如果已經申請到主機名解析的授權, 那麽在你自己的 DNS服務器中,就能夠修改全世界都可以查詢到的主機名了!而不用透過上層 ISP 的維護呢! 自己動手當然是最快的
DNS 與 BIND DNS 是一種因特網的通訊協議名稱, 至於 Bind 則是提供這個 DNS 服務的軟件 DNS 有關的 FQDN、 Hostname 與 IP 的查詢流程,正解與反解、合法授權的 DNS 服務器之意義,以及 Zone 等等的知識。 完整主機名:Fully Qualified Domain Name(FQDN) 第一個與 DNS 有關的主機名概念,就是『主機名與領域名 (hostname and domainname)』的觀念,以及由這兩者組成的完整主機名 Fully Qualified Domain Name, FQDN。 DNS 是以樹狀目錄分階層的方式來處理主機名,那我們知道樹狀目錄中, 那個目錄可以記錄文件名。領域名底下還可以記錄各個主機名, 組合起來才是完整的主機名 (FQDN) 我們知道目錄樹的最頂層是根目錄 (/),那麽 DNS 既然也是階層式的,最頂層是啥呢?每一層
的 domain name 與 hostname 又該怎麽分? 例子:www.ksu.edu.tw; 技術分享 技術分享

在上面的例子當中,由上向下數的第二層裏面,那個 .tw 是 domain name ,而 com,edu, gov 則是主機的名稱,而在這個主機的名稱之管理下,還有其他更小網域的主機,所以在第三層的時候,基本上,那個 edu.tw 就變成了 domain name 了!而昆山科大與成大的 ksu, ncku 則成為了 hostname . 以此類推,最後得到我們的主機那個 www 是主機名,而 domain name 是由ksu.edu.tw 那個名字所決定的!自然,我們的主機就是讓管理 ksu.edu.tw 這個domain name 的 DNS 服務器所管理的啰! 註意: 並不是以小數點 (.) 區分 domain name 與 hostname !某些時刻 domain name 所管理的 hostname 會含有小數點。
19.1.2 DNS的主機名對應IP的查詢流程 簡單了解 FQDN 的 domain name 與 hostname 之後,接下來我們要談一談這個DNS 的: (1)階層架構是怎樣? (2)查詢原理是怎樣? 總是要先知道架構才能知道如何查詢主機名的!所以底下我們先來介紹一下整體的 DNS 階層架構。 DNS 的階層架構與 TLD 上面列子:將最上層到昆山科大 (ksu) 時,之間的各層繪制如下圖: 技術分享 技術分享 在整個 DNS 系統的最上方一定是 . (小數點) 這個 DNS 服務器 (稱為 root),最早以前它底下管理的就只有: (1)com, edu, gov, mil, org, .net 這種特殊領域 (2)以國家為分類的第二層的主機名了 這兩者稱為 Top Level Domains (TLDs),頂級域名 授權與分層負責 向上層ISP申請域名的授權例如: 臺灣地區最上層的領域名是以 .tw 為開頭,管理這個領域名的機器 IP 是在臺灣,但是 .tw 這部服務器必須向 root (.) 註冊領域名查詢授權才行 那麽每個國家之下記錄的主要下層有哪些領域呢?基本上就是原先 root 管理的那六大類。 不過,由於各層 DNS 都能管理自己轄下的主機名或子領域, 因此,我們的 .tw 可以自行規劃自己的子領域名喔! 例如目前臺灣 ISP 常提供的 .idv.tw 的個人網站就是一例。 每個上一層的 DNS 服務器所記錄的信息,其實只有其下一層的主機名而已! 至於再下一層,則直接『授權』給下層的某部主機來管理; 這樣設計的好處就是: 每部機器管理的只有下一層的 hostname 對應 IP 而已,所以減少了管理上的困擾!而下層 Client 端如果有問題,只要詢問上一層的 DNS server; 通過DNS查詢主機名IP的流程 DNS類似樹狀的主機名管理: 技術分享 技術分享

首先,當你在瀏覽器的網址列輸入 http://www.ksu.edu.tw 時,你的計算機就會依據相關設定 (在 Linux 底下就是利用 /etc/resolv.conf 這個檔案) 所提供的 DNS的 IP 去進行聯機查詢了。由於目前最常見的 DNS 服務器就屬 Hinet 的 168.95.1.1這個 DNS,所以我們就拿他來做例子 hinet 的這部服務器會這樣工作: 1. 收到用戶的查詢要求,先查看本身有沒有紀錄,若無則向 . 查詢:由於 DNS 是階層式的架構,每部主機都會管理自己轄下的主機名解譯而已。因為 hinet 並沒有管理臺灣學術網絡的權力, 因此就無法直接回報給客戶端。此時 168.95.1.1 就會向最頂層,也就是 . (root) 的服務器查詢相關 IP 信息。 2. 向最頂層的 . (root) 查詢:168.95.1.1 會主動的向 . 詢問 www.ksu.edu.tw 在哪裏呢?但是由於 . 只記錄了 .tw 的信息 (因為臺灣只有 .tw 向 . 註冊而已),此時 . 會告知『我是不知道這部主機的 IP 啦,不過,你應該向 .tw 去詢問才對,我這裏不管! 我跟你說 .tw 在哪裏吧!』 3. 向第二層的 .tw 服務器查詢:168.95.1.1 接著又到 .tw 去查詢,而該部機器管理的又僅有 .edu.tw, .com.tw, gov.tw... 那幾部主機,經過比對後發現我們要的是 .edu.tw 的網域,所以這個時候 .tw 又告訴 168.95.1.1 說:『你要去管理 .edu.tw 這個網域的主機那裏查詢,我有他的 IP !』 4. 向第三層的 .edu.tw 服務器查詢:同理可證, .edu.tw 只會告訴 168.95.1.1 ,應該要去 .ksu.edu.tw 進行查詢,這裏只能告知 .ksu.edu.tw 的 IP 而已。 5. 向第四層的 .ksu.edu.tw 服務器查詢:等到 168.95.1.1 找到 .ksu.edu.tw 之後, .ksu.edu.tw 說:『沒錯!這部主機名是我管理的~ 我跟你說他的 IP 是...所以此時 168.95.1.1 就能夠查到 www.ksu.edu.tw 的 IP 啰! 6. 記錄暫存內存並回報用戶: 查到了正確的 IP 後, 168.95.1.1 的 DNS 機器總不會在下次有人查詢www.ksu.edu.tw 的時候再跑一次這樣的流程吧! 很遠很累的!而且也很耗系統的資源與網絡的帶寬,所以呢, 168.95.1.1 這個 DNS 會很聰明的先記錄一份查詢的結果在自己的暫存內存當中,以方便響應下一次的相同要求啊! 最後則將結果回報給 client 端!當然啦,那個記憶在 cache 當中的數據,其實是有時間性的,當過了 DNS 設定記憶的時間 (通常可能是 24 小時),那麽該記錄就會被釋放喔! 整個分寸查詢的流程就是這樣,總是得要先經過 . 根來向下一層進行查詢,最終總是能得到答案的。 分層的好處是:
  • 主機名修改的僅需要自己的DNS更動即可,不需要通知其他人。
    • 只要主機名經過上層合法的DNS服務器設定,就可以在Internet上面被查詢到,這樣維護簡單,機動性也很高
  • DNS服務器對主機名解析結果的快取時間
    • 每次查詢到的結果都會儲存在 DNS 服務器的高速緩存中,以方便若下次有 相同需求的解析時,能夠快速的響應。通常是10分鐘到三天之內。
  • 可持續向下授權(子領域名授權)
    • 沒層只管當前層的子層地址在哪。
命令 dig+ trace ,查看到DNS的搜尋過程! 技術分享
[[email protected] ~]# dig +trace www.ksu.edu.tw
; <<>> DiG 9.3.6-P1-RedHat-9.3.6-16.P1.el5 <<>>+trace www.ksu.edu.tw
;; global options: printcmd
. 486278 IN NS a.root-servers.net.
. 486278 IN NS b.root-servers.net.
....(底下省略)....
# 上面的部分在追蹤 . 的服務器,可從 a ~ m.root-servers.net.
;; Received 500 bytes from 168.95.1.1#53(168.95.1.1) in 22 ms
tw. 172800 IN NS ns.twnic.net.
tw. 172800 IN NS a.dns.tw.
tw. 172800 IN NS b.dns.tw.
....(底下省略)....
# 上面的部分在追蹤 .tw. 的服務器,可從 a ~ h.dns.tw. 包括
ns.twnic.net.
;; Received 474 bytes from 192.33.4.12#53(c.root-servers.net) in 168
ms
edu.tw. 86400 IN NS a.twnic.net.tw.
edu.tw. 86400 IN NS b.twnic.net.tw.
# 追蹤 .edu.tw. 的則有 7 部服務器
;; Received 395 bytes from 192.83.166.11#53(ns.twnic.net) in 22 ms
ksu.edu.tw. 86400 IN NS dns2.ksu.edu.tw.
ksu.edu.tw. 86400 IN NS dns3.twaren.net.
ksu.edu.tw. 86400 IN NS dns1.ksu.edu.tw.
;; Received 131 bytes from 192.83.166.9#53(a.twnic.net.tw) in 22 ms
www.ksu.edu.tw. 3600 IN A 120.114.100.101
ksu.edu.tw. 3600 IN NS dns2.ksu.edu.tw.
ksu.edu.tw. 3600 IN NS dns1.ksu.edu.tw.
ksu.edu.tw. 3600 IN NS dns3.twaren.net.
;; Received 147 bytes from 120.114.150.1#53(dns2.ksu.edu.tw) in 14 ms
技術分享

DNS 端口號:53; 這裏,DNS開始以udp傳輸,若未查到完整信息,則重新以TCP傳輸; 所以DNS,daemon,會同時啟動tcp,udp的port 53,; 19.1.3 合法DNS的關鍵:申請領域查詢授權 與其他服務器不同,DNS服務器的架設有合法不合法之說。 向上層領域註冊取得合法的領域查詢授權 如果需要架設DNS,而且是可以連上Internet上面的DNS時,就必須要透過上層DNS服務器的授權。 所以, 要讓你的主機名對應 IP 且讓其他計算機都可以查詢的到,你有 兩種方式: 1. 上層 DNS 授權領域查詢權,讓你自己設定 DNS 服務器; 2. 直接請上層 DNS 服務器來幫你設定主機名對應! 擁有領域查詢權後,所有的主機名信息都以自己為準,與上層無關。 DNS,記錄的信息非常的多,重點有兩個:
  • 記錄服務器所在的NS(NameServer)標誌
  • 記錄主機名對應的A(Address)標誌
我們在網絡上面查詢到的最終結果,都是查詢IP的,因此最終的標誌要找到的是A這個記錄才對。 技術分享 技術分享

註冊的.vbird.org 記錄在ISP的DNS服務器名為dns.vbird.org,該筆記錄其實是NS,並非A。 雖然在 godaddy 服務器內有記錄一筆『要查詢 .vbird.org 時,請到dns.vbird.org (NS) 去查,這個管理者的 IP 是 140.116...』, 但是這筆記錄只是告訴我們要去下一個服務器找, 並不是最終的 A (IP Address) 的答案,所以還得要繼續往下找 (隨時記得圖 19.1-4 的查詢流程)。 此時,有幾種結果會導致dns.vbird.org的IP找不到,或最終IP與godaddy記錄的不同結果:
  • dns.vbird.org 服務器掛點時
    • 如果 dns.vbird.org 這部主機宕機,那麽在上圖顯示『查詢』箭頭的步驟會被中斷,因此就會出現『聯機不到dns.vbird.org 的 IP』的結果。
  • dns.vbird.org 服務器內的數據庫忘記補上數據時
    • 在自己的服務器數據庫中,忘記加上 dns.vbird.org 的記錄時,最終的結果還是會顯示『找不到該服務器的 IP』
  • dns.vbird.org 服務器內的數據庫數據編寫不一致時
    • 如果是在鳥哥自己服務器的數據庫內的 dns.vbird.org 所記錄的 IP 與godaddy 的不同,最終的結果會以鳥哥記錄的為準。
總之,在ISP上面填寫的主機名只是一個參考用的,最終還是要在你自己服務器當中設定好才行。 由此可見,DNS查詢不是簡單的從上層獲得下層IP,然後一級級的往下查詢。DNS肯定有更加健全的查詢算法,通過上層設定的參考,最終由本層設定決定。 疑問????? ??????? 既然上層僅作參考,實際起作用的是下層自己的設定。那麽當上層godaddy設置了dns.vbird.org->NS(140.116.111.12),而本層dns.vbird.org設置了dns.vbird.org->A(150.120.111.12)。那麽在從根走到godaddy之後,是如何確定dns.vbird.org,即在godaddy拿到的是假地址,是如何走到dns.vbird.org的。 19.1.4 主機名交由ISP 代管還是自己設定DNS服務器。 需要架設DNS的時機:
  • 主機數量龐大
  • 需要經常修改server名稱。
19.1.5 DNS數據庫的記錄:正解,反解,Zone得意義
  • 從主機名查詢到 IP 的流程稱為:正解
  • 從 IP 反解析到主機名的流程稱為:反解
  • 不管是正解還是反解,每個領域的記錄就是一個區域 (zone)
正解的設定權以及DNS正解zone記錄的標誌 符合上層NDS所給予的領域範圍,即可申請正解DNS服務器; 正解zone通常標誌:
  • SOA:就是開始驗證 (Start of Authority) 的縮寫,相關資料本章後續小節說明;
  • NS:就是名稱服務器 (NameServer) 的縮寫,後面記錄的數據是 DNS 服務器的意思;
  • A:就是地址 (Address) 的縮寫,後面記錄的是 IP 的對應 (最重要);
反解的設定權以及 DNS 反解 zone 記錄的標誌 能夠設定反解的就只有 IP 的擁有人,亦即你的 ISP 才有權力設定反解的。 那你向 ISP 取得的 IP 能不能自己設定反解呢?答案是不行! 除非你取得的是整個 class C 以上等級的 IP 網段,那你的 ISP 才有可能給你 IP 反解授權。 否則,若有反解的需求,就得要向你的直屬上層 ISP 申請才行。 反解zone通常標誌:
  • SOA:就是開始驗證 (Start of Authority) 的縮寫,相關資料本章後續小節說明;
  • NS:就是名稱服務器 (NameServer) 的縮寫,後面記錄的數據是 DNS 服務器的意思;
  • PTR:就是指向 (PoinTeR) 的縮寫,後面記錄的數據就是反解到主機名啰
每部DNS都需要的正解zone:hint hint: 根目錄在哪裏的記錄; 所以說,一部簡單的正解 DNS 服務器,基本上就要有兩個 zone 才行,一個是hint ,一個是關於自己領域的正解 zone。 19.1.6 DNS數據庫的類型:hint,master/slave架構 hint:.(root)基本數據庫類型; master,slave 是兩種基本類型,用來解決DNS服務器主從結構,數據同步問題的。 master
  • 要管理員自己手動去修改與設定;並且重啟後才生效;
  • 一般來說,我們說的DNS設定,就是指設定這種數據庫的類型
  • 給slave的DNS提供數據庫內容
slave
  • 必須與master相互搭配
  • 只支持一主多從
  • 更改master之後,slave自動更新
master/slave的查詢優先權? 在 DNS 系統當中,領域名的查詢是『先搶先贏』的狀態; Master / Slave 數據的同步化過程 基本上,不論 Master 還是 Slave 的數據庫,都會有一個代表該數據庫新舊的『序號』,這個序號數值的大小,是會影響是否要更新的動作。 更新的兩種方式:
  • master主動告知
    • Master 在修改了數據庫內容,並且加大數據庫序號後, 重新啟動 DNS 服務,那 master 會主動告知 slave 來更新數據庫,
  • slave主動提出
    • Slave 會定時的向 Master 察看數據庫的序號, 當發現 Master 數據庫的序號比 Slave 自己的序號還要大 (代表比較新),那麽 Slave 就會開始更新

DNS服務器原理