Linux 無法解析 DNS 的原因與解決方法

如果在 Linux 中看起來網路連線仍然正常,但網站卻無法開啟,或者可以透過 IP 位址連線,卻無法透過網域名稱連線,通常表示 DNS 解析可能出現問題。DNS 的作用是將 example.com 這類網域名稱轉換成實際的 IP 位址。一旦這個流程發生異常,即使網路本身沒有中斷,日常的網際網路使用也會受到很大影響。

常見症狀

  • 瀏覽器顯示找不到伺服器
  • ping 8.8.8.8 成功,但 ping google.com 失敗
  • aptdnfyumpacman 等套件管理工具無法正常使用
  • 終端機出現 Temporary failure in name resolution

第一步要先確認什麼

首先要判斷問題是出在整個網路,還是只出在 DNS。

ping -c 4 8.8.8.8
ping -c 4 google.com
ip addr
ip route

如果 8.8.8.8 可以連通,但 google.com 不行,通常代表問題集中在 DNS。若連 IP 位址本身都無法存取,那麼原因較可能在 Wi-Fi、網路介面、閘道或路由設定上。

主要原因

1. /etc/resolv.conf 設定錯誤

在許多 Linux 系統中,DNS 伺服器資訊會記錄在 /etc/resolv.conf。如果這個檔案中沒有正確的 nameserver,網域名稱就無法被解析。

cat /etc/resolv.conf

範例:

nameserver 8.8.8.8
nameserver 1.1.1.1

如果檔案是空的,或指向錯誤的本機 DNS,就會造成問題。不過要注意,在現代 Linux 系統中,這個檔案常常會由 NetworkManager 或 systemd-resolved 自動產生,因此手動修改的內容有可能被覆蓋。

2. systemd-resolved 發生異常

在 Ubuntu 等系統中,systemd-resolved 常負責 DNS 解析,並且經常使用 127.0.0.53 作為本機解析入口。如果這個服務停止運作,DNS 解析就會失敗。

systemctl status systemd-resolved
resolvectl status

若有問題,可以重新啟動服務:

sudo systemctl restart systemd-resolved

3. NetworkManager 沒有正確套用 DNS

在桌面版 Linux 中,NetworkManager 常透過 DHCP 取得 DNS 資訊。如果網路設定檔損壞,或重新連線時發生異常,就可能無法套用正確的 DNS。

nmcli dev show | grep DNS
nmcli connection show

必要時可以重新啟動它:

sudo systemctl restart NetworkManager

4. VPN、Proxy 或防火牆的影響

VPN 可能會把 DNS 請求導向錯誤的路徑,而防火牆也可能封鎖 53 埠。這種情況下,網路看似正常,但網域名稱卻無法解析。

5. DNS 快取損壞或過舊

如果本機快取資料過舊或損壞,可能導致某些網域無法使用。在使用 systemd-resolved 或 nscd 的系統中,清除快取有時會有幫助。

sudo resolvectl flush-caches

實際的排查與修復步驟

步驟 1:直接查詢公用 DNS

nslookup google.com 8.8.8.8
dig google.com @8.8.8.8

如果這樣可以正常取得結果,通常表示外部 DNS 沒有問題,真正的原因比較可能在本機設定。

步驟 2:暫時設定公用 DNS

sudo sh -c 'printf "nameserver 8.8.8.8\nnameserver 1.1.1.1\n" > /etc/resolv.conf'

這只是暫時性的作法。重新開機或重新連線之後,這個檔案可能又會被系統改回去。若要永久解決,應該修正 NetworkManager、netplan 或 systemd-resolved 的設定。

步驟 3:在 Ubuntu 檢查 netplan

sudo nano /etc/netplan/*.yaml

範例:

nameservers:
  addresses: [8.8.8.8,1.1.1.1]

修改後套用設定:

sudo netplan apply

步驟 4:重新取得 DHCP 設定

sudo dhclient -r
sudo dhclient

如果 DHCP 伺服器先前提供了錯誤的 DNS 資訊,這個步驟有機會修正問題。

常用檢查指令

ping -c 4 8.8.8.8
ping -c 4 google.com
cat /etc/resolv.conf
systemctl status systemd-resolved
resolvectl status
nmcli dev show | grep DNS
nslookup google.com
dig google.com
journalctl -u systemd-resolved --no-pager | tail -n 50

如何避免再次發生

  • 不要只靠手動修改 /etc/resolv.conf
  • 弄清楚系統中的 DNS 是由 DHCP、NetworkManager 還是 systemd-resolved 管理
  • 使用 VPN 後要確認 DNS 設定是否被改變
  • 若是伺服器用途,建議明確設定固定 DNS

總結

當 Linux 無法解析 DNS 時,最重要的第一步是先確認是否仍可透過 IP 位址通訊。這能幫助你快速判斷問題是只出在 DNS,還是整個網路都有異常。接著再依序檢查 /etc/resolv.confsystemd-resolvedNetworkManager、DHCP 與 VPN 設定。重點不只是臨時恢復,而是要真正理解系統中到底是哪個元件在管理 DNS,才能從根本解決問題。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *