如果你是一位 Ubuntu 用戶,可能都曾經遇到過「域名無法訪問,但 IP 卻可以」的情況。在這種情況下,問題的根源大多出在 DNS 設定上。最近的 Ubuntu 系統預設使用 systemd-resolved
這個 DNS 解析器守護進程,因此了解其結構是非常重要的。
1. DNS 請求的流程
仔細閱讀並理解下面的摘要,幾乎所有的問題都能迎刃而解。
- 用戶在瀏覽器等應用程序中請求域名
- Linux 本身會讀取
/etc/resolv.conf
來解析 DNS(該文件是與/run/systemd/resolve/stub-resolv.conf
的符號鏈接。) /run/systemd/resolve/stub-resolv.conf
設定為127.0.0.53
,最終導致systemd-resolved
的出現。- 系統的
systemd-resolved
受限於設定文件/etc/systemd/resolved.conf
- 也就是說,
systemd-resolved
根據/etc/systemd/resolved.conf
中設置的 DNS 伺服器進行查詢, - 收到響應後完成域名與 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 設置方法
- 打開
/etc/systemd/resolved.conf
文件
[Resolve]
DNS=1.1.1.1 8.8.8.8
FallbackDNS=9.9.9.9
- 應用設置
sudo systemctl restart systemd-resolved
- 檢查
/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 設置時感到困惑的人提供實際幫助。
Add a New Comment