DNS 測試怎麼做?nslookup、dig 與線上 DNS 查詢工具的用法
DNS 測試就是向指定的 DNS 伺服器發出查詢,看三件事:返回的記錄對不對、花了多長時間、各地結果是否一致。本機用 nslookup 或 dig 測記錄和回應時間,用 dig +trace 和直接詢問權威伺服器確認源頭;全國各地的生效情況,用線上 DNS 查詢工具的多地解析結果來看。
DNS 測試怎麼做?向一台指定的 DNS 伺服器發出查詢,檢查三件事:返回的記錄對不對、回應要多長時間、各地拿到的結果是否一致。命令列工具有兩個:Windows 自帶的 nslookup(Linux、macOS 也有),以及輸出更完整的 dig(RHEL 系在 bind-utils 軟體包裡,Debian 系在 dnsutils 裡)。測記錄要問域名的權威伺服器,測訪客看到的結果要問遞迴伺服器,測全國生效情況則要藉助線上 DNS 查詢工具的多地探測點。先弄清楚自己要回答哪個問題,再選工具和詢問物件,測試結果才有意義。
DNS 測試先分清測什麼
| 要回答的問題 | 測什麼 | 問誰 | 用什麼 |
|---|---|---|---|
| 解析記錄加對了沒有 | 記錄的內容和設定的 TTL | 域名的權威伺服器 | dig @權威伺服器 +norec、nslookup 指定伺服器 |
| 訪客現在拿到的是什麼 | 快取裡的結果和剩餘 TTL | 本機 DNS、公共 DNS、各地運營商 DNS | dig、nslookup、線上多地查詢 |
| 這台 DNS 伺服器好不好用 | 能否應答、回應時間、有無超時 | 被測的那台伺服器 | dig 的 Query time、連續查詢統計 |
| 解析鏈條哪一環出了問題 | 根、域名字尾(如 .com)、權威各級的委派與應答 | 從根開始逐級詢問 | dig +trace |
| 全國各地是否已經生效 | 多地區、多運營商的結果 | 各地的遞迴伺服器 | 線上 DNS 查詢工具 |
常說的“DNS 測試入口”,一類是命令列工具,另一類是站長工具類網站裡的“DNS 查詢”“多地 DNS 解析”“DNS 檢測”功能,在搜尋引擎裡用這幾個詞就能找到。兩者互補:命令列能精確控制問誰、問什麼,線上工具能一次看到幾十個地區和運營商的結果。
nslookup 命令常用用法
nslookup www.example.com # 用本機配置的 DNS 查詢
nslookup www.example.com 223.5.5.5 # 指定 DNS 伺服器
nslookup -type=AAAA www.example.com 223.5.5.5 # 指定記錄型別:A、AAAA、CNAME、MX、NS、TXT、SOA
nslookup -type=NS example.com # 查這個域名的權威伺服器
nslookup 203.0.113.10 # 引數是 IP 時做反向解析(PTR)
nslookup -vc www.example.com 223.5.5.5 # 改用 TCP 查詢,測 TCP 53 是否通
nslookup -timeout=3 -retry=1 www.example.com 223.5.5.5 # 縮短等待,快速判斷伺服器是否應答
nslookup -debug www.example.com # 顯示完整的請求與應答,包括 TTL
Windows 上查一個使用了 CDN 的域名,輸出類似這樣:
伺服器: public1.alidns.com
Address: 223.5.5.5
非權威應答:
名稱: www.example.com.cdn-example.net
Addresses: 198.51.100.20
198.51.100.21
Aliases: www.example.com
“伺服器”一行是這台 DNS 反向解析出的名字,查不到時顯示 UnKnown,不影響結果。“名稱”是 CNAME 鏈最終指向的名字,“Aliases”列出你查詢的原始名字,說明這個域名是透過 CNAME 接入 CDN 的。“非權威應答”表示結果來自遞迴伺服器,不是權威伺服器親自回答。
需要連續換著伺服器、換著型別查時,用互動模式更方便:
nslookup
> server 119.29.29.29
> set type=mx
> example.com
> set norecurse
> set debug
> exit
用 nslookup 測試要注意兩個細節:
- Windows 版會拼接 DNS 字尾。名字末尾沒有點時,nslookup 會先把網路卡的 DNS 字尾(如公司域名)拼上去查詢,加入了域的電腦上用
-debug能看到它先查了www.example.com.corp.example之類的名字。在末尾加一個點,寫成www.example.com.,就只查這一個名字。 - nslookup 不走系統的解析流程。它直接給 DNS 伺服器發包,不讀 hosts 檔案,也不用系統快取。瀏覽器打不開而 nslookup 正常時,Windows 用
Resolve-DnsName www.example.com、Linux 用getent hosts www.example.com走一遍系統流程對比。
dig 命令常用引數
| 引數 | 作用 | 例子 |
|---|---|---|
@伺服器 |
指定詢問的 DNS | dig @119.29.29.29 www.example.com |
| 記錄型別 | 寫在域名後面:A、AAAA、CNAME、MX、NS、TXT、SOA、CAA | dig example.com MX |
+short |
只輸出結果 | dig +short www.example.com |
+noall +answer |
只看應答段,保留名字、TTL 和型別 | dig www.example.com +noall +answer |
+identify |
配合 +short,同時顯示哪台伺服器、用了多少毫秒 |
dig +short +identify www.example.com @223.5.5.5 |
+norec |
不請求遞迴,詢問權威伺服器時使用 | dig @ns1.example.net www.example.com +norec |
+trace |
從根伺服器開始逐級查詢 | dig www.example.com +trace |
+nssearch |
向每台權威伺服器查 SOA,對比序列號和回應時間 | dig example.com +nssearch |
+tcp |
用 TCP 查詢 | dig +tcp @223.5.5.5 www.example.com |
+time= +tries= |
單次等待秒數與嘗試次數 | dig +time=2 +tries=1 www.example.com |
-4、-6 |
只透過 IPv4 或 IPv6 傳送查詢 | dig -6 @2400:3200::1 www.example.com |
-x |
反向解析 | dig -x 203.0.113.10 +short |
-f 檔案 |
批次查詢檔案裡的每一行 | dig -f names.txt +noall +answer |
+subnet= |
在查詢裡攜帶客戶端子網(ECS),模擬另一個地區的使用者 | dig @ns1.example.net www.example.com +subnet=198.51.100.0/24 |
看回應時間:Query time 怎麼讀
dig 完整輸出的末尾有一行 ;; Query time: 28 msec,是從發出查詢到收到這台伺服器應答的時間。用 +short +identify 可以把它和結果放在同一行,適合連續觀察:
for i in $(seq 20); do dig +short +identify +time=2 +tries=1 www.example.com @223.5.5.5 || echo timeout; done
# 203.0.113.10 from server 223.5.5.5 in 9 ms.
| 現象 | 說明 |
|---|---|
| 第一次幾十到幾百毫秒,緊接著再查降到個位數 | 正常,第二次命中了遞迴伺服器的快取 |
| 每次都要幾百毫秒,而 ping 這台 DNS 只有十幾毫秒 | 遞迴伺服器每次都要去權威伺服器取資料(TTL 設得很短),或權威伺服器本身慢,用 +trace 看是哪一級 |
| 20 次裡出現幾次 timeout | 到這台 DNS 的路徑丟包,或伺服器在限速;對訪客來說,一次超時就意味著那次解析要等系統解析器超時重試,多花 1 秒到幾秒 |
+trace 與 +nssearch:斷在哪一級、權威伺服器是否一致
+trace 只在第一步向本機配置的 DNS 取根伺服器列表,之後不經過遞迴伺服器的快取,從根開始逐級詢問,每一級後面的 Received ... in N ms 就是這一級的回應時間:
. 518400 IN NS a.root-servers.net.
;; Received 239 bytes from 223.5.5.5#53(223.5.5.5) in 12 ms
com. 172800 IN NS a.gtld-servers.net.
;; Received 1170 bytes from 198.41.0.4#53(a.root-servers.net) in 156 ms
example.com. 172800 IN NS ns1.example.net.
;; Received 656 bytes from 192.5.6.30#53(a.gtld-servers.net) in 210 ms
www.example.com. 600 IN A 203.0.113.10
;; Received 60 bytes from 192.0.2.53#53(ns1.example.net) in 35 ms
第三段是 .com 的伺服器告訴你“這個域名由誰負責”,在註冊商處改了 NS 之後,看這一段就知道 .com 這一級是否已經更新;最後一段是權威伺服器給出的當前記錄。哪一段超時或報錯,問題就在哪一級。
一個域名通常有兩台以上權威伺服器,它們之間不同步時,有的訪客拿到新記錄、有的拿到舊記錄,而且時好時壞。+nssearch 一次問遍所有權威伺服器:
SOA ns1.example.net. hostmaster.example.com. 2026122302 3600 600 1209600 300 from server 192.0.2.53 in 35 ms.
SOA ns1.example.net. hostmaster.example.com. 2026122301 3600 600 1209600 300 from server 198.51.100.53 in 41 ms.
兩台的序列號不同(2026122302 與 2026122301),說明第二台還沒有同步最近一次修改。使用解析服務商時這種情況少見;自建主從 DNS 時,常見原因是從伺服器無法從主伺服器傳輸區域資料(被防火牆或傳輸許可權攔截),或還沒到重新整理時間。反過來,主伺服器改了記錄卻忘了增大序列號時,從伺服器不會去同步,兩台的序列號相同、內容卻不同,+nssearch 看不出來,要逐台查記錄對比。
線上 DNS 查詢工具:多地解析結果怎麼看
線上工具在各省、各運營商以及海外部署了探測點,每個探測點用當地的遞迴伺服器查詢你的域名,再把結果彙總成一張表,常見的列有:檢測點(地區和運營商)、解析結果、IP 歸屬地、TTL、回應時間。按下面的順序讀:
- 先看解析結果是不是你設定的值。設定了按運營商或地區解析的域名,按線路分組看:電信的探測點應當拿到電信線路的記錄,聯通、移動同理。
- 再看 TTL 列。它是那台遞迴伺服器快取裡剩餘的秒數。拿到舊位址、剩餘 TTL 還很大,說明這個快取要過一陣才會過期;TTL 接近你設定的值,說明它剛剛從權威伺服器取回了資料。
- 看 IP 歸屬地。用了 CDN 時各地結果不同是正常的,只要都屬於 CDN 的節點;某個探測點返回了一個和你的伺服器、CDN 都無關的位址,要懷疑解析配置錯誤或被劫持。
- 看失敗的探測點。個別探測點超時,多半是探測點自己的網路問題;同一運營商的多個探測點同時失敗才值得關注;全部失敗,回到
+trace檢查 NS 委派和權威伺服器。 - 回應時間只做橫向參考。它包含探測點到遞迴伺服器的往返和遞迴查詢時間,和你自己存取時的體驗不能直接對應。
所謂“DNS 生效”,本質是各地遞迴伺服器的快取過期後重新取到了新值,並沒有一個主動推送的過程。修改記錄後,最長要等舊記錄的 TTL 到期,少數不遵守 TTL 的快取會更久。線上工具也有侷限:它代表的是探測點所用的 DNS,不代表你的電腦和你的使用者(很多使用者改用了公共 DNS);結果只是查詢那一刻的快照;內網域名和只在內網生效的解析,它查不到。
域名解析到伺服器後:A、AAAA、CNAME 怎麼驗證
把域名指向新伺服器,按下面五步驗證,前一步透過再做下一步:
- 權威伺服器上的記錄對不對:
dig @ns1.example.net www.example.com A +norec +noall +answer
dig @ns1.example.net www.example.com AAAA +norec +noall +answer
- CNAME 鏈是否完整。接入 CDN 的域名,應答裡會依次出現 CNAME 和最終的 A 記錄,兩級的 TTL 各自獨立:
www.example.com. 600 IN CNAME www.example.com.cdn-example.net.
www.example.com.cdn-example.net. 60 IN A 198.51.100.20
只有 CNAME、沒有後面的 A 記錄,同時 status 顯示 NXDOMAIN,說明 CNAME 指向的名字查不到,通常是 CDN 一側的加速域名還沒配置好。
- 加了 AAAA 記錄,就要確認伺服器真的能經 IPv6 存取。從一台有 IPv6 的機器執行
curl -6 -sI https://www.example.com/。AAAA 指向的位址不通,有 IPv6 的訪客會出現打不開或者先卡一下再開啟的情況。 - 改解析之前,先直接測新伺服器。
--resolve讓 curl 把域名臨時指向指定 IP,證書、站點繫結、跳轉都能提前驗證,不影響任何訪客:
curl -sI --resolve www.example.com:443:203.0.113.10 https://www.example.com/
- 改完之後,確認實際連到的是哪個 IP:
curl -s -o /dev/null -w '%{remote_ip}\n' https://www.example.com/
全國解析不一致怎麼排查
| 現象 | 可能原因 | 怎麼確認 |
|---|---|---|
| 部分地區仍是舊 IP | 這些地區的遞迴伺服器快取還沒過期 | 線上工具看這些探測點的剩餘 TTL;直接問權威伺服器得到的是新值 |
| 同一地區的結果在新舊之間來回跳 | 權威伺服器之間不同步 | dig +nssearch 對比 SOA 序列號,再逐台 dig @每台權威 +norec |
| 電信、聯通、移動拿到不同的 IP | 設定了按線路解析;或某條線路漏加了記錄,多數解析服務商會讓它落到“預設”線路 | 在解析後台逐條核對各線路的記錄 |
| 各地 IP 不同,但都屬於 CDN | CDN 按地區和運營商排程,正常 | 查 IP 歸屬 |
| 個別地區拿到陌生 IP,或不存在的子域名也能解析出位址 | 解析配置錯誤、運營商改寫或劫持 | 與權威伺服器的結果對比;用一個肯定不存在的子域名測試 |
| 剛加的記錄,有的地方查不到 | 新增之前有人查過,“不存在”的結果被快取 | 查 SOA 記錄:否定結果的快取時間取 SOA 最後一個欄位與 SOA 記錄本身 TTL 中較小的一個 |
| 只有自己的電腦不一樣 | hosts 檔案、系統或瀏覽器快取、代理軟體 | 用 Resolve-DnsName 或 getent hosts 與 nslookup 的結果對比 |
按線路解析的域名,可以用 +subnet 模擬某個地區的使用者,直接向權威伺服器提問:
dig @ns1.example.net www.example.com +subnet=198.51.100.0/24 +noall +answer
把 198.51.100.0/24 換成目標地區、目標運營商的一個使用者網段。這要求權威伺服器支援 ECS(EDNS Client Subnet);不支援時它會忽略這個引數,按發起查詢的位址來判斷線路,測出來的就只是你自己所線上路的結果。
在管理系統裡怎麼落地
多地測試裡出現一個陌生 IP,第一個要回答的問題是:它是不是我們的?Toplink DCIM 的 IP 位址管理 登記了機房的每個位址段,以及每個位址分配給了哪台伺服器,查一下就知道這個 IP 是否屬於機房、在哪台機器上;不在任何登記的位址段裡,就按解析配置錯誤或劫持去查。客戶遷移伺服器、更換 IP 之後反映“部分地區打不開”,也可以先核對解析結果裡的位址是不是系統裡分配給他的那一個,有些“解析沒生效”,其實是記錄裡填成了舊位址或別人的位址。
常見問題
怎麼清除本機的 DNS 快取?
Windows 執行 ipconfig /flushdns;macOS 執行 sudo dscacheutil -flushcache 和 sudo killall -HUP mDNSResponder;使用 systemd-resolved 的 Linux 執行 resolvectl flush-caches。瀏覽器還有自己的快取,Chrome 可以在 chrome://net-internals/#dns 頁面清除,或者直接重啟瀏覽器。
Windows 上沒有 dig,用什麼代替?
PowerShell 自帶的 Resolve-DnsName 可以指定伺服器和記錄型別,例如 Resolve-DnsName www.example.com -Type AAAA -Server 223.5.5.5;加 -DnsOnly 只走 DNS 協議,加 -NoHostsFile 不讀 hosts 檔案。需要 +trace 這類功能時,可以在 WSL 或一台 Linux 伺服器上用 dig。
做 DNS 測試會影響線上解析嗎?
普通查詢只是讀取,不會改變任何記錄,也不影響別人。但不要對別人的 DNS 伺服器高頻批次查詢,可能被當作攻擊而限速或封禁;要對自己的權威伺服器做壓力測試,先和解析服務商確認。