Debian

如何在 resolv.conf 不斷被覆蓋時使用 dhclient 設置靜態 DNS?

  • May 9, 2018

Debian NetworkConfiguration wiki之後,我一直在嘗試設置靜態OpenNIC DNS,但沒有成功。我嘗試的第一件事是直接編輯/etc/resolv.conf,但它一直被覆蓋。wiki 頁面列出了三種可能的覆蓋來源:

  1. 該**resolvconf**計劃
  2. 守護**network-manager**程序
  3. 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) 來決定要讀取哪些文件。出於同樣的原因,文件名只能包含字母、數字、下劃線和連字元。

引用自:https://unix.stackexchange.com/questions/249399