如何在 resolv.conf 不断被覆盖时使用 dhclient 设置静态 DNS?

lsc*_*u22 6 dns dhcp debian resolv.conf dhclient

Debian NetworkConfiguration wiki 之后,我一直在尝试设置静态OpenNIC DNS,但没有成功。我尝试的第一件事是直接编辑/etc/resolv.conf,但它不断被覆盖。维基页面列出了三种可能的覆盖来源:

  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
Run Code Online (Sandbox Code Playgroud)

考虑到我没有resolvconf或没有network-manager安装,我们可以假设源是一个 DHCP 客户端。我正在使用wicd作为替代network-manager,但在wicd-gtk属性中设置静态 dns不起作用。因此,我/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
Run Code Online (Sandbox Code Playgroud)

这到底是怎么回事?我应该安装resolvconf看看它是否有效吗?我应该放弃wicd并安装network-manager吗?

小智 5

我认为您的 DHCP 服务器发送了未经请求的响应,因此如果您设置了 supersede 参数,您的 resolv.conf 也会被覆盖。添加 +i 属性可能是一个解决方案,但如果您必须进行一些更改,则需要您手动取消设置并重新设置它。

事实上,您可以在客户端编写一些脚本(请参阅 参考资料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
Run Code Online (Sandbox Code Playgroud)

需要执行位,因为 dhclient-script 使用 run-parts(8) 来决定读取哪些文件。出于同样的原因,文件名不能包含除字母、数字、下划线和连字符之外的任何内容。


ctr*_*l-d 0

使用以下解决方法可以防止 dhcp 客户端更新精心设计的 /etc/resolv.conf:

# chattr +i /etc/resolv.conf
Run Code Online (Sandbox Code Playgroud)