Linux 系統重裝或遷移後常遇到域名解析失敗,需修改 DNS 設定。本文區分臨時生效(重啟失效)與永久生效兩種場景,提供適用於主流發行版的標準操作方法。
/etc/resolv.conf:系統實際使用的 DNS 解析設定檔適用於測試、臨時網路環境切換:
sudo vim /etc/resolv.conf
修改內容為:
nameserver 8.8.8.8
nameserver 8.8.4.4
search example.com
nameserver:DNS 伺服器 IP,首行為主 DNS,次行為備用search:預設搜尋域(可選)驗證: ping google.com 或 dig example.com 即時生效。重啟或網路服務重啟後設定將被覆蓋。
# 1. 編輯 systemd-resolved 設定
sudo vim /etc/systemd/resolved.conf
# 2. 在 [Resolve] 區塊設定
[Resolve]
DNS=8.8.8.8 8.8.4.4
# Domains=example.com # 可選
# DNSSEC=no # 可選
# 3. 重啟服務並啟用開機自啟
sudo systemctl restart systemd-resolved
sudo systemctl enable systemd-resolved
# 4. 確保 /etc/resolv.conf 為 systemd 管理的符號連結
ls -l /etc/resolv.conf
# 應指向 ../run/systemd/resolve/stub-resolv.conf
# 若非連結,需重建:
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
# 1. 編輯基礎設定檔
sudo vim /etc/resolvconf/resolv.conf.d/base
# 2. 加入 nameserver 行
nameserver 8.8.8.8
nameserver 8.8.4.4
# 3. 更新生效
sudo resolvconf -u
# 列出連線
nmcli con show
# 修改特定連線 DNS(例:連線名為 "Wired connection 1")
nmcli con mod "Wired connection 1" ipv4.dns "8.8.8.8 8.8.4.4"
nmcli con mod "Wired connection 1" ipv4.ignore-auto-dns yes
nmcli con up "Wired connection 1"
sudo vim /etc/netplan/01-netcfg.yaml
# 或 50-cloud-init.yaml 等
# 在 ethernets 區塊加入:
ethernets:
eth0:
dhcp4: true
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
search: [example.com]
# 套用
sudo netplan apply
# 查看目前生效 DNS
cat /etc/resolv.conf
# 或
systemd-resolve --status
# 或
resolvectl status
# 測試解析
dig @8.8.8.8 google.com
nslookup google.com
# 檢查 systemd-resolved 狀態
systemctl status systemd-resolved
journalctl -u systemd-resolved -f
| 錯誤做法 | 後果 | 正確做法 |
|---|---|---|
| 直接編輯 /etc/resolv.conf 以為永久 | 重啟/網路重啟後被覆蓋 | 使用上述永久方案 |
| 同時存在 systemd-resolved 與 resolvconf | 衝突導致解析異常 | 擇一使用,建議 systemd-resolved |
| 修改設定後未重啟對應服務 | 不生效 | 必須 restart/reload 服務 |
| 容器環境修改宿主機設定 | 容器內不生效 | 容器內單獨配置或掛載 resolv.conf |
依據你的發行版與網路管理工具選擇對應永久方案,避免「改了不生效」或「重啟失效」的困擾。