概述

  • DNS(Domain Name System)將可讀域名映射為 IP 地址與相關服務信息,是互聯網的分佈式、層級式命名體系。
  • Linux 的域名解析由用户態解析器(glibc resolver)驅動,受 nsswitch.conf 策略與 resolv.conf/etc/hosts、systemd‑resolved、NetworkManager 等組件影響。

基礎知識講解

  • 角色與組件:
  • 存根解析器(Stub Resolver):應用與 OS 內部的輕量解析器,向遞歸服務器發起查詢(Linux glibc resolver)。
  • 遞歸解析器(Recursive Resolver):為客户端執行完整遞歸過程並緩存(如 Unbound、Bind 的 named、公共 DNS)。
  • 權威服務器(Authoritative):託管某一區域(Zone)的最終答案來源(持有區域數據/zone files)。
  • 轉發器(Forwarder):不做完整遞歸,將查詢轉發至上游遞歸。
  • 記錄類型(常用):
  • A/AAAA:IPv4/IPv6 地址
  • CNAME:別名,指向另一個名稱
  • NS:區域的權威名稱服務器
  • MX:郵件交換服務器
  • TXT:文本(SPF/驗證信息等)
  • SRV:服務發現(如 _sip._tcp
  • NAPTR:更靈活的服務發現(SIP/ENUM)
  • PTR:反向解析(IP→名稱)
  • SOA:區域起始(版本、刷新週期等元數據)
  • CAA:證書頒發機構授權
  • HTTPS/SVCB:現代服務綁定與優選參數(ALPN、端口、ECH 等)
  • 協議與端口:
  • UDP/53 為主,響應過大或需要可靠傳輸時回退至 TCP/53
  • EDNS(0) 擴展允許更大報文(常見 1232/4096 字節上限)與附加功能(如 ECS)。
  • Linux 解析路徑:
  • 應用調用 getaddrinfo() → glibc resolver → 按 nsswitch.conf 順序查詢(如 hosts: files dns
  • files/etc/hostsdns 指解析器(systemd‑resolved 或直接按 resolv.confnameserver)。
  • resolv.confnameserversearchoptions 控制解析行為(如 ndotstimeoutattemptsrotate)。
  • systemd‑resolved:集中管理每接口 DNS、搜索域、DNSSEC/DoT 支持;通過 resolvectl 操作。
  • NetworkManager/resolvconf:可生成/管理 resolv.conf,與 DHCP 客户端聯動。
  • 緩存與 TTL:遞歸服務器緩存答案,客户端可利用本地 DNS 緩存(如 systemd-resolveddnsmasqnscd)。負緩存也會緩存失敗答案(NXDOMAIN/NOERROR‑NODATA)。

原理

  • 層級解析流程(迭代/遞歸):
  • 存根向遞歸發起查詢;遞歸若無緩存,則從根(.)開始,獲取對應 TLD(.com 等)權威,再獲取實際權威,最終返回答案。
  • 遞歸將中間結果與最終記錄緩存;後續查詢命中緩存可直接返回。
  • 迭代 vs 遞歸:
  • 迭代:服務器返回“下一步應詢問誰”的引用(NS/授權信息),由客户端繼續查詢。
  • 遞歸:服務器代客户完成全流程,客户端只收最終答案(Linux 常用遞歸)。
  • CNAME 展開:
  • 若查詢命中 CNAME,解析器需繼續對其目標名稱進行查詢;可能出現多級別名,逐級展開直至得到 A/AAAA
  • EDNS 與回退:
  • 開啓 EDNS 可提高上限與功能;若出現分片丟失或防火牆阻斷,解析器回退至 TCP/53
  • DNSSEC(完整性與來源驗證):
  • 通過 DS/DNSKEY/RRSIG 建立從根到權威的信任鏈;解析器驗證簽名防止投毒。
  • Linux 可在 systemd-resolved/Unbound 上啓用 DNSSEC 驗證;應用透明受益。
  • QNAME Minimization:
  • 遞歸在向上層服務器查詢時僅泄露必要標籤,減少隱私暴露與緩存污染機會。
  • 負載均衡與地理調度:
  • A/AAAA 輪詢、權威側加權、基於地理/運營商的智能解析;ECS(EDNS Client Subnet)向權威提供客户端前綴以進行更精準分配。
  • 搜索域與 ndots
  • search 指定後綴列表;ndots 控制短名先嚐試附加後綴還是直接當作絕對域名查詢。ndots 過大可能導致額外查詢與延遲。
  • IPv6 與並行:
  • 解析器通常並行查詢 AAAAA;應用(瀏覽器)採用 Happy Eyeballs 減少雙棧建連延遲。

應用

  • 基礎配置(傳統/直接 resolv.conf):
  • 編輯 /etc/resolv.conf(有些系統由管理器生成,需改其上游設置):
  • nameserver 1.1.1.1
  • nameserver 8.8.8.8
  • search example.internal
  • options edns0 timeout:2 attempts:2 rotate
  • 使用 systemd‑resolved(推薦):
  • 查看狀態:resolvectl status
  • 為接口設置 DNS:sudo resolvectl dns eth0 10.0.0.2 10.0.0.3
  • 設置搜索域:sudo resolvectl domain eth0 example.internal
  • 啓用 DNSSEC:/etc/systemd/resolved.confDNSSEC=yes,重啓服務。
  • 配置 DoT(加密):在 resolved.conf 設置受信任上游(如 DNSOverTLS=yes 與服務器 ~ 標記)。
  • 本地緩存/轉發器:
  • 使用 dnsmasq:輕量級緩存與 DHCP/DNS 集成,適合嵌入式或小型網絡。
  • 使用 Unbound:高性能遞歸解析器,支持 DNSSEC 驗證、QNAME 最小化、DoT。
  • Split DNS/VPN:
  • 通過 systemd-resolved 為不同域配置不同上游(每接口/每域路由)。
  • 在企業/VPN 環境中,內部域名由內部 DNS 權威或轉發器解析,公共域名走外部 DNS。
  • 容器與 Kubernetes:
  • 容器的 /etc/resolv.conf 通常由宿主/運行時注入;K8s 使用 CoreDNS 作為集羣內遞歸/權威組合(Service/Pod 名稱解析)。
  • 調優 ndots 與搜索域防止應用出現超時(默認 ndots:5 會導致短名產生多次搜索)。
  • 構建與測試:
  • 本地權威(Bind 或 NSD)託管測試域;使用 zone 文件定義記錄。
  • 使用 SRV/TXT 為服務發現與配置分發(如 _app._tcp.dev.local)。

診斷與工具

  • dig
  • 基本查詢:dig A example.com +short
  • 全信息:dig example.com ANY
  • 指定服務器:dig @1.1.1.1 example.com A
  • 追蹤權威鏈:dig +trace example.com
  • resolvectl
  • 查詢:resolvectl query example.com
  • 查看鏈路與 DNS:resolvectl status
  • 抓包:tcpdump -i eth0 -vvv -n port 53
  • 查看 NSS:cat /etc/nsswitch.conf,確認 hosts: files dns 順序與策略。

性能與可靠性建議

  • 本地緩存:啓用 systemd-resolved/dnsmasq 緩存減少延遲與上游負載。
  • TTL 策略:權威側根據業務需要設置合理 TTL;過短增加負載,過長降低變更靈活性。
  • EDNS 尺寸:將最大 UDP 負載設置為 1232/1400 以降低分片風險,必要時允許 TCP 回退。
  • 並行與重試:遞歸器合理設置超時與重試;客户端避免過高 attempts 造成級聯延遲。
  • 安全:啓用 DNSSEC 驗證與 DoT/DoH(平台/應用層),防止投毒與竊聽。

常見問題與排錯

  • 解析慢或超時:
  • 防火牆阻斷 UDP/TCP 53;EDNS 過大導致分片丟失;ndots 過高引起多次無效搜索。
  • 配備被覆蓋:
  • resolv.conf 被 NetworkManager/systemd‑resolved/resolvconf 管理;應在其上游配置接口 DNS。
  • 多接口衝突:
  • 同時有 VPN/Wi‑Fi/以太網時,按每接口配置 DNS 與搜索域,設置優先級(resolvectl 的路由域)。
  • IPv6 導致連接延遲:
  • AAAA 命中但實際不可達,應用側應啓用 Happy Eyeballs;服務器端優化地址發佈策略。
  • 污染/欺騙:
  • 啓用可信遞歸,啓用 DNSSEC 與加密(DoT/DoH)。

飛快命令參考

  • dig @8.8.8.8 example.com A +short
  • dig +trace example.com
  • resolvectl query example.com
  • resolvectl dns eth0 10.0.0.2 10.0.0.3
  • tcpdump -i eth0 -vvv -n port 53

總結

  • Linux 的 DNS 解析由 glibc 存根結合 NSS 策略與系統級解析器實現,通過遞歸/緩存加速並可啓用 DNSSEC 與加密以提升安全性。
  • 合理配置 resolv.conf/systemd‑resolved、啓用本地緩存與分域路由,可在多接口與複雜網絡環境下提供穩定、高性能的名稱解析。