DNS 服務的運行詳解

互聯網是一個很大的地方。大量的協議和物理基礎結構已經到位,使咱們可以輕鬆使用它。DNS是一個巨大的話題。在本文中,我將介紹有關DNS及其組成部分的基本知識,並探討DNS解析的實際應用。git

DNS的目的

鏈接到互聯網的每一個設備都有一個分配給它的IP地址。該設備能夠託管大量服務,互聯網上的任何人均可以經過使用其IP地址鏈接到該設備來訪問。例如,Wikipedia已使其網站可訪問IP地址103.102.166.224(該IP地址可能與您不一樣),可是記住一長串數字以方便我聯繫它並不方便。Pffff。github

這將當即限制訪問Internet上全部很酷的內容。wikipedia.org代替IP地址將更容易使用。咱們寧願有某種機制能夠爲咱們記住這些映射。所以,就像電話中的聯繫人列表同樣,DNS(域名系統的縮寫)維護着一堆有關服務器名稱(或更確切地說是域名)的信息,每當您打開任何網站時,Web瀏覽器都會無提示地查詢這些信息。shell

從技術上講,DNS是一個 分佈式的分層數據庫經過與該數據庫進行交互(插入和檢索信息)的機制在互聯網上傳播。DNS中的信息存儲爲資源記錄(RR),這其實是域名和某些數據之間的映射。一些資源記錄類型爲:數據庫

  • A :將域名映射到IPv4地址。
  • AAAA :映射到IPv6地址。
  • CNAME :映射到域名的別名。
  • NS :使用受權的域名服務器映射域名。
  • SOA :指定域的區域的開始。

對於IP而言,擁有更多資源的資源記錄對於將層次結構引入DNS並簡化域名管理很是重要。在服務器的IP地址被更改的狀況下,DNS還經過保持相同的服務器名稱來帶來可訪問性的一致性。瀏覽器

DNS是互聯網的關鍵結構,衆所周知,若是沒有DNS,DNS將會崩潰。緩存

URL的細分

在開始以前,讓咱們先了解一個URL並弄清楚DNS解析URL的哪一部分。考慮如下URLbash

https://www.youtube.com/watch?v=dQw4w9WgXcQ
  • 創建鏈接後,「 https」是用於與Web服務通訊的協議。
  • www.youtube.com 」是表明託管Web服務的設備的域名,須要解析爲IP地址。也稱爲徹底合格域名(FQDN)。
  • 'watch?v = dQw4w9WgXcQ'是咱們要在Web服務中訪問的資源或頁面。

FQDN字符串由用單點分隔的標籤組成。傳統上,FQDN以表明根域的點結束。「 www.youtube.com 」和「 www.youtube.com」。'是同樣的。末尾的點在表示中能夠省略,但內部全部分辨率都在末尾點就位的狀況下發生。服務器

圖像

DNS中的層次結構

網站域名

域名是互聯網中的一個領域,擁有域名的實體對其擁有管理權-在DNS中爲相應域名建立或更新資源記錄。層次結構能夠在域名中看到,而且能夠可視化爲樹。wikipedia.org.是域名的示例。這等級制度域的數量從FQDN中的右標籤到左標籤降序。左側的每一個標籤都指定了右側域的一個子域。層次結構中的第一個域是根域(由點表示)。網絡

comorginio是根域下的一些子域。根域下的第一級域稱爲頂級域(TLD),而且獨立於根域進行操做。TLD的子域可供互聯網用戶購買。例如wikipedia,TLD的子域org.必須在某個時間點已購買。app

圖像

  • comorgin是根域的子域。
  • youtubeduckduckgocomcom.域的子域。
  • wwwmusicyoutube.comyoutube.com.域的子域。

擁有域名權限能夠將其映射到某些網絡設備(可能正在運行某些網絡服務)的IP地址或建立子域。域全部者甚至能夠選擇將子域的權限委派給其餘實體。例如,若是Google以爲能夠,那麼它能夠出售域名music.youtube.com並將域名的所有權限委派給買方。這是頂級域名(TLD)在出售子域名時一般會作的事情。

區域

區域是一組子域,其中包括域全部者對域進行徹底控制的域自己。根區域僅具備根域。管理根區域的ICANN組織有權建立更多的TLD(多是子域),就像過去同樣。

根域的子域comorg是從在權威方面根域徹底獨立的。這意味着,若是在com域下添加任何新的子域,則根域不會受到任何影響,由於該com域不在其管轄範圍以內。facebook.com在單獨的區域中。域apps.facebook.com和與developers.facebook.com處於同一區域facebook.com。若是facebook.com要添加新服務(例如直播電視),他們能夠tv.facebook.com在同一區域中進行設置,而無需打擾父域com

圖像

一個域可能在其區域下僅包含幾個子域,併爲其餘子域委派權限。

權威名稱服務器

每一個域都有至少2個(用於冗餘)與它們相關聯的專用權威名稱服務器。這些名稱服務器維護並提供域及其子域的資源記錄。若是查詢域名,則最終將由其權威的名稱服務器提供服務。

權威名稱服務器是DNS的重要組成部分,由於它們造成了要查詢域名解析的分佈式層次數據庫的節點。它們使DNS得以分發,由於每一個域名能夠具備本身的名稱服務器,而且不綁定到單箇中央數據庫。

管理員能夠根據本身的選擇配置名稱服務器。大型組織能夠維護本身的權威名稱服務器,以管理其域專有的資源記錄。可是,在其餘域之間共享其權威名稱服務器的域名是很常見的。換句話說,許多單獨的,不相關的域名可能正在使用共享名稱服務器。

行動中的DNS解析

DNS解析由DNS客戶端啓動,以尋求域名的某些信息(例如IP地址)。它建立一個DNS查詢,並將其發送到DNS服務器,而後DNS服務器爲DNS客戶端解析該查詢。當咱們鏈接到Internet時,咱們的網絡配置將保留由咱們的ISP提供的默認DNS服務器。咱們甚至可使用咱們選擇的DNS服務器。8.8.8.8是Google提供的一種很是流行,易於記憶的DNS服務器。

下圖演示了DNS解析中查詢和響應的流程。

圖像

  1. 客戶端A爲域en.wikipedia.org尋找具備IP地址的Type資源記錄,該客戶端建立DNS查詢並將其發送到配置的DNS服務器。
  2. 要查找en.wikipedia.orgDNS服務器的IP地址,必須首先找到該域的名稱服務器。爲了找到該名稱服務器,DNS服務器從其域名服務器首先與DNS服務器一塊兒存儲的根域開始,開始從右向左一次解析一個標籤的域名。接下來的一行將是org.它查詢根域的權威名稱服務器之一,以詢問的名稱服務器。org.請注意,它首先搜索名稱服務器,由於它們擁有該域的全部信息。
  3. 查詢的名稱服務器將結果返回到DNS服務器。
  4. DNS服務器接下來向域名服務器之一查詢org.域,以請求如下域名服務器的域名服務器:wikipedia.org
  5. 查詢的名稱服務器將合適的結果返回到DNS服務器。
  6. 最後,DNS服務器查詢wikipedia.org名稱服務器,詢問如下內容的類型A記錄:en.wikipedia.org
  7. 查詢的名稱服務器以類型A資源記錄來響應DNS服務器。
  8. DNS服務器將此結果答覆給提出查詢的DNS客戶端。

爲了使名稱服務器免於重複查詢的負擔,DNS服務器實現了高速緩存機制,而且僅在名稱服務器中按層次結構查詢名稱服務器(若是它們在其高速緩存中沒有客戶端請求的資源記錄)。爲了解釋DNS解析及其全部組成部分,以上插圖未考慮緩存。若是DNS服務器和Namerserver沒有所需的信息,它們將以適當的答案進行答覆。

使用DiG的示例

在閱讀完全部內容後,這是一段有趣的時光,您能夠看到這一切並進行驗證。我已經將DNS服務器設置爲,208.67.222.222而且將使用dig實用程序在bash shell中執行幾個DNS查詢。

1.簡單的挖掘查詢

dig指望將域名做爲參數,而且默認狀況下將查詢A類資源記錄。下面是命令dig www.reddit.com及其輸出。

neeraj@mrm:~$ dig www.reddit.com 
; <<>> DiG 9.16.1-Ubuntu <<>> www.reddit.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16713
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.reddit.com.            IN    A
;; ANSWER SECTION:
www.reddit.com.        254    IN    CNAME    reddit.map.fastly.net.
reddit.map.fastly.net.    30    IN    A    151.101.65.140
reddit.map.fastly.net.    30    IN    A    151.101.129.140
reddit.map.fastly.net.    30    IN    A    151.101.193.140
reddit.map.fastly.net.    30    IN    A    151.101.1.140
;; Query time: 84 msec
;; SERVER: 208.67.222.222#53(208.67.222.222)
;; WHEN: Tue Sep 01 00:16:04 IST 2020
;; MSG SIZE  rcvd: 142

輸出說明:

上面輸出的如下片斷列出了DiG版本,發出的查詢以及傳遞給dig的一些命令行選項。

; <<>> DiG 9.16.1-Ubuntu <<>> www.reddit.com
;; global options: +cmd

接下來是有關DNS標頭的一些信息,例如標誌,部分。

;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16713
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

而後將查詢發給DNS服務器。問題部分下的列格式爲域名,DNS類,資源記錄的類型。這裏IN是指DNS類「 Internet」。

;; QUESTION SECTION:
;www.reddit.com.            IN    A

在「問題」部分以後是「答案」,「權限」和「其餘」部分形式的響應。在此示例中,咱們僅具備「答案」部分,在該部分中,咱們接收CNAME到所查詢域的Type資源記錄而不是Type A,這多是由於A該域的Type資源記錄不存在,而這是DNS服務器相對於查詢所找到的。 CNAME基本上這樣指定別名,www.reddit.com.而且reddit.map.fastly.net.是同一事物的兩個不一樣名稱。域名後的數字是主機能夠緩存資源記錄的秒數。在CNAME咱們擁有「類型」A資源記錄以後,reddit.map.fastly.net.這給了咱們4個IP地址,咱們可使用這些IP地址進行訪問www.reddit.com.

;; ANSWER SECTION:
www.reddit.com.        254    IN    CNAME    reddit.map.fastly.net.
reddit.map.fastly.net.    30    IN    A    151.101.65.140
reddit.map.fastly.net.    30    IN    A    151.101.129.140
reddit.map.fastly.net.    30    IN    A    151.101.193.140
reddit.map.fastly.net.    30    IN    A    151.101.1.140

最後,咱們對整個操做有一些統計。操做所需的時間,查詢的DNS服務器等。

;; Query time: 84 msec
;; SERVER: 208.67.222.222#53(208.67.222.222)
;; WHEN: Tue Sep 01 00:16:04 IST 2020
;; MSG SIZE  rcvd: 142

2.更多 CNAME

您可能知道甚至能夠從打開Facebook www.fb.com。讓咱們看看發生了什麼事。我鼓勵您仔細閱讀輸出內容。

neeraj@mrm:~$ dig www.fb.com 
; <<>> DiG 9.16.1-Ubuntu <<>> www.fb.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29969
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.fb.com.            IN    A
;; ANSWER SECTION:
www.fb.com.        6569    IN    CNAME    www.facebook.com.
www.facebook.com.    668    IN    CNAME    star-mini.c10r.facebook.com.
star-mini.c10r.facebook.com. 60    IN    A    157.240.198.35
;; Query time: 112 msec
;; SERVER: 208.67.222.222#53(208.67.222.222)
;; WHEN: Sun Sep 06 23:47:27 IST 2020
;; MSG SIZE  rcvd: 111

啊! 所以,在「答案」部分中,咱們能夠看到它 www.facebook.com只是的別名www.fb.com

咱們甚至能夠經過在域名以後放置「類型」來直接查詢特定的資源記錄。

neeraj@mrm:~$ dig www.fb.com CNAME
; <<>> DiG 9.16.1-Ubuntu <<>> www.fb.com CNAME
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37259
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.fb.com.            IN    CNAME
;; ANSWER SECTION:
www.fb.com.        570    IN    CNAME    www.facebook.com.
;; Query time: 68 msec
;; SERVER: 208.67.222.222#53(208.67.222.222)
;; WHEN: Sun Sep 06 23:48:17 IST 2020
;; MSG SIZE  rcvd: 66

3.完整的DNS解析

Dig實用程序具備一個有趣的標誌+trace,它能夠模擬DNS服務器如何解析查詢。Dig會從根域開始迭代解析查詢中的域名。您甚至能夠將其與上圖進行比較。最後,咱們獲得告終果-的別名www.duckduckgo.com.以及與別名相關聯的Type A資源記錄。要求您檢查輸出。使用該+trace標誌時,輸出僅包含響應,而且在響應的每一個部分的底部都有已答覆或被查詢的DNS服務器的FQDN。

如今忽略NSEC3RRSIG資源記錄。

neeraj@mrm:~$ dig www.duckduckgo.com  +trace
; <<>> DiG 9.16.1-Ubuntu <<>> www.duckduckgo.com +trace
;; global options: +cmd
.            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.
.            518400    IN    RRSIG    NS 8 0 518400 20200919050000 20200906040000 46594 . shcVsOdL/w+sH9xm8cdCgjCgu2feO/b5J7HAg8SdyHa1pzh/VSO+PL6N kLac2uYQZ//3bkPjPa1lRdBUTQvFfYWKRKz385NldCl1CSBMc5rpjyx3 qPgz21JVmV7BWzfehqduOhAQ0tk0+wahbcjEW3IfDydfpR+NXBh+DQg/ GSTZoXlfQ3UubGPdzIX9ihyRVwWe/dM5xc3ooLi/exPcNSm2exdpgHHY VsIWarQapYGFIbdrsNstevhrRp91ClfLm88ZwPEtjVjPoW3T7yffsC/O 7YNRc9q7g59srKAKaUHhjXx01HaXG/3SGKrsnQRgfTP6t8Tmdu/0fFGI erH7AQ==
;; Received 525 bytes from 208.67.222.222#53(208.67.222.222) in 59 ms
com.            172800    IN    NS    a.gtld-servers.net.
com.            172800    IN    NS    b.gtld-servers.net.
com.            172800    IN    NS    c.gtld-servers.net.
com.            172800    IN    NS    d.gtld-servers.net.
com.            172800    IN    NS    e.gtld-servers.net.
com.            172800    IN    NS    f.gtld-servers.net.
com.            172800    IN    NS    g.gtld-servers.net.
com.            172800    IN    NS    h.gtld-servers.net.
com.            172800    IN    NS    i.gtld-servers.net.
com.            172800    IN    NS    j.gtld-servers.net.
com.            172800    IN    NS    k.gtld-servers.net.
com.            172800    IN    NS    l.gtld-servers.net.
com.            172800    IN    NS    m.gtld-servers.net.
com.            86400    IN    DS    30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766
com.            86400    IN    RRSIG    DS 8 1 86400 20200919050000 20200906040000 46594 . RQNHtH2zX1hOpuchqw/ZFwRgDQU6oIvSNtUIWq2vnKKKmi0GL1eOJSPX zkEVq2vhSAjpfwqruMzSEL+fa4el1lA9ufC7lfOzONAIsvasPEyMxqDB qA8KxfdJNbBClA6iDiFvqP5zzNlgD2npNDIy4moxfhoM6bHqRYvBNqFC Sthsd3lA2rGcGJ0sbXYUaSSkqTABb+d8MqUifls5UHkGboWIs9hgTySZ oMnygnwolMJjE74xipQTD+FinBiUcfyRhe6BD/bO2JOkC6HyKRqfacBE 1xvGp7GGXJJ4DF8RY+rNuhWZrzx/U4yBThKHTZipaAwnLx1/MAy7wPLo 78bgug==
;; Received 1178 bytes from 198.97.190.53#53(h.root-servers.net) in 63 ms
duckduckgo.com.        172800    IN    NS    dns1.p05.nsone.net.
duckduckgo.com.        172800    IN    NS    dns2.p05.nsone.net.
duckduckgo.com.        172800    IN    NS    dns3.p05.nsone.net.
duckduckgo.com.        172800    IN    NS    dns4.p05.nsone.net.
duckduckgo.com.        172800    IN    NS    ns04.quack-dns.com.
duckduckgo.com.        172800    IN    NS    ns03.quack-dns.com.
duckduckgo.com.        172800    IN    NS    ns02.quack-dns.com.
duckduckgo.com.        172800    IN    NS    ns01.quack-dns.com.
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q1GIN43N1ARRC9OSM6QPQR81H5M9A NS SOA RRSIG DNSKEY NSEC3PARAM
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20200910044132 20200903033132 24966 com. K6VW6C0oC+auVPTbHxy4vSc4em0hAvhlzBiLRTqiO+axNGK71dwVKNVP Kzp7ltUjiuPvNtA0FxvwR8OwN57WXO7tR7tQWaWeE7+VhqPQMYuYa6dT 3HMFHa9udTCFyG5qdOZeYCPmfOon6un4IijrJ+yyDV817BGOvRfPsmUj fpENyGNckI0m/gNJ5ZfxECSTtxEJkMOjuHlIm7ETJ+qmow==
BN1FJS0UO0RMBT477B345GNU6A9CFODA.com. 86400 IN NSEC3 1 1 0 - BN1FSPPU7UST4HCP0ADMG9U117OMTH0V NS DS RRSIG
BN1FJS0UO0RMBT477B345GNU6A9CFODA.com. 86400 IN RRSIG NSEC3 8 2 86400 20200911053325 20200904042325 24966 com. Ec2/Sko4MmcDqenrDWRbHPk1NBc2fvkqPUmjTw2YZCgUI/Okj1QBytgt TgHK3zrpMUW6hBwyCdn3ewa6lt3FgOvCSY33/t9SgQDLz5cbqaOk+kYV ZYXtv5H3OdyK22vbO5SPvXMssMHhYbKqU+2M3IM7WN8PuQJ/BdpOQ4qG sbYgG19C3KDoYM0U5oMsvFmBIMzEPJR+BJ/f+1lqYvZ9qQ==
;; Received 947 bytes from 192.48.79.30#53(j.gtld-servers.net) in 199 ms
www.duckduckgo.com.    86400    IN    CNAME    duckduckgo.com.
duckduckgo.com.        200    IN    A    40.81.94.43
;; Received 77 bytes from 148.163.196.65#53(ns02.quack-dns.com) in 187 ms

輸出說明:

  • Dig首先向DNS服務器詢問根域的名稱服務器。
  • h.root-servers.net而後,查詢根domain()的名稱服務器之一以獲取com.名稱服務器。
  • 而後com.域名服務器h.root-servers.net中查詢的域名服務器duckduckgo.com.和挖掘獲得所要求的響應。
  • 最後,ns02.quack-dns.com名稱服務器用CNAMEA鍵入資源記錄進行回覆。若是您在CNAME此處注意到資源記錄,則無需www.在前面添加duckduckgo.com訪問網站。

瞧!我但願本文能幫助您瞭解DNS的基本工做原理。

相關文章
相關標籤/搜索