客戶内部有域名解析,需要用到自己的DNS伺服器,客戶VPC下的執行個體開的是DHCP的網絡類型,導緻客戶更改/etc/resolve.conf檔案之後,一重新開機就失效。
怎樣解決重新開機之後DNS失效?
Centos的虛機修改DNS比較簡單,有兩種方法:
1.vim /etc/sysconfig/network-scripts/ifcfg-eth0 , 在結尾追加:
重新開機網絡之後,如圖所示,/etc/resolv.conf中的DNS已經變成我自己的了。
2.直接修改/etc/resolv.conf檔案,将DNS修改成自己的,然後chattr +i /etc/resolv.conf。
如果是ubuntu 16的虛機,可以通過上述方法2,将DNS配置檔案寫保護來達到修改DNS的目的。如果是ubuntu 14的虛機,用chattr系統會提示錯誤:chattr: Operation not supported while reading flags on /etc/resolv.conf.
可以通過這種方式:
1.vim /etc/resolvconf/resolv.conf.d/head
2.執行resolvconf -u,/etc/resolv.conf就變成自己想要的了:
聽起來ubuntu 14的系統修改DNS也不是那麼難,如果僅僅是這樣,确實是不難,我們在給客戶解決方案的時候,踩了不少的坑,根據網絡上給兩種方式,最終檢視 /etc/resolv.conf ,最頂部的還是預設的兩個 DNS 伺服器:
最終利用大殺器,用strace來看resovlconf -u到底是如何工作的,才找到為何每次都将/etc/resolv.conf覆寫的元兇。
strace -s 256 -ff -o /tmp/strace.log resolvconf -u
find . -type f | xargs grep -ri 'resolv.conf' | less 将所有跟修改這個配置檔案相關的日志都過濾出來,一行一行檢視。
接着檢視strace.log,發現resolvconf 執行路徑中打開了 /etc/resolvconf/resolv.conf.d/head 并将他的内容寫到了DNS配置檔案中。
于是才有了上述的方法,修改/etc/resolvconf/resolv.conf.d/head,再執行resolvconf -u果然得到了我想要的結果。将結果回報給客戶,客戶嘗試也解決了ubuntu 14 DNS重新開機失效的問題了。
注:/etc/resolvconf/update.d 下面的兩個腳本檔案也比較有意思,大家可以閱讀一下。
還有一種比較推薦的方式:禁止DHCP client去更新DNS配置:
1.修改/etc/dhcp/dhclient.conf 中添加一行在requst前面:supersede domain-name-servers 你的DNS位址1, DNS位址2;
2.重新開機網絡,讓dhcp配置生效。
supersede man中的說明, 對有些選項來說,用戶端要想使用一個本地配置(locally-configured),就可以在supersede選項中定義。