如何排查 DNS 解析問題
在日常的 Linux 系統管理與開發工作中,DNS 解析失敗是最令人頭痛的網路問題之一。當您無法連線到外部服務,卻確認網路連線本身正常時,DNS 通常是首要懷疑對象。對於中階 Linux 使用者而言,建立一套系統化的排查流程至關重要。本文將帶領您從基礎驗證到進階除錯,逐步解決 DNS 解析異常。
第一步:確認問題範圍與基礎連線
在深入 DNS 細節之前,首先要確認問題是否真的出在 DNS,還是其他網路層級的問題。
首先,使用 ping 指令嘗試 ping 一個知名的公共 IP 位址,例如 Google 的 8.8.8.8。
ping -c 4 8.8.8.8
如果能夠收到回覆,代表您的網路連線、路由與防火牆設定大致正常,問題很可能集中在名稱解析層面。如果連 IP 都 ping 不通,請先檢查網卡狀態或路由器連線。
接著,我們需要確認當前的 DNS 解析器配置。在現代 Linux 發行版中,systemd-resolved 是常見的 DNS 服務管理器。您可以使用以下指令查看目前的 DNS 狀態:
systemd-resolve --status
請特別注意輸出結果中的 DNS Servers 欄位,確認系統是否指向了正確的 DNS 伺服器(如 114.114.114.114、8.8.8.8 或區域網路的 DNS 閘道)。
第二步:使用專業工具進行解析測試
當基礎連線正常後,我們可以使用更精確的工具來診斷解析過程。
1. 使用 dig 進行詳細除錯
dig (Domain Information Groper) 是網路管理員最強大的 DNS 診斷工具之一。它能顯示完整的查詢過程,包括查詢時間、伺服器回應與 TTL 值。
dig google.com
關注輸出中的 ANSWER SECTION,確認是否回傳了正確的 IP。如果看到 SERVFAIL 或 NXDOMAIN,則分別代表伺服器內部錯誤或域名不存在。若想看更詳細的查詢路徑,可以加上 +trace 參數:
dig +trace google.com
這將顯示從根伺服器 (Root Server) 到權威伺服器 (Authoritative Server) 的完整解析路徑,有助於找出哪一層伺服器出了問題。
2. 使用 nslookup 快速驗證
如果您只需要快速確認某個域名對應的 IP,nslookup 是個簡潔的選擇:
nslookup google.com
第三步:檢查本地hosts與快取
有時問題並非來自外部 DNS 伺服器,而是本地配置衝突。
檢查 /etc/hosts
/etc/hosts 檔案允許您手動指定域名與 IP 的對應關係。如果這裡有錯誤的條目,會優先覆蓋 DNS 查詢結果。
cat /etc/hosts
檢查是否有針對您無法連線的域名設定了錯誤的 IP(例如 127.0.0.1 或無效 IP)。
清除 DNS 快取
在某些情況下,舊的或錯誤的 DNS 記錄可能被快取,導致解析延遲或錯誤。對於使用 systemd-resolved 的系統,可以執行以下指令清除快取:
sudo systemd-resolve --flush-caches
若您的系統使用 dnsmasq 或其他 DNS 快取服務,請相應重啟該服務。
常見問題與解決方案
問題一:DNS 查詢超時 (Timeout)
當您執行 dig 時出現 connection timed out,通常意味著請求無法到達 DNS 伺服器,或回傳的回應被阻擋。
- 解決方案:
- 檢查防火牆規則(如
ufw或iptables)是否阻擋了 UDP 53 埠。 - 確認
/etc/resolv.conf中的 nameserver 是否可達。您可以使用ping測試該 IP,或使用telnet <DNS_IP> 53檢查 TCP 連線。 - 嘗試手動修改
/etc/resolv.conf(或透過 NetworkManager 設定),將 DNS 改為8.8.8.8或1.1.1.1測試是否為 ISP DNS 問題。
- 檢查防火牆規則(如
問題二:解析結果錯誤或指向錯誤 IP
有時域名解析正確,但 IP 位址不對,這可能是因為 DNS 劫持或區域網路內的 DNS 干擾。
- 解決方案:
- 使用
dig @8.8.8.8 example.com強制使用 Google DNS 查詢,對比預設 DNS 的結果。如果 Google DNS 正確而預設 DNS 錯誤,則問題出在本地配置的 DNS 伺服器。 - 檢查是否有代理軟體(如 Proxychains)或 VPN 客戶端修改了系統 DNS 設定。
- 確認
/etc/nsswitch.conf中的hosts行,確保dns選項存在且順序正確(通常為files dns)。
- 使用
小結
排查 DNS 問題並非隨機嘗試,而應遵循「連線 → 配置 → 查詢 → 快取」的邏輯順序。透過熟練使用 ping、systemd-resolve、dig 等工具,並理解 /etc/resolv.conf 與 /etc/hosts 的作用,您可以快速定位並解決大多數 DNS 異常。記住,當遇到不明解析問題時,強制指定公共 DNS(如 8.8.8.8)進行測試,往往是區分本地配置問題與外部伺服器問題的最快方法。