如果你是一位 Ubuntu 用戶,可能都曾經遇到過「域名無法訪問,但 IP 卻可以」的情況。在這種情況下,問題的根源大多出在 DNS 設定上。最近的 Ubuntu 系統預設使用 systemd-resolved 這個 DNS 解析器守護進程,因此了解其結構是非常重要的。


1. DNS 請求的流程

仔細閱讀並理解下面的摘要,幾乎所有的問題都能迎刃而解。

  1. 用戶在瀏覽器等應用程序中請求域名
  2. Linux 本身會讀取 /etc/resolv.conf 來解析 DNS(該文件是與 /run/systemd/resolve/stub-resolv.conf 的符號鏈接。)
  3. /run/systemd/resolve/stub-resolv.conf 設定為 127.0.0.53,最終導致 systemd-resolved 的出現。
  4. 系統的 systemd-resolved 受限於設定文件 /etc/systemd/resolved.conf
  5. 也就是說,systemd-resolved 根據 /etc/systemd/resolved.conf 中設置的 DNS 伺服器進行查詢,
  6. 收到響應後完成域名與 IP 地址的轉換

2. 主要組件摘要

如上所述,systemd-resolved 有以下四個關鍵組件文件。理解這些文件的作用是核心。

2-1. /etc/resolv.conf

  • 傳統 Linux 系統中讀取 DNS 伺服器列表的位置
  • 但現在為了與 systemd 兼容,必須作為 符號鏈接 存在
  • 通常應設置為如下,以正常工作: bash /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
  • 也就是說,該文件在當前系統中起著 「傳統應用和 systemd-resolved 之間的中介作用」

2-2. /run/systemd/resolve/stub-resolv.conf

  • systemd-resolved 管理的 本地 DNS 中繼伺服器 (127.0.0.53) 信息
  • /etc/resolv.conf 指向該文件,則所有 DNS 請求都將通過 systemd-resolved 處理

2-3. /etc/systemd/resolved.conf

  • systemd-resolved核心設置文件
  • 可以在此設定 DNS=FallbackDNS= 等條目以指定優先級
  • 永久性設置,在重啟後仍然保持

2-4. /run/systemd/resolve/resolv.conf

  • systemd-resolved 管理的 實際 DNS 伺服器列表 的文件
  • 高級用戶可以將該文件改為 /etc/resolv.conf,直接向 DNS 伺服器發送請求(繞過設置)

3. 問題發生的例子:ISP 提供的路由器上設定的 DNS 伺服器不穩定時

  • 例如,中華民國知名的 ISP KT 的 DNS 伺服器(如:168.126.63.1)設定在路由器中,但我並沒有直接控制路由器的權限,會偶爾發生 DNS 問題。
  • KT DNS 的回應速度不穩定或者經常出現 UDP/TCP 握手失敗的情況
  • 如果 systemd-resolved 日誌中反覆出現以下信息,則是問題的徵兆: 使用降級功能集 TCP 代替 UDP 用於 DNS 伺服器 168.126.63.1. 使用降級功能集 UDP 代替 TCP 用於 DNS 伺服器 168.126.63.1.
  • 最終導致域名解析失敗 → 網站無法訪問現象

4. 推薦的 DNS 伺服器

名稱 地址 特點
Google DNS 8.8.8.8, 8.8.4.4 快速且穩定
Cloudflare DNS 1.1.1.1, 1.0.0.1 速度快且隱私保護優秀
Quad9 9.9.9.9 提供安全威脅過濾

5. 穩定的 DNS 設置方法

  1. 打開 /etc/systemd/resolved.conf 文件
[Resolve]
DNS=1.1.1.1 8.8.8.8
FallbackDNS=9.9.9.9
  1. 應用設置
sudo systemctl restart systemd-resolved
  1. 檢查 /etc/resolv.conf 是否正確鏈接
ls -l /etc/resolv.conf

→ 應鏈接至 /run/systemd/resolve/stub-resolv.conf

如有需要可強制重設:

sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

6. 注意 NetworkManager 的干預

使用 GUI 環境的 Ubuntu 可能會由 NetworkManager 覆蓋 DNS

  • 如果自動 DNS 設定已啟用,則可能會忽略 systemd-resolved 的設置
  • 解決方案: bash nm-connection-editor → 編輯連接 → IPv4 標籤 → 關閉自動 DNS → 輸入手動 DNS

7. 結論

  • KT DNS 經常報告不穩定,建議避免使用
  • 通過 systemd-resolved 進行 DNS 設置是一種在 Ubuntu 中提高穩定性的重要方法
  • 如果能準確了解和應用設置,可以減少由域名解析失敗帶來的壓力

8. Jesse 的評論

基於理解的設置是最強大的安全性和維護。希望這篇文章能對那些在 Ubuntu 上進行 DNS 設置時感到困惑的人提供實際幫助。