如何在 resolv.conf 不斷被覆蓋時使用 dhclient 設置靜態 DNS?
在Debian NetworkConfiguration wiki之後,我一直在嘗試設置靜態OpenNIC DNS,但沒有成功。我嘗試的第一件事是直接編輯
/etc/resolv.conf
,但它一直被覆蓋。wiki 頁面列出了三種可能的覆蓋來源:
- 該**
resolvconf
**計劃- 守護**
network-manager
**程序- DHCP 客戶端
$ apt-cache policy resolvconf resolvconf: Installed: (none) Candidate: 1.76.1 Version table: 1.76.1 0 500 http://ftp.us.debian.org/debian/ jessie/main amd64 Packages $ apt-cache policy network-manager network-manager: Installed: (none) Candidate: 0.9.10.0-7 Version table: 0.9.10.0-7 0 500 http://ftp.us.debian.org/debian/ jessie/main amd64 Packages
考慮到我沒有
resolvconf
或沒有network-manager
安裝,我們可以假設源是 DHCP 客戶端。我正在wicd
用作 的替代方法network-manager
,但在屬性中設置靜態 dnswicd-gtk
不起作用。因此,我/etc/dhcp/dhclient.conf
通過添加編輯supersede domain-name-servers 50.116.40.226;
,但我/etc/resolv.conf
仍然是:$ cat /etc/resolv.conf nameserver 2001:558:feed::2 nameserver 2001:558:feed::1
這到底是怎麼回事?我應該安裝
resolvconf
以查看它是否可以工作?我應該放棄wicd
並安裝network-manager
嗎?
使用以下解決方法來防止 dhcp 客戶端更新您精心設計的 /etc/resolv.conf:
# chattr +i /etc/resolv.conf
我認為您的 DHCP 伺服器會發送未經請求的響應,因此如果您設置了 supersede 參數,您的 resolv.conf 也會被覆蓋。添加 +i attr 可能是一種解決方案,但如果您必須進行一些更改,則需要您手動取消設置並重新設置它。
實際上,您可以在客戶端編寫一些腳本(請參閱 參考資料
man 8 dhclient-script
)。這個主題也在debian wiki中進行了解釋:
另一種方法是使用 dhclient-script 的鉤子腳本。根據 dhclient-script(8):
啟動時,客戶端腳本首先定義一個 shell 函式 make_resolv_conf ,稍後用於創建 /etc/resolv.conf 文件。要覆蓋預設行為,請在 enter 掛鉤腳本中重新定義此函式。因此,我們可以通過執行以下操作來阻止 dhclient 覆蓋 resolv.conf:
echo 'make_resolv_conf() { :; }' > /etc/dhcp/dhclient-enter-hooks.d/leave_my_resolv_conf_alone chmod 755 /etc/dhcp/dhclient-enter-hooks.d/leave_my_resolv_conf_alone
需要執行位,因為 dhclient-script 使用 run-parts(8) 來決定要讀取哪些文件。出於同樣的原因,文件名只能包含字母、數字、下劃線和連字元。