Contents

Linux DHCP DNS重開機跑掉的問題

問題描述

在 Linux 上使用 DHCP 取得 IP 時,雖然手動設定了 DNS,但每次重開機後 /etc/resolv.conf 的 DNS 設定就會被覆蓋,導致 DNS 解析失敗。

DHCP 與 DNS 的關係

DHCP(Dynamic Host Configuration Protocol)在分配 IP 時,同時也會提供 DNS 伺服器資訊。當網路服務啟動或 DHCP 更新 lease 時,DHCP client 程式(如 dhclient)預設會將 DHCP 伺服器提供的 DNS 寫入 /etc/resolv.conf覆蓋掉手動設定的內容。

解決方法

CentOS / RHEL(使用 ifcfg 設定)

修改對應網卡的設定檔,加入 PEERDNS=no,告知 DHCP client 不要更新 DNS 設定:

1
2
# 假設網卡為 eth0
sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0

在設定檔中加入或修改:

1
2
3
4
BOOTPROTO=dhcp
PEERDNS=no          # 加入這行,禁止 DHCP 覆蓋 DNS
DNS1=8.8.8.8        # 指定想使用的 DNS
DNS2=8.8.4.4

修改後重啟網路:

1
2
3
sudo systemctl restart network
# 或
sudo service network restart

Ubuntu / Debian(使用 resolvconf 或 systemd-resolved)

方法一:鎖定 resolv.conf(不建議長期使用)

1
2
# 將檔案設為不可修改
sudo chattr +i /etc/resolv.conf

方法二:使用 resolvconf 管理

1
2
3
4
sudo apt install resolvconf

# 在介面設定中加入 DNS
sudo vi /etc/resolvconf/resolv.conf.d/base

加入:

1
2
nameserver 8.8.8.8
nameserver 8.8.4.4

更新設定:

1
sudo resolvconf -u

方法三:使用 systemd-resolved(Ubuntu 18.04+)

1
2
# 編輯 resolved 設定
sudo vi /etc/systemd/resolved.conf
1
2
3
[Resolve]
DNS=8.8.8.8 8.8.4.4
FallbackDNS=1.1.1.1
1
sudo systemctl restart systemd-resolved

/etc/resolv.conf 說明

1
2
3
4
5
# /etc/resolv.conf 範例
nameserver 8.8.8.8      # 主要 DNS 伺服器
nameserver 8.8.4.4      # 備用 DNS 伺服器
search example.com      # 搜尋網域(短名稱會自動補全)
options timeout:2       # DNS 查詢逾時秒數

參考資料