1.4 DNS:網際網路的電話簿#
問題:人記得住 142.250.196.142 嗎?#
1983 年之前,主機名稱靠一個單一檔案 hosts.txt(由 Stanford 維護,各機構定期下載)。主機數量成長後,這個中心化方案必然崩潰:單點故障、更新延遲、命名衝突。
DNS(1983,Paul Mockapetris)的答案是分層的分散式資料庫:
\[ \text{www.example.com}: \text{根 .} \leftarrow \text{com 頂級域} \leftarrow \text{example 權威域} \leftarrow \text{www 主機} \]
分層查詢的完整旅程#
sequenceDiagram
participant B as 瀏覽器
participant R as 本地 Resolver<br/>(ISP 或 8.8.8.8)
participant Root as 根伺服器
participant TLD as .com 伺服器
participant Auth as example.com 權威伺服器
B->>R: www.example.com 的 IP?
R->>Root: 誰管 .com?
Root-->>R: .com 伺服器清單(快取住)
R->>TLD: 誰管 example.com?
TLD-->>R: 權威伺服器位址(快取住)
R->>Auth: www.example.com 的 IP?
Auth-->>R: 93.184.216.34
R-->>B: 回答(並快取)第一個訪問要 3+ 次往返,之後靠快取瞬間完成 —— 快取是 DNS 的生命線,也是本書 2.3 節 CDN 快取體系的原型。
快取層次與 TTL#
\[ \text{查詢命中順序}: \text{瀏覽器快取} \to \text{OS 快取} \to \text{Resolver} \to \text{上游} \]
每筆 DNS 記錄有 TTL(存留時間),決定快取多久。改 DNS 記錄後「要等 TTL 過期」才全球生效 —— 這是部署時的經典陷阱(低 TTL 提前設定是標準做法)。
記錄類型#
| 類型 | 用途 | 例 |
|---|---|---|
| A | 域名 → IPv4 | example.com → 93.184.216.34 |
| AAAA | 域名 → IPv6 | |
| CNAME | 別名 → 另一域名 | www.example.com → example.com |
| MX | 郵件伺服器 | |
| TXT | 任意文字(SPF、網域驗證) | |
| NS | 誰是權威 |
網站部署實務:CDN(2.3 節)的本質就是把域名指向 CDN 的 CNAME,由 CDN 智慧決定回應哪個邊緣節點的 IP。
DNS 的安全演化#
DNS 誕生時的網路是學術圈,完全沒有防偽設計。演化出兩條補強線:
- DNSSEC:以數位簽章鏈(根 → TLD → 域)驗證記錄未被竄改
- DoH / DoT(DNS over HTTPS/TLS):加密查詢本身,防竊聽與劫持
timeline
title DNS 安全補丁史
1983 : DNS 誕生(無安全)
1997 : DNSSEC 規範(RFC 2065)
2008 : Kaminsky 快取毒化漏洞震驚業界
2018 : Firefox 實驗 DoH
2020s : DoH 成為瀏覽器主流2008 年 Kaminsky 漏洞的教訓:猜中查詢 ID 即可偽造回應並污染快取 —— 16 位元的交易 ID 太短,攻擊者每秒可猜數萬次。補丁(隨機埠 + DNSSEC)是典型的「安全性設計不足 → 被攻擊 → 打補丁」的演化路徑。
網站設計者的 DNS 實務#
dig www.example.com +short # 查詢解析結果
dig example.com NS +short # 查詢權威伺服器
- 負載平衡:同一域名回多個 A 記錄,客戶端輪詢
- 地理路由:依查詢來源地回不同 IP(CDN 的基礎設施)
- 健康檢查切換:故障時 DNS 自動切到備援機房
習題#
- 為什麼單一 hosts.txt 方案必然失敗?DNS 用哪三個機制解決?
- 解釋 TTL 的取捨:短 TTL 與長 TTL 各付出什麼代價?
- 用 dig 觀察一個熱門網站的查詢,辨識經過了哪些快取層。