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