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 等行。