Linux确保/etc/resolv.conf不会通过DHCP客户端更新
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文件将不会更新。