Linux确保/etc/resolv.conf不会通过DHCP客户端更新

时间:2020-01-09 14:16:16  来源:igfitidea点击:

dhclient提供了一种使用动态主机配置协议配置一个或多个网络接口的方法。每当我的笔记本电脑连接到另一个网络时,它也会更新我的/etc/resolv.conf文件。我想保留我现有的名称服务器。如何在基于Linux的系统上跳过/etc/resolv.conf更新?如何在Linux上阻止DHCP客户端更改resolv.conf? DHCP协议允许主机与中央服务器联系,该中央服务器维护可分配给一个或多个子网的IP地址列表。
该协议减少了系统管理工作量,几乎不需要手动配置就可以将设备添加到网络。

警告!许多防火墙仅允许访问特定的名称服务器。
因此,请确保您的名称服务器受支持。
此外,由于隐私问题,许多公司阻止监听名称服务器(例如OpenDNS)。

确保/etc/resolv.conf不会被DHCP客户端更新

有关DNS服务器的信息存储在/etc/resolv.conf文件中。
可以用cat命令看到它:

$ cat /etc/resolv.conf

您可以通过编辑/etc/resolv.conf文件来设置或更改DNS服务器。
但是,Linux上的dhcp客户端可能会更新此文件。
有多种方法可以解决此问题。
使用以下任何一种方法。
让我们看看如何阻止DHCP在Linux上更改resolv.conf文件。

写保护的/etc/resolv.conf文件

方法1:我将在基于Linux的系统上使用chattr命令来写保护您的/etc/resolv.conf文件。
语法为:

# chattr +i /etc/resolv.conf
  • i选项(属性)在Linux上写保护/etc/resolv.conf文件,因此没有人可以修改它,包括root用户。
    您可以在基于FreeBSD的系统上使用chflags命令。

创建dhclient-script钩子

方法2:dhclient会不时调用DHCP客户端网络配置脚本。

dhcp客户端使用此脚本在请求地址之前设置每个接口的初始配置,提供地址后测试该地址,并在获取租约后设置接口的最终配置。
该脚本并非旨在由最终用户定制。
如果需要本地自定义,则应该使用提供的输入和退出挂钩来实现它们。
这些挂钩将允许用户在创建/etc/resolv.conf文件时覆盖客户端的默认行为。
启动时,客户端脚本首先定义一个shell函数make_resolv_conf,该函数随后用于创建/etc/resolv.conf文件。
要覆盖默认行为,请在输入挂钩脚本中重新定义此功能。

创建挂钩以避免/etc/resolv.conf文件更新

您需要在Debian/Ubuntu Linux下创建/etc/dhcp/dhclient-enter-hooks.d/nodnsupdate文件:

# vi /etc/dhcp/dhclient-enter-hooks.d/nodnsupdate

追加以下代码:

#!/bin/sh
make_resolv_conf(){
	:
}

保存并关闭文件。
使用chmod命令设置权限:

# chmod +x /etc/dhcp/dhclient-enter-hooks.d/nodnsupdate

该脚本将用我们自己的函数替换make_resolv_conf()
此功能不执行任何操作,因此不会将IP地址添加到/etc/resolv.conf文件中。

关于基于Debian或Ubuntu的系统上的resolvconf程序的说明

如果安装了resolvconf程序,则不应在基于Debian或Ubuntu的系统上手动编辑resolv.conf配置文件,因为它将由系统中的程序动态更改。
如果需要手动定义名称服务器(与静态接口一样),请在/etc/network/interfaces文件的interfaces配置文件中添加类似于以下内容的行:

##Place the line indented within an iface stanza, e.g., right after the gateway line.##
dns-nameservers 8.8.8.8 127.0.0.1

关于RHEL/CentOS/Fedora Linux的说明

将以下代码放在/etc/dhclient-enter-hooks文件中:

# vi /etc/dhclient-enter-hooks

追加代码:

make_resolv_conf(){
	:
}

保存并关闭文件。
另一个选项是修改您的接口配置文件,例如/etc/sysconfig/network-scripts/ifcfg-eth0文件,并追加以下任一选项:

# do not overwrite /etc/resolv.conf ##
PEERDNS=no

或者

## use the following nameservers in /etc/resolv.conf ##
PEERDNS=no
DNS1=8.8.8.8
DNS2=1.2.3.4

保存并关闭文件。
其中:

  • PEERDNS = yes | no如果对等方使用msdns扩展名(仅PPP)或DNS {1,2},或者使用dhclient,则修改/etc/resolv.conf。默认为是。
  • DNS {1,2} = <ip地址>如果PEERDNS未设置为no,则提供放置到resolv.conf文件中的DNS地址。

配置dhclient.conf文件

方法3:/etc/dhclient.conf或/etc/dhcp/dhclient.conf文件包含dhclient的配置信息。
您可以使用此文件为特定接口或所有接口打开或关闭DNS更新和其他选项。

DHCLIENT.CONF和DHCP-OPTIONS的手册页指出,在dhclient.conf中,您应该添加以下内容:

supersede domain-name-servers 192.54.1.2, 199.2.3.4;

或者

prepend domain-name-servers 1.2.3.4, 1.2.3.5;

这是为您提供的示例配置:

timeout 60;
       retry 60;
       reboot 10;
       select-timeout 5;
       initial-interval 2;
       reject 192.33.137.209;

       interface "eth0" {
           send host-name "laptop-area51.theitroad.com.home";
           send dhcp-client-identifier 00:30:48:33:BC:32;
           send dhcp-lease-time 3600;
           supersede domain-search "net.in.home", "theitroad.local", "vpx.theitroad.com";
           prepend domain-name-servers 8.8.8.8, 127.0.0.1;
           request subnet-mask, broadcast-address, time-offset, routers,
                domain-search, domain-name, domain-name-servers, host-name;
           require subnet-mask, domain-name-servers;
       }

如何在Linux上停止网络危险更新/etc/resolv.conf

方法4:使用文本编辑器(例如vim命令或nano命令)编辑/etc/NetworkManager/NetworkManager.conf文件:

$ sudo vi /etc/NetworkManager/NetworkManager.conf

在[main]中添加/编辑/添加如下

dns=none

这是完整的配置:

[main]
plugins=ifupdown,keyfile
dns=none
 
[ifupdown]
managed=false
 
[device]
wifi.scan-rand-mac-address=no

在vim文本编辑器中保存并关闭文件。
下次重新启动Linux机器时,在Linux上使用nm(network-manager)时/etc/resolv.conf文件将不会更新。