概述
- 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/hosts,dns指解析器(systemd‑resolved 或直接按resolv.conf的nameserver)。resolv.conf:nameserver、search、options控制解析行為(如ndots、timeout、attempts、rotate)。- systemd‑resolved:集中管理每接口 DNS、搜索域、DNSSEC/DoT 支持;通過
resolvectl操作。 - NetworkManager/
resolvconf:可生成/管理resolv.conf,與 DHCP 客户端聯動。
- 緩存與 TTL:遞歸服務器緩存答案,客户端可利用本地 DNS 緩存(如
systemd-resolved、dnsmasq、nscd)。負緩存也會緩存失敗答案(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 與並行:
- 解析器通常並行查詢
A與AAAA;應用(瀏覽器)採用 Happy Eyeballs 減少雙棧建連延遲。
應用
- 基礎配置(傳統/直接
resolv.conf):
- 編輯
/etc/resolv.conf(有些系統由管理器生成,需改其上游設置):
nameserver 1.1.1.1nameserver 8.8.8.8search example.internaloptions 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.conf中DNSSEC=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 +shortdig +trace example.comresolvectl query example.comresolvectl dns eth0 10.0.0.2 10.0.0.3tcpdump -i eth0 -vvv -n port 53
總結
- Linux 的 DNS 解析由 glibc 存根結合 NSS 策略與系統級解析器實現,通過遞歸/緩存加速並可啓用 DNSSEC 與加密以提升安全性。
- 合理配置
resolv.conf/systemd‑resolved、啓用本地緩存與分域路由,可在多接口與複雜網絡環境下提供穩定、高性能的名稱解析。
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。