Linux中/etc/resolv.conf被自动覆盖

1. 问题综述

某台CentOS7服务器重启后,发现内部服务无法访问另外的外网某服务,进而发现该服务器中写在/etc/resolv.conf中的DNS信息被改动了,进而导致其DNS解析失效。顺藤摸瓜后发现其/etc/resolv.conf确实被NetworkManager service改动过了。

是如何被改动的呢?我们来看看它的interface信息 /etc/sysconfig/network-scripts/ifcfg-enp0s3 文件:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=fbee7939-d530-4973-bd84-b3f890ee54aa
DEVICE=enp0s3
ONBOOT=yes
DNS1=114.114.114.114
DNS2=8.8.8.8 

 体现在 /etc/resolv.conf 中如下:

[root@centos ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search vbox3
nameserver 114.114.114.114
nameserver 8.8.8.8

 

2. 解决方法

解决思路也比较直接,就是不再用NetworkManager来管理interface,用network service来替代,然后去掉interface控制文件中的DNS信息,换用编辑/etc/resolv.conf统一管理。操作如下:

1)确认interface是否被NetworkManager来管理

[root@centos ~]# nmcli device status
DEVICE       TYPE      STATE      CONNECTION
enp0s3       ethernet  connected  enp0s3
docker0      bridge    unmanaged  --
veth0e00f51  ethernet  unmanaged  --
veth74e43de  ethernet  unmanaged  --
veth76d304f  ethernet  unmanaged  --
vethd6f04e1  ethernet  unmanaged  --
lo           loopback  unmanaged  --

state中是 connected ,则表示该interface被NetworkManager管理了,如果显示 unmanaged ,则表示没有被其托管。

为什么要禁止NetworkManager来托管interface呢?因为在功能上,network早已替代了NetworkManager,而且更加强大,某些interface配置中的字段对于NetworkManager而已不工作,因此,为了避免麻烦,我们取代之。

2)换用network来管理interface

编辑 /etc/sysconfig/network-scripts/ifcfg-enp0s3 ,增加一行 NM_CONTROLLED=no ,再执行重启network命令 systemctl restart network ,我们再看如上:

[root@centos ~]# nmcli device status
DEVICE       TYPE      STATE      CONNECTION
docker0      bridge    unmanaged  --
enp0s3       ethernet  unmanaged  --
veth0e00f51  ethernet  unmanaged  --
veth74e43de  ethernet  unmanaged  --
veth76d304f  ethernet  unmanaged  --
vethd6f04e1  ethernet  unmanaged  --
lo           loopback  unmanaged  --

可见已经生效。

3)禁止network修改DNS

进过以上步骤后,我们来重启下network service,发现/etc/resolv.conf还是被修改了,因为至此我们所做的事情无非是将/etc/resolv.conf自动修改权从NetworkManager移交给network,如果此时想让network不要在重启的时候来修改/etc/resolv.conf,那我们还需要在网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-enp0s3  中增加一行:

PEERDNS=no

表示在重启network的时候,我不再需要根据interface配置信息中DNS信息来更新/etc/resolv.conf了。重启之后,发现/etc/resolv.conf果然没有再被更新。

如果需要一了百了、避免误解,还是建议直接删除 DNS1 等行。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章