網路與 IP

DNS 測試怎麼做?nslookup、dig 與線上 DNS 查詢工具的用法

DNS 測試就是向指定的 DNS 伺服器發出查詢,看三件事:返回的記錄對不對、花了多長時間、各地結果是否一致。本機用 nslookup 或 dig 測記錄和回應時間,用 dig +trace 和直接詢問權威伺服器確認源頭;全國各地的生效情況,用線上 DNS 查詢工具的多地解析結果來看。

作者 頂聯產品團隊發布於 7 分鐘閱讀

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、回應時間。按下面的順序讀:

  1. 先看解析結果是不是你設定的值。設定了按運營商或地區解析的域名,按線路分組看:電信的探測點應當拿到電信線路的記錄,聯通、移動同理。
  2. 再看 TTL 列。它是那台遞迴伺服器快取裡剩餘的秒數。拿到舊位址、剩餘 TTL 還很大,說明這個快取要過一陣才會過期;TTL 接近你設定的值,說明它剛剛從權威伺服器取回了資料。
  3. 看 IP 歸屬地。用了 CDN 時各地結果不同是正常的,只要都屬於 CDN 的節點;某個探測點返回了一個和你的伺服器、CDN 都無關的位址,要懷疑解析配置錯誤或被劫持。
  4. 看失敗的探測點。個別探測點超時,多半是探測點自己的網路問題;同一運營商的多個探測點同時失敗才值得關注;全部失敗,回到 +trace 檢查 NS 委派和權威伺服器。
  5. 回應時間只做橫向參考。它包含探測點到遞迴伺服器的往返和遞迴查詢時間,和你自己存取時的體驗不能直接對應。

所謂“DNS 生效”,本質是各地遞迴伺服器的快取過期後重新取到了新值,並沒有一個主動推送的過程。修改記錄後,最長要等舊記錄的 TTL 到期,少數不遵守 TTL 的快取會更久。線上工具也有侷限:它代表的是探測點所用的 DNS,不代表你的電腦和你的使用者(很多使用者改用了公共 DNS);結果只是查詢那一刻的快照;內網域名和只在內網生效的解析,它查不到。

域名解析到伺服器後:A、AAAA、CNAME 怎麼驗證

把域名指向新伺服器,按下面五步驗證,前一步透過再做下一步:

  1. 權威伺服器上的記錄對不對:
dig @ns1.example.net www.example.com A +norec +noall +answer
dig @ns1.example.net www.example.com AAAA +norec +noall +answer
  1. 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 一側的加速域名還沒配置好。

  1. 加了 AAAA 記錄,就要確認伺服器真的能經 IPv6 存取。從一台有 IPv6 的機器執行 curl -6 -sI https://www.example.com/。AAAA 指向的位址不通,有 IPv6 的訪客會出現打不開或者先卡一下再開啟的情況。
  2. 改解析之前,先直接測新伺服器。--resolve 讓 curl 把域名臨時指向指定 IP,證書、站點繫結、跳轉都能提前驗證,不影響任何訪客:
curl -sI --resolve www.example.com:443:203.0.113.10 https://www.example.com/
  1. 改完之後,確認實際連到的是哪個 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 伺服器高頻批次查詢,可能被當作攻擊而限速或封禁;要對自己的權威伺服器做壓力測試,先和解析服務商確認。

想看看在你的機房裡怎麼用?

從一次產品示範開始,梳理你的業務鏈路。

查看價格
服務熱線 400-112-2951

讓我們聊聊你的 IDC 業務

掃碼新增企業微信,預約產品示範或申請試用。

Toplink 企業微信二維碼

長按儲存或使用企業微信 / 微信掃描

也可致電
400-112-2951
Telegram
@TopLink88