如何排查 DNS 解析問題 文章首圖

如何排查 DNS 解析問題

如何排查 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.1148.8.8.8 或區域網路的 DNS 閘道)。

第二步:使用專業工具進行解析測試

當基礎連線正常後,我們可以使用更精確的工具來診斷解析過程。

1. 使用 dig 進行詳細除錯

dig (Domain Information Groper) 是網路管理員最強大的 DNS 診斷工具之一。它能顯示完整的查詢過程,包括查詢時間、伺服器回應與 TTL 值。

dig google.com

關注輸出中的 ANSWER SECTION,確認是否回傳了正確的 IP。如果看到 SERVFAILNXDOMAIN,則分別代表伺服器內部錯誤或域名不存在。若想看更詳細的查詢路徑,可以加上 +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 伺服器,或回傳的回應被阻擋。

  • 解決方案
    1. 檢查防火牆規則(如 ufwiptables)是否阻擋了 UDP 53 埠。
    2. 確認 /etc/resolv.conf 中的 nameserver 是否可達。您可以使用 ping 測試該 IP,或使用 telnet <DNS_IP> 53 檢查 TCP 連線。
    3. 嘗試手動修改 /etc/resolv.conf(或透過 NetworkManager 設定),將 DNS 改為 8.8.8.81.1.1.1 測試是否為 ISP DNS 問題。

問題二:解析結果錯誤或指向錯誤 IP

有時域名解析正確,但 IP 位址不對,這可能是因為 DNS 劫持或區域網路內的 DNS 干擾。

  • 解決方案
    1. 使用 dig @8.8.8.8 example.com 強制使用 Google DNS 查詢,對比預設 DNS 的結果。如果 Google DNS 正確而預設 DNS 錯誤,則問題出在本地配置的 DNS 伺服器。
    2. 檢查是否有代理軟體(如 Proxychains)或 VPN 客戶端修改了系統 DNS 設定。
    3. 確認 /etc/nsswitch.conf 中的 hosts 行,確保 dns 選項存在且順序正確(通常為 files dns)。

小結

排查 DNS 問題並非隨機嘗試,而應遵循「連線 → 配置 → 查詢 → 快取」的邏輯順序。透過熟練使用 pingsystemd-resolvedig 等工具,並理解 /etc/resolv.conf/etc/hosts 的作用,您可以快速定位並解決大多數 DNS 異常。記住,當遇到不明解析問題時,強制指定公共 DNS(如 8.8.8.8)進行測試,往往是區分本地配置問題與外部伺服器問題的最快方法。