單元 08 DHCP、DNS 與設定的生命週期
學習目標與問題
接續 IP 與 ARP。你應能說明 DHCP 租約、DNS 遞迴與權威角色、TTL 快取,以及名稱解析失敗與服務失敗的差異。連上 AP 表示鏈路成立,並不代表已拿到正確 IP、閘道和解析器。
普通 DNS 解析與本鏈路 mDNS 需分開。mDNS 與 DNS-SD 服務探索留到 15,會用到本章的記錄與 TTL,L16 的 DNS-SD 工作表也在那裡完成。
8.1 設定從哪裡來
IPv4 DHCP 常透過 Discover、Offer、Request、ACK 的流程提供租約與選項,包括位址、遮罩、路由器和 DNS。初始客戶端可使用 0.0.0.0,訊息可能廣播;relay 可把請求轉送到其他網段的伺服器。後續續租不一定重演四個廣播訊息。
租約到期前會嘗試續租及重新繫結;超過租約有效期不能繼續假設位址合法。手動靜態設定、作業系統快取與其他設定機制也可能參與。若 Wi-Fi 正常但只有 link-local 位址,應先查 DHCP 與本地設定,不要立即歸因 DNS。
8.2 DNS 是分散式名稱資料庫
stub resolver 通常把查詢交給遞迴解析器。解析器可回快取,或從根、頂級域一路找委派,直到該名稱所屬 zone 的權威伺服器;根與頂級域伺服器也是各自 zone 的權威伺服器。權威伺服器對特定 zone 提供資料,不等於替使用者遞迴解析所有名稱。實際流程受快取影響,不是每次都詢問根。
| 記錄 | 功能 | 注意 |
|---|---|---|
| A/AAAA | 名稱到 IPv4/IPv6 | 可有多筆,不保證只用第一筆 |
| CNAME | 別名指向另一名稱 | 仍需解析後續名稱 |
| NS | zone 的權威伺服器 | 委派可能需要 glue 位址 |
| MX | 郵件交換器 | 不是網頁服務位址 |
| TXT | 應用定義文字資料 | 本身不提供安全保證 |
DNS 不解析完整 URL。https://example.test:8443/a 的主機名是 example.test,埠與路徑由其他協定處理。.test 是示例用途;本教材不要求連到外部該網域。
8.3 查詢、回應與快取
DNS header 含 transaction ID、旗標、各區段數量。Question 有名稱、type、class;Answer 可以含資料與 TTL。名稱用長度加 label 表示,回應可用壓縮指標引用訊息中先前出現的名稱。parser 必須限制長度及指標迴圈,不能把網路輸入當成可信字串。
header 固定 12 bytes,六個欄位各 2 bytes,以大端序(高位 byte 在前)寫入:
| offset(bytes) | 欄位 | 意義 |
|---|---|---|
| 0–1 | ID | 配對查詢與回應的編號 |
| 2–3 | 旗標 | 見下表 |
| 4–5 | QDCOUNT | Question 數 |
| 6–7 | ANCOUNT | Answer 數 |
| 8–9 | NSCOUNT | Authority 數 |
| 10–11 | ARCOUNT | Additional 數 |
旗標的 16 bits 由高位到低位依序如下,前 8 bits 是第一個旗標 byte:
| 欄位 | QR | Opcode | AA | TC | RD | RA | Z | RCODE |
|---|---|---|---|---|---|---|---|---|
| bits | 1 | 4 | 1 | 1 | 1 | 1 | 3 | 4 |
| 意義 | 0 查詢、1 回應 | 0 為標準查詢 | 權威回答 | 已截斷 | 要求遞迴 | 可提供遞迴 | 保留 | 0 為 NOERROR、3 為 NXDOMAIN |
RFC 1035 規定 Z 為 0。
例:某權威伺服器回應的前 12 bytes 是 7f21 8503 0001 0000 0001 0000。ID 是 0x7f21。旗標 0x8503 拆成兩個 byte:0x85 是 10000101,依序讀出 QR=1、Opcode=0000、AA=1、TC=0、RD=1;0x03 是 00000011,讀出 RA=0、Z=000、RCODE=0011,即 3。後四欄依序是 1 個 Question、0 個 Answer、1 個 Authority、0 個 Additional。結論:權威伺服器回覆名稱不存在,且不替客戶遞迴;Authority 區段通常帶該 zone 的 SOA,供負面快取使用。
名稱逐個 label 寫成「長度 byte + 字元」,最後以 00 結束;字元採 ASCII,每個佔 1 byte。label 最長 63,所以長度 byte 的最高兩個 bits 是 00;最高兩個 bits 為 11 時,它和下一個 byte 合成壓縮指標。例:Question 名稱 docs.school.test 從 offset 12 開始,依序是 04 docs(offset 12–16)、06 school(17–23)、04 test(24–28)與 00(29)。之後的記錄要寫 api.school.test 時,可以只寫 03 api,再接指標 c0 11。這兩個 bytes 的二進位是 11000000 00010001;去掉最高兩個 bits,其餘 14 bits 是 00000000010001,即 offset 17:名稱的其餘部分從 offset 17 讀起,也就是 school.test。
TTL 是允許快取保存這筆資料的時間上限,單位是秒;快取可以提早丟棄,從快取回覆時給的是剩餘的 TTL。假設權威 TTL=300 秒,解析器在 t=0 收到資料,t=120 回覆時正常剩餘 TTL 約 180;新增查詢不會任意把原資料再延長 300。負面回覆也可能快取。NXDOMAIN 表示名稱不存在;NOERROR 且無指定型別資料並不等於 NXDOMAIN。timeout 則根本沒有拿到有效回應。
DNS 支援 UDP 與 TCP。UDP 回覆截斷時可能改用 TCP;不能把「DNS 通常用 UDP」簡化為「封鎖 TCP 53 不影響 DNS」。DoH/DoT 改變傳送的保密方式,DNSSEC 提供資料驗證;加密傳送不等於 DNS 資料本身已驗證,也不使解析器無法看到查詢。
延伸:DNSSEC 後來把 Z 較低的兩個 bits 定義為 AD(authentic data)與 CD(checking disabled),Z 只剩最高的 1 bit。回應的 AD 表示解析器認為資料已通過 DNSSEC 驗證;查詢的 CD 要求解析器不做驗證。
8.4 完整故障例題
使用者說「網站不能開」。已知以正確 IP 連線可到服務、原名稱解析 timeout,且解析器位址不可達。先檢查解析器路由、DNS 設定及政策,再測查詢。若解析得到位址但 HTTPS 名稱驗證失敗,不能改成停用憑證檢查;應核對名稱與憑證。直接以 IP 開 HTTPS 可能因 SNI/Host 與名稱驗證失敗,不能用它取代完整的域名測試。
實驗、習題與檢核
做 L04:對照 8.3 的 header 與旗標配置,拆解人工作成的 DNS 二進位訊息,定位 header、QNAME 與 A 回應,再用 --ttl 60 只改 TTL 核對。它驗證格式理解,不代表已向真正權威伺服器查詢。
- 基本:快取在 t=40 收到 TTL=600 的資料,t=190 時的正常剩餘 TTL 為何?
- 基本:將遞迴解析器、權威伺服器和 DHCP 伺服器的責任分開。
- 分析:NXDOMAIN、沒有 AAAA、逾時各支持什麼結論?
- 基本:請畫出「已快取」與「未快取」兩種解析時序。
檢核:能寫出 DNS 查詢實際送往哪個端點,並區分名稱、位址、服務可達與身分驗證。來源:RFC 2131、RFC 1034、RFC 1035、RFC 2308。