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

 

 

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