问题背景
客户内部有域名解析,需要用到自己的DNS服务器,客户VPC下的实例开的是DHCP的网络类型,导致客户更改/etc/resolve.conf文件之后,一重启就失效。
怎样解决重启之后DNS失效?
DHCP的虚机如何修改DNS
Centos的虚机
Centos的虚机修改DNS比较简单,有两种方法:
1.vim /etc/sysconfig/network-scripts/ifcfg-eth0 , 在结尾追加:
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
DNS1=10.0.1.1
DNS2=10.0.1.2
重启网络之后,如图所示,/etc/resolv.conf中的DNS已经变成我自己的了。
2.直接修改/etc/resolv.conf文件,将DNS修改成自己的,然后chattr +i /etc/resolv.conf。
Ubuntu虚机
如果是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
将DNS信息写进去:
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.0.1.1
nameserver 10.0.1.2
nameserver 10.0.1.3
2.执行resolvconf -u,/etc/resolv.conf就变成自己想要的了:
听起来ubuntu 14的系统修改DNS也不是那么难,如果仅仅是这样,确实是不难,我们在给客户解决方案的时候,踩了不少的坑,根据网络上给两种方式,最终查看 /etc/resolv.conf ,最顶部的还是默认的两个 DNS 服务器:
A: vi /etc/network/interfaces 新增:
dns-nameservers 10.0.1.1
dns-nameservers 10.0.1.2
B: sudo vim /etc/resolvconf/resolv.conf.d/base 新增:
nameserver 10.0.1.1
nameserver 10.0.1.2
resolvconf -u
最终利用大杀器,用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选项中定义。
The supersede statement
supersede [ option declaration ];
If for some option the client should always use a locally-configured
value or values rather than whatever is supplied by the server, these
values can be defined in the supersede statement.