在上一篇《DNS 系列(一):為什麼更新了 DNS 記錄不生效?》中,我們主要講解了 DNS 和 DNS 傳播,知道了網路通訊主要通過 IP 地址來進行,而域名系統(DNS)則是保證使用者在瀏覽器中輸入域名之後,可以存取到對應的網站伺服器。那這個過程到底是如何進行的呢?
DNS 記錄是位於權威 DNS 伺服器中的指令,提供域和主機名相關的詳細資訊,包括哪些 IP 地址與該域關聯,以及如何處理對該域的請求。
當我們在瀏覽器中輸入網站地址時,瀏覽器首先要會在計算機內部快取中查詢屬於該域名的 IP 地址,如果沒有再到網路提供商的資料庫或其他 DNS 伺服器中查詢。
DNS 記錄由一系列 DNS 語法編寫的文字檔案組成。每個 DNS 記錄都有一個單獨的行。記錄通常遵循以下格式:
<name> <ttl> <class> <type> <rdlength> <radata>
< name >:指域,即使用者在瀏覽器中輸入的名稱
< ttl >:TTL 代表「生存時間」,表示記錄可以臨時儲存在快取中的時間(以秒為單位)
< class >:理論上,DNS 記錄有不同的類別。然而實際中,記錄常是 Internet(即 IN),
< type >:不同的記錄型別
< rdlength >:指定後續資料欄位的大小(可選值)
< rdata >:解析出的域名資訊(例如 IP 地址)
我們可以使用 Dig 命令查詢 DNS 記錄資訊,例如:www.example.com
www.example.com. 69288 IN A 93.184.216.34
這代表著該條記錄可以在快取中儲存 69288 秒,它涉及 Internet 上的 DNS 記錄(IN),並指向了 A 類記錄,同時域名被解析為 IP 地址(93.184.216.34)。
上面我們提到了 DNS 記錄有不同的型別,這其實是指記錄中的資訊型別,比較常見的有以下幾種:
Internet 上大部分 DNS 解析都是通過 A 類記錄進行的,並指向一個 IPv4 地址。通過這個記錄,使用者在瀏覽器中輸入域名後,使用者端向相應的 IP 地址傳送 HTTP 請求。由於 IPv4 地址的大小始終為 4 個位元組,因此 rdlength 的值始終為 4。
AAAA 記錄,也稱為「quad A」,功能與 A 記錄相同。但是,它指向的是 IPv6 地址。因為 IPv6 的長度為 128 位(16 位元組),所以這裡也預定義了 rdlength 為 16。
SOA 記錄包含區域檔案或 DNS 伺服器的區域資訊。 因為 DNS 區域傳輸是將 DNS 記錄資料從一個主名稱伺服器傳送到一個輔名稱伺服器的過程,而 SOA 記錄會首先被傳輸,所以每個 DNS 區域都需要一個 SOA 記錄。
CNAME 記錄(規範名稱記錄)是將記錄值指向一個別名域,而不是 IP 地址。對於這種型別,rdata 欄位會填充一個域名,該域名可以繼續指向下一個域名或 IP 地址。
MX 記錄是指郵件交換或 SMTP 電子郵件伺服器,MX 記錄可以存在多個,通過指定優先順序來確定使用順序。
PTR 記錄(指標)是允許反向查詢的 DNS 記錄。與「A」記錄恰好相反,它可以通過 IP 地址來查詢對應的域名。
NS (域名伺服器)記錄會明確特定區域的管轄權。一個域通常會有多個 NS 記錄,這些記錄可指示該域的主要和輔助域名伺服器。正確設定的 NS 記錄能告訴網際網路可從哪裡找到域的 IP 地址,從而完成載入網站或應用程式。
TXT 記錄包含了供使用者或機器可讀資訊的文字。一個域可以有許多 TXT 記錄。
通過 SRV 記錄,伺服器可以為一些特定的服務提供主機和埠資訊,例如即時通訊等。一些網際網路協定需要使用 SRV 記錄才能運作。
除了這些常見的 DNS 記錄,還有很多不常用的記錄型別,例如:APL、CAA、DNAME 等等。瞭解了 DNS 記錄,下一步就來詳細看看 DNS 是如何請求到這些記錄的。
每當我們在瀏覽器的搜尋欄中輸入網址時,都會先向本地名稱伺服器(Local DNS)發出請求。Local DNS 是一個檢查記錄是否在本地快取中的元件,它的查詢是遞迴/迭代查詢。
使用者端和 Local DNS 是遞迴查詢,這是最常見的一種查詢方式。具體來說就是如果 Local DNS 不能響應請求,它會代替使用者端向其他根域名伺服器繼續發出查詢請求,即替使用者端繼續查詢,而不是讓使用者端自己進行下一步查詢。
而 Local DNS 和其他名稱伺服器之間是迭代查詢。具體表現為如果 Local DNS 請求的 DNS 伺服器無法回答查詢,那麼它會返回下一個 DNS 伺服器的地址作為應答。然後 Local DNS 再向下一個 DNS 伺服器傳送一個新請求,繼續查詢直至查到記錄。
所以 Local DNS 的查詢總體過程是首先將之前獲取過的 IP 地址記錄到快取中,並根據請求將結果傳遞給使用者端。如果所需的記錄不在 Local DNS 快取中,則請求將轉發到對應網路服務商的 DNS 伺服器。如果當前 DNS 伺服器無法應答本次查詢,它會將請求轉發到不同的 DNS 伺服器。
需要注意的是遞迴查詢通常會比迭代查詢更快。因為遞迴 DNS 伺服器會快取它執行的每個查詢結果,並將結果儲存一個 TTL 時間。當遞迴解析器接收到其快取中已有的 IP 地址查詢時,它可以快速將結果提供給使用者端,而無需與其他 DNS 伺服器進行通訊。但是,在開放的 DNS 伺服器上允許遞迴查詢會產生安全漏洞,這種設定容易遭到 DNS 放大攻擊和 DNS 快取中毒。
瞭解了DNS的記錄,下次大家再遇到網站無法存取的錯誤資訊時,就可以優先排查是不是 DNS 出現了問題。如果你是網站管理者,可以檢視 DNS 記錄是否設定錯誤,或者 DNS 伺服器是否無法響應。如果你是網站存取者,可以嘗試切換網路或者更換本地 DNS 來解決。