域名解析

**網域名稱系統**（英語：**D**omain **N**ame **S**ystem，縮寫：**DNS**）是網際網路的一項服務。它作為將域名和 IP 位址相互對映的一個分散式資料庫，能夠使人更方便地存取網際網路。DNS 使用 TCP 和 UDP 埠 53。當前，對於每一級域名長度的限制是 63 個字元，域名總長度則不能超過 253 個字元。

開始時，域名的字元僅限於 ASCII 字元的一個子集。2008 年，ICANN 通過一項決議，允許使用其它語言作為網際網路頂級域名的字元。使用基於 Punycode 碼的 IDNA 系統，可以將 Unicode 字串對映為有效的 DNS 字元集。因此，諸如「XXX. 中國」、「XXX. 台灣」的域名可以在網址列直接輸入並存取，而不需要安裝外掛程式。但是，由於英語的廣泛使用，使用其他語言字元作為域名會產生多種問題，例如難以輸入、難以在國際推廣等。

## 歷史

DNS 最早於 1983 年由保羅・莫卡派喬斯（Paul Mockapetris）發明；原始的技術規範在 882 號網際網路標準草案（RFC 882）中發布。1987 年發布的第 1034 和 1035 號草案修正了 DNS 技術規範，並廢除了之前的第 882 和 883 號草案。在此之後對網際網路標準草案的修改基本上沒有涉及到 DNS 技術規範部分的改動。

早期的域名必須以英文句號 `.` 結尾。例如，當使用者存取 的 HTTP 服務時必須在網址列中輸入：`http://www.wikipedia.org.`，這樣 DNS 才能夠進行域名解析。如今 DNS 伺服器已經可以自動補上結尾的句號。

## 記錄類型

DNS 系統中，常見的資源記錄類型有：

* 主機記錄（A 記錄）：RFC 1035 定義，A 記錄是用於名稱解析的重要記錄，它將特定的主機名對映到對應主機的 IP 位址上。
* 別名記錄（CNAME 記錄）: RFC 1035 定義，CNAME 記錄用於將某個別名指向到某個 A 記錄上，這樣就不需要再為某個新名字另外建立一條新的 A 記錄。
* IPv6 主機記錄（AAAA 記錄）: RFC 3596 定義，與 A 記錄對應，用於將特定的主機名對映到一個主機的 IPv6 位址。
* 服務位置記錄（SRV 記錄）: RFC 2782 定義，用於定義提供特定服務的伺服器的位置，如主機（hostname），埠（port number）等。
* 域名伺服器記錄（NS 記錄） ：用來指定該域名由哪個 DNS 伺服器來進行解析。 您註冊域名時，總有預設的 DNS 伺服器，每個註冊的域名都是由一個 DNS 域名伺服器來進行解析的，DNS 伺服器 NS 記錄位址一般以以下的形式出現： ns1.domain.com、ns2.domain.com 等。 簡單的說，NS 記錄是指定由哪個 DNS 伺服器解析你的域名。
* NAPTR 記錄：RFC 3403 定義，它提供了正規表示式方式去對映一個域名。NAPTR 記錄非常著名的一個應用是用於 ENUM 查詢。

## 傳輸協定

### DNS-over-UDP/53 ("Do53")

從 1983 年起源到最近，DNS 主要回答 UDP 埠 53 上的查詢。此類查詢包括從客戶端以單個 UDP 封包傳送的明文請求，回應為 從伺服器以單個 UDP 封包傳送的明文回覆。 當應答的長度超過 512 位元組並且客戶端和伺服器都支援 DNS 擴充機制 (EDNS) 時，可能會使用更大的 UDP 封包。 DNS-over-UDP 的使用受到限制，其中包括缺乏傳輸層加密、身分驗證、可靠傳遞和訊息長度。

### DNS-over-TCP/53 ("Do53/TCP")

1989 年，RFC 1123 為 DNS 查詢、回覆，特別是區域傳輸指定了可選的 TCP 傳輸。 通過長回應的分段，TCP 允許更長的回應、可靠的傳遞和重用客戶端和伺服器之間的長期連接。

### DNS-over-TLS ("DoT")

加密 DNS 的 IETF 標準於 2016 年出現，利用傳輸層安全 (TLS) 來保護整個連接，而不僅僅是 DNS 有效負載。DoT 伺服器偵聽 TCP 埠 853。RFC 7858 指定可以支援機會加密和認證加密，但沒有強制伺服器或客戶端認證。

### DNS-over-HTTPS ("DoH")

2018 年引入了 DNS 查詢傳輸的競爭標準，通過 HTTPS 隧道傳輸 DNS 查詢資料（進而通過 TLS 傳輸 HTTP）。DoH 被推廣為對網路更友好的 DNS 替代方案，因為與 DNSCrypt 一樣，它在 TCP 埠 443 上傳輸，因此看起來類似於網路流量，儘管它們在實踐中很容易區分。 DoH 因相對於 DoT 降低使用者匿名性而受到廣泛批評。

### Oblivious DNS ("ODNS") and Oblivious DoH ("ODoH")

Oblivious DNS (ODNS) 是由普林斯頓大學和芝加哥大學的研究人員發明和實施的，作為未加密 DNS 的擴充，在 DoH 本身被標準化和廣泛部署之前。Apple 和 Cloudflare 隨後將該技術部署在 DoH 環境中，稱為 Oblivious DoH (ODoH)。ODoH 將入口 / 出口分離（在 ODNS 中發明）與 DoH 的 HTTPS 隧道和 TLS 傳輸層加密結合在一個協定中。

### DNS-over-TOR

與其他 Internet 協定一樣，DNS 可以通過 VPN 和隧道執行。 DNS-over-Tor 自 2019 年以來已經變得足夠普遍以保證其自己經常使用的首字母縮略詞的一種用途。Oblivious DNS 的隱私效果可以通過使用預先存在的入口和出口節點的 Tor 網路以及 TLS 提供的傳輸層加密來獲得。

### DNS-over-QUIC ("DoQ")

網際網路工程任務組的 RFC 9250 描述了 DNS over QUIC。

### DNSCrypt

DNSCrypt 協定於 2011 年在 IETF 標準框架之外開發，在遞迴解析器的下游側引入了 DNS 加密，其中客戶端使用伺服器的公鑰加密查詢有效負載，這些公鑰在 DNS 中發布（而不是依賴於第三方方憑證頒發機構），進而可能受到 DNSSEC 簽章的保護。DNSCrypt 使用 TCP 或 UDP 埠 443，與 HTTPS 加密的網路流量相同的埠。這不僅引入了關於查詢內容的隱私，而且還引入了防火牆穿越能力的重要衡量標準。在 2019 年，DNSCrypt 進一步擴充以支援「匿名」模式，類似於提議的「Oblivious DNS」，其中入口節點接收已使用不同伺服器的公鑰加密的查詢，並將其轉發給該伺服器伺服器充當出口節點，執行遞迴解析。建立使用者 / 查詢對的隱私，因為入口節點不知道查詢的內容，而出口節點不知道客戶端的身分。 DNSCrypt 於 2011 年 12 月由 OpenDNS 首次在生產環境中實現。有幾個免費和開源軟體實現額外整合了 ODoH。它適用於各種作業系統，包括 Unix、Apple iOS、Linux、Android 和 MS Windows。

## 技術實現

### 概述

DNS 通過允許一個名稱伺服器把它的一部分名稱服務（眾所周知的 zone）「委託」給子伺服器而實現了一種階層的名稱空間。此外，DNS 還提供了一些額外的資訊，例如系統別名、聯絡資訊以及哪一個主機正在充當系統組或域的郵件樞紐。

任何一個使用 IP 的電腦網路可以使用 DNS 來實現它自己的私有名稱系統。儘管如此，當提到在公共的 Internet DNS 系統上實現的域名時，術語「域名」是最常使用的。

這是基於 984 個全球範圍的「根域名伺服器」（分成 13 組，分別編號為 A 至 M）。從這 984 個根伺服器開始，餘下的 Internet DNS 命名空間被委託給其他的 DNS 伺服器，這些伺服器提供 DNS 名稱空間中的特定部分。

### 軟體

DNS 系統是由各式各樣的 DNS 軟體所驅動的，例如：

* BIND（Berkeley Internet Name Domain），使用最廣的 DNS 軟體
* DJBDNS（Dan J Bernstein's DNS implementation）
* MaraDNS
* Name Server Daemon（Name Server Daemon）
* PowerDNS
* Dnsmasq

### 國際化域名

**Punycode** 是一個根據 RFC 3492 標準而製定的編碼系統，主要用於把域名從地方語言所採用的 Unicode 編碼轉換成為可用於 DNS 系統的編碼。而該編碼是根據域名相異字表 （頁面存檔備份，存於網際網路檔案館）（由 IANA 制定），Punycode 可以防止所謂的 IDN 欺騙。

### 域名解析

舉一個例子，_zh.wikipedia.org_ 作為一個域名就和 IP 位址 _198.35.26.96_ 相對應。DNS 就像是一個自動的電話號碼簿，我們可以直接撥打 _198.35.26.96_ 的名字 _zh.wikipedia.org_ 來代替電話號碼（IP 位址）。DNS 在我們直接呼叫網站的名字以後就會將像 _zh.wikipedia.org_ 一樣便於人類使用的名字轉化成像 _198.35.26.96_ 一樣便於機器辨識的 IP 位址。

DNS 查詢有兩種方式：**遞迴**和**迭代**。DNS 客戶端設定使用的 DNS 伺服器一般都是遞迴伺服器，它負責全權處理客戶端的 DNS 查詢請求，直到返回最終結果。而 DNS 伺服器之間一般採用迭代查詢方式。

以查詢 zh.wikipedia.org 為例：

* 客戶端傳送查詢報文 "query zh.wikipedia.org" 至 DNS 伺服器，DNS 伺服器首先檢查自身快取，如果存在記錄則直接返回結果。
* 如果記錄老化或不存在，則：
  1. DNS 伺服器向根域名伺服器傳送查詢報文 "query zh.wikipedia.org"，根域名伺服器返回頂級域 .org 的頂級域名伺服器位址。
  2. DNS 伺服器向 .org 域的頂級域名伺服器傳送查詢報文 "query zh.wikipedia.org"，得到二級域 .wikipedia.org 的權威域名伺服器位址。
  3. DNS 伺服器向 .wikipedia.org 域的權威域名伺服器傳送查詢報文 "query zh.wikipedia.org"，得到主機 zh 的 A 記錄，存入自身快取並返回給客戶端。

### WHOIS（域名資料庫查詢）

一個域名的**所有者**可以通過查詢 WHOIS 資料庫而被找到；對於大多數根域名伺服器，基本的 WHOIS 由 ICANN 維護，而 WHOIS 的細節則由控制那個域的域序號產生器構維護。

對於 240 多個國家代碼頂級域名（ccTLDs），通常由該域名權威序號產生器構負責維護 WHOIS。例如中國互聯網絡信息中心（China Internet Network Information Center）負責.CN 域名的 WHOIS 維護，香港互聯網註冊管理有限公司（Hong Kong Internet Registration Corporation Limited）負責.HK 域名的 WHOIS 維護，台灣網路資訊中心（Taiwan Network Information Center）負責.TW 域名的 WHOIS 維護。

## 其他

此外，一些駭客通過偽造 DNS 伺服器將使用者引向錯誤網站，以達到竊取使用者隱私資訊的目的。。

## 相關條目

* IP 位址
* 域名
* 域名伺服器記錄類型列表
* 中文域名
* 域名搶注
* 動態 DNS
* ICANN
* 根域名伺服器
* 公共域名解析服務
  * Google Public DNS
  * OpenDNS
  * 1.1.1.1
* 解決域名劫持 / 域名伺服器快取污染的方法
  * DNSSEC
  * DNS over HTTPS
  * DNS over TLS
  * DNS over QUIC
  * DNSCrypt
  * DNSCurve

## 參考文獻

## 外部連結

* DNS 協定詳細資料 （頁面存檔備份，存於網際網路檔案館）
* DNS & BIND Resources（頁面存檔備份，存於網際網路檔案館）
* DNS Security Extensions (DNSS)（頁面存檔備份，存於網際網路檔案館）
* Root Server (EC) （頁面存檔備份，存於網際網路檔案館）