上一篇有介紹到 DNS 協定,原本預定要講「DNSSEC」了。不過,寫了一半之後,發現之前沒有很清楚地提到細節和流程,也沒有提到各種不同的 DNS 伺服器角色。
這篇需要補充一下上一篇遺漏的資訊。
首先介紹這種 DNS 伺服器。在每一種狀況下,可以分為:
權威 (Authoritative) DNS
權威 DNS 是指受到上一級網域授權,能夠對這個網域做解析,也可以把解析的「權力」轉給別人。
例如說 .com
網域是由 VeriSign
這公司管理的,這公司授權 ns.evsfy.com
可以解析 evsfy.com
的請求,這台伺服器寫了 NS ns.evsfy2.com
,那麼 ns.evsfy2.com
即是 evsfy.com
的權威伺服器。
遞歸 (Recursive) DNS
負責接受 DNS 請求,若當下並沒有紀錄的話,去問別台伺服器,並將結果返回給客戶端。遞歸 DNS 是可以做快取的(上一篇提到),所以不必每被問一次就重問一次。這伺服器通常是網域商或 ISP 提供的,不過每個人都能架,例如 8.8.8.8
(Google)。
轉發 (Forwarding) DNS
也是負責接受請求,也有快取,不過實際上後面是接別台 DNS 伺服器,然後把請求轉發。這個主要是拿架在區域網路和網際網路的介接點之間(或是架在不能直接連上網際網路的地方)。不過,由於要隔著一層,所以速度等等會比較慢。
DNS 請求的流程,實際上可以分成幾個步驟。
準備,然後先問「轉發 DNS」(如果有的話)
由於機器本身通常會有 DNS 快取,所以遇到一個網域的時候,通常會先查快取。如果沒有的話,就會去問「轉發 DNS」。如果都沒有的話,就需要開始進行「問別人」的動作。
另外,由於 DNS 查詢動作是一環扣一環的,所以若有轉發 DNS,那麼就會是轉發 DNS 幫你做出一層一層的查詢請求。
問「遞歸 DNS」
在上一步驟中,如果沒有快取的話,即會去找設定中的「遞歸 DNS」。通常大部分請求都會在這裡結束,不過也有可能連這裡都沒有記錄,於是這台伺服器就會幫你往下問。
大部分「奇怪的事情」也是在這裡發生,例如某些 DNS 可能會將網路變慢或是直接不解析某些網站⋯⋯。
另外,遞歸 DNS 都會保留一份「根 DNS」的名單。
問「根 DNS」
如果上一步都還沒解析成功的話,就會到這一步。這邊不會有結果,不過頂級網域的 DNS 會直接從「右往左」看,然後回覆說「這是屬於哪個頂級網域 DNS 的,你可以去問他」。
問「頂級網域的 DNS」
每個「頂級網域」都有自己的 DNS,不過這裡也不會有答案,但他會說「我知道可以去問誰,這個網域的 DNS 伺服器是 ns.question.com
問「權威 DNS」
最後向這台伺服器請求我們需要的 DNS 紀錄,然後將紀錄拿回來,放在快取之中。由於 DNS 記錄都有設定「有效期限」,所以經過這個期限之後,這個記錄就會從快取中被移除。
如前面提到的,DNS 協定並沒有做防護機制。這是因為,DNS 協定一開始僅考慮到可擴產性。但隨著時間經過,開始會越來越需要做防護措施,於是有人提出了 DNSSEC (Domain Name System Security Extensions)。
DNSSEC 的目標是:保護應用(和 DNS 伺服器),不受到偽造的 DNS 記錄影響。在使用 DNSSEC 的狀況下,所有的 DNS 回覆都應該要附上數位簽章。透過檢查數位簽章內容的有效性,接受到 DNS 回覆的一方可以確定這個資訊是安全、完整、沒有被竄改過的。
DNSSEC 可以保護任何型別的 DNS 記錄,例如前一篇提到的:A/AAAA、TXT、MX 等等,也可以通過配合 TXT 等紀錄,進一步配合其他協定來做進階的驗證,甚至也能夠將憑證放在 DNS 當中。
不過,DNSSEC 並不保證資料不被「偷看」。明確一點來說:使用 DNSSEC 的狀況下,資料是「正確」的,但是沒有「加密」。DNSSEC 也不保證伺服器不會被攻擊(或 DoS)。
有關 DNSSEC 的詳細內容,可以參考 IETF 文件:
下一篇會提到,DNSSEC 的運作方式。