Alkaidcc

Alkaidcc

就算失败也没关系:)
jike
twitter
github

DNS是什麼?它是如何工作的

DNS 是什麼?#

DNS,全稱 Domain Name System,即域名系統。

dns.png

DNS 的作用#

DNS 的作用就是將域名轉換為 IP 地址

DNS 的意義#

DNS 的作用就是將域名轉換為 IP 地址,使得人們不用記憶複雜的數字,轉而記憶有意義的域名。

DNS 如何工作?#

我們可以簡單地把 DNS 的工作流程看做:一個圖書管理員在一個很大的圖書館裡找一本圖書。

涉及網頁加載的 4 個伺服器#

DNS 遞歸解析器(DNS Recursive Resolver)

  • 角色:圖書管理員
  • DNS 遞歸解析器是一種伺服器 / 計算機,通過 Web 瀏覽器等應用程序接收客戶端計算機的查詢。解析器一般負責發出其他請求以滿足客戶端 DNS 的查詢。

dns-record-request-sequence-1.webp

根域名伺服器(Root nameserver)

  • 角色:指向不同書架的索引
  • 根域名伺服器是將主機名轉換成 IP 地址的第一步

TLD 名稱伺服器(Top Level Domain Server)

  • 角色:圖書館中一個特定的書架
  • 伺服器上托管了主機名的最後一部分(例如:example.com 中,TLD 伺服器為”com”)

權威性域名伺服器(authoritative nameserver)

  • 角色:書架上的字典
  • 權威域名伺服器是域名伺服器查詢中的最後一站。如果權威性域名伺服器能夠訪問請求的記錄,則其會將已請求主機名的 IP 地址返回到發出初始請求的 DNS 解析器(圖書管理員)。

dns-record-request-sequence-2.webp

DNS 查找的步驟#

DNS 查詢過程

DNS 查詢過程

  1. 用戶在 Web 瀏覽器中鍵入 “example.com”,查詢傳輸到 Internet 中,並被 DNS 遞歸解析器接收。
  2. 接著,解析器查詢 DNS 根域名伺服器(.)。
  3. 根伺服器使用存儲其域信息的頂級域(TLD)DNS 伺服器(例如 .com 或 .net)的地址響應該解析器。在搜索 example.com 時,我們的請求指向 .com TLD。
  4. 解析器向 .com TLD 發出請求。
  5. TLD 伺服器隨後使用該域的域名伺服器 example.com 的 IP 地址進行響應。
  6. 遞歸解析器將查詢發送到域的域名伺服器。
  7. 域名伺服器把example.com 的 IP 地址返回解析器。
  8. 然後 DNS 解析器使用最初請求的域的 IP 地址響應 Web 瀏覽器。(此時瀏覽器才算拿到 IP)
  9. 瀏覽器向該 IP 地址發出 HTTP請求。
  10. 位於該 IP 的伺服器返回將在瀏覽器中呈現的網頁。

DNS 查詢有哪些類型?#

  1. 遞歸查詢

    在遞歸查詢中,客戶端要求 DNS 伺服器(一般為 DNS 遞歸解析器)將使用所請求的資源記錄響應客戶端,或者如果解析器無法找到該記錄,則返回錯誤消息。

  2. 迭代查詢

    DNS 客戶端將允許 DNS 伺服器返回其能夠給出的最佳應答。如果所查詢的 DNS 伺服器與查詢名稱不匹配,則伺服器將返回對較低級別域名空間具有權威性的 DNS 伺服器的引用。然後,DNS 客戶端將對引用地址進行查詢。此過程繼續使用查詢鏈中的其他 DNS 伺服器,直至發生錯誤或超時為止。

  3. 非遞歸查詢

    當 DNS 解析器客戶端查詢 DNS 伺服器以獲取其有權訪問的記錄時通常會進行此查詢,因為其對該記錄具有權威性,或者該記錄存在於其緩存內。DNS 伺服器通常會緩存 DNS 記錄,以防止更多帶寬消耗和上游伺服器上的負載。

什麼是 DNS 緩存,緩存存放在哪裡,作用是什麼,緩存如何工作?#

緩存的目的就是將數據臨時存放在某個位置,從而在之後的響應中,能夠把存放在某個位置的數據直接返回。DNS 的高速緩存將數據存儲在更靠近請求客戶端的位置,以便盡早地解析 DNS 查詢,並且能夠避免 DNS 查找鏈中進一步的額外查詢,從而加快速度,縮短加載時間。

DNS 數據可以緩存到不同的位置,每個位置的存儲數據的有效期由 TTL(生存時間)決定。

瀏覽器 DNS 緩存#

現代 Web 瀏覽器設計為默認將 DNS 記錄緩存一段時間。目的很明顯;越靠近 Web 瀏覽器進行 DNS 緩存,為檢查緩存並向 IP 地址發出正確請求而必須採取的處理步驟就越少。發出對 DNS 記錄的請求時,瀏覽器緩存是針對所請求的記錄而檢查的第一個位置

操作系統 DNS 緩存#

操作系統級 DNS 解析器是 DNS 查詢離開您計算機前的第二站,也是本地最後一站。操作系統內旨在處理此查詢的過程通常稱為 “存根解析器” 或 DNS 客戶端。當存根解析器獲取來自某個應用程序的請求時,首先檢查自己的緩存,看是否有這條記錄。如果沒有,則將本地網絡外部的 DNS 查詢(設置了遞歸標記)發送到 Internet 服務提供商(ISP)內部的 DNS 遞歸解析器。

當 ISP 內的遞歸解析器收到 DNS 查詢時,其還將查看所請求的主機到 IP 地址轉換是否已經存儲在 ISP 的本地持久性層中。

Hosts File#

本地的 hosts 文件

高速緩存如何工作#

DNS 解析器會將對 IP 地址查詢的響應保存一定的時間。這樣,解析器可以更快地響應未來的查詢,並且無需與典型 DNS 解析過程中涉及的許多伺服器進行通信。只要與該 IP 地址關聯的指定生存時間 (TTL) 允許,DNS 解析器就會將響應保存在其高速緩存中。

無緩存

dns-uncached-response.png

有緩存:

dns-cached-response.jpg


什麼是 DNS A 記錄#

Address Record. Indicates the IP of the domain.

“A” 代表”Address“地址,這是最基礎的 DNS 記錄類型,它表示給定域的 IP 地址。比如拉取 [cloudflare.com](http://cloudflare.com)的 DNS 記錄,A 記錄返回的 IP 地址為:104.17.210.9

”AAAA” 代表 IPv6 地址

什麼時候使用 DNS A 記錄#

A 記錄最常見的用途是 IP 地址查找,將域名與 IPv4 地址進行匹配

什麼是 MX 記錄#

Mail Exchanger. Helps route the emails to the relevant server.

DNS “郵件交換”(MX) 記錄將電子郵件定向到郵件伺服器。MX 記錄指示如何根據簡單郵件傳輸協議(SMTP,所有電子郵件的標準協議)路由電子郵件。與 CNAME 記錄類似,MX 記錄必須始終指向另一個

郵件傳輸代理 (MTA) 軟件負責查詢 MX 記錄。當用戶發送電子郵件時,MTA 會發送一個 DNS 查詢,以確定電子郵件收件人的郵件伺服器。MTA 與這些郵件伺服器建立 SMTP 連接,從優先級高的域開始(在上面的第一個示例中,即為 mailhost1)。

什麼是 NS 記錄#

Name server Record. Indicates the authoriative servers.

NS 代表 “域名伺服器”,域名伺服器記錄指示哪個 DNS伺服器對該具有權威性(即,哪個伺服器包含實際 DNS 記錄)。基本上,NS 記錄告訴互聯網可從哪裡找到域的 IP 地址。一個域通常會有多個 NS 記錄,這些記錄可指示該域的主要和輔助域名伺服器。倘若沒有正確配置的 NS 記錄,用戶將無法加載網站或應用程序。

什麼是 CNAME 記錄#

Canonical name. Points a domain or subdomain to another domain.

當域名或子域名是另一個域名的別名時,使用 “規範名稱”(CNAME) 記錄代替 A 記錄。所有 CNAME 記錄必須指向一個域,而不是一個 IP 地址。想像一個尋寶遊戲,每條線索指向另一條線索,最後一條線索指向寶藏。具有 CNAME 記錄的域就像一條線索,可以將您指向另一個線索(具有 CNAME 記錄的另一個域)或寶藏(具有 A 記錄的域)

例如,假設 blog.example.com 的 CNAME 記錄的值為 “example.com”(沒有 “blog”)。這意味著當 DNS伺服器點擊 blog.example.com 的 DNS 記錄時,它實際上會觸發另一個對 example.com 的 DNS 查找,並通過其 A 記錄返回 example.com 的 IP 地址。在這種情況下,我們會說 example.com 是 blog.example.com 的規範名稱(或真實名稱)。

一個常見的誤解是 CNAME 記錄必須始終解析為其指向的域所在的網站,但事實並非如此。CNAME 記錄僅將客戶端指向與根域相同的 IP 地址。** 客戶端訪問該 IP 地址後,Web 伺服器仍將相應地處理 URL。** 例如,blog.example.com 可能有一個 CNAME 指向 example.com,從而將客戶端定向到 example.com 的 IP 地址。但是,當客戶端實際連接到該 IP 地址時,Web 伺服器將查看 URL,發現它是 blog.example.com,並且提供博客頁面而不是主頁。(同一個 IP,Web 伺服器根據路由來顯示內容)

什麼是域名#

域名是一個文本字符串,映射到一個數字 IP 地址,可用於從客戶端軟件訪問網站。用簡單的語言來說,域名是用戶在瀏覽器窗口中鍵入以訪問特定網站的文本。例如,Google 的域名是 “google.com”。

域名有哪些組成部分#

域名通常分為兩個或三個部分,各個部分用一個點分隔。從右到左閱讀時,域名中的標識符從最廣泛到最具體。域名中最後一個點右邊的部分是頂級域 (TLD)。其中包括 “.com”、“.net” 和 “.org” 等 “通用” TLD,以及 “.uk” 和 “.jp” 等特定國家 / 地區的 TLD。

TLD 的左側是第二級域(2LD),如果 2LD 的左側有任何內容,則稱為第三級域(3LD)。我們來看個例子:

對於 Google 的美國域名,“google.com”:

  • “.com” 是 TLD(最廣泛)
  • “google” 是 2LD (最具體)

域名和 URL 有什麼區別#

統一資源定位符(URL)有時也稱為網址,包含站點的域名以及其他信息,如傳輸協議和路徑等。例如,在https://cloudflare.com/learning/ 中,“cloudflare.com” 是域名,而 “https” 是協議,“/learning/” 是指向網站上特定頁面的路徑

涉及 DNS 的攻擊有哪些#

DNS 欺騙 / 緩存中毒

這是將偽造的 DNS 數據引入 DNS 解析器緩存中的攻擊,其將導致解析器返回域的錯誤 IP 地址
。流量可能會被轉移到惡意計算機或攻擊者想要的其他任何位置,而不是前往正確網站;

打個比方,畢業班的學生做了一個惡作劇,畢業班學生調換他們校園內的所有教室號,使得那些不知道校園佈局的新生第二天迷路並出現在錯誤的教室中。現在想像一下,不匹配的教室號(記錄)到校園指示牌(目錄)中,學生不斷前往錯誤的教室,直到有人最終注意到並更正了目錄為止。

因為 DNS 解析器通常無法驗證其緩存中的數據,因此錯誤 DNS 信息會保留在緩存中,直到生存時間(TTL)到期或手動將其移除為止。許多漏洞可能使 DNS 中毒,但主要問題是 DNS 是為遠遠更小的 Internet 構建的,並且基於信任原則(非常類似於 BGP)。一種更安全的 DNS 協議稱為 DNSSEC,其旨在解決其中的一些問題,但尚未得到廣泛採用。

DNS 隧道

這種攻擊使用其他協議通過 DNS 查詢和響應建立隧道。攻擊者可以使用 SSH、TCP或 HTTP在大多數防火牆未察覺的情況下將惡意軟件或被盜信息傳遞到 DNS 查詢中。

DNS 劫持

在 DNS 劫持中,攻擊者將查詢重定向到其他域名伺服器。這可通過惡意軟件或未經授權的 DNS 伺服器修改來實現。儘管其結果與 DNS 欺騙的結果相似,但這是一種截然不同的攻擊,因為其目標是域名伺服器上網站的 DNS 記錄,而不是解析器的高速緩存。

如何使 DNS 緩存中毒#

攻擊者可通過假冒 DNS 域名伺服器,向 DNS 解析器發出請求,然後在 DNS 解析器查詢域名伺服器時偽造答復,使 DNS 緩存中毒。這之所以可能,是因為 DNS 伺服器使用 UDP 而非 TCP,並且目前沒有對 DNS 信息的驗證

為什麼攻擊者很容易偽造請求和答復?

DNS 請求和相應均使用的是 UDP 協議而不是 TCP 協議,因此 UDP 很容易偽造 – 攻擊者可通過 UDP 發送消息,並通過偽造標頭數據來假裝這是來自合法伺服器的響應。

如果 DNS 解析器收到偽造的響應,它會不加鑑別地接受並緩存這些數據,因為無法驗證這些信息是否正確且來自合法來源(UDP 是單向的)。

dns-cache-poisoning-attack.jpg

中毒的 DNS 緩存

dns-cache-poisoned.jpg

TTL 的作用#

TTL 的設置會影響更新。舉個例子:當 TTL 設置為 30 秒,第二次 DNS 查詢請求過期的時候,緩存過期,會得到最新的版本。如果 TTL 設置為 300000 秒,即使更改了 DNS 解析記錄,也無法馬上得到修改相應,必須等待 DNS 緩存過期。

如何讓一個多台設備 / 多個服務共享一個域名(負載均衡)#

創建兩條 DNS 解析,相同的域名分別指向不同的 IP。

當我們訪問這個域名的時候,觸發 DNS 查詢請求,這時候 DNS 解析器(Resolver)找到兩條符合的記錄。它將決定以哪種順序返回它們,可能是以下幾種方式的一種

  1. 以收到它們的相同順序返回記錄
  2. 每次收到請求都改變順序
  3. 隨機挑選一個順序
  4. 別的一些什麼

參考#

什麼是 DNS_DNS 如何工作

DNS in One Picture (roadmap.sh)

what-is-dns-poisoning-and-dns-spoofing

What is a Domain Name? - Learn web development | MDN (mozilla.org)

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。