由于历史原因一直在用经典网络的 ECS,在安全性方面要弱于 VPC,所以决定将服务器迁移到 VPC 中。给 ECS 配置自定义 DNS 服务器的好处是可以给 ECS 分配自定义后缀的域名,比如 web01.abc
,这样在内网定位服务器就很方便,不用去记一堆内网 IP,如果配置得当,还可以通过 host $ip
这个命令寻找 IP 对应的服务器。
一开始的时候我按照给经典网络 Centos ECS 配 DNS 服务器的方法来操作,直接修改 /etc/resolv.conf
,把里面的 nameserver
配置改成了自己内网中 DNS 服务器 IP,但是发现重启服务器之后会被重置成阿里云分配的 DNS 服务器。
经过研究之后发现,是 Ubuntu 的 resolvconf 会在每次启动的时候将 /etc/resolv.conf
覆盖。/etc/resolv.conf
本质上是一个软链,会链接到 /run/resolvconf/resolv.conf
,而后者可以通过 resolvconf -u
命令重新生成,生成的内容来自于两个地方:
-
/etc/resolvconf/resolv.conf.d/
目录下的head
base
tail
3 个文件,看文件名就能明白分别是做什么用,阿里云的 ECS 服务器的 tail 文件里定义了阿里云 DNS 服务器地址。 -
/run/resolvconf/interface/
目录下的{xx}.dhclient
,在阿里云是eth0.dhclient
,这里也定义了阿里云 DNS 服务器地址,数据来源是 DHCP 服务器。
所有我一开始的思路是:
- 将
/etc/resolvconf/resolv.conf.d/tail
中的阿里云 DNS 替换为我们自己的。 - 禁用 DHCP,修改
/etc/network/interfaces
文件,把iface eth0 inet dhcp
改成iface eth0 inet static
,当然还需要补全 ip 地址、网关、掩码等。
在删除了 /run/resolvconf/interface/eth0.dhclient
文件之后,执行 service networking restart && resolvconf -u
之后,发现 /etc/resolv.conf
里的内容变成了我们期望的值。
但是后来发现同一个 VPC 的不同子网之间 ECS 无法互通,检查之后发现是路由表配置不正确,原因就是之前把 DHCP 给改成了静态 IP,看来 DHCP 是不能禁了,只好重新寻找解决方案。
想到阿里云 DNS 服务器的值是来源于 DHCP,于是就尝试搜索禁止从 DHCP 获得 DNS 服务器,找到了一个相关的问答,有两种方法,一是将 /etc/dhcp/dhclient.conf
文件中 request
配置项的 domain-name, domain-name-servers, domain-search
参数移除,二是在 /etc/dhcp/dhclient.conf
文件中追加一行 supersede domain-name-servers $dns_ip;
。
为了保险起见,我把两个方法都用上,然后执行 rm -f /run/resolvconf/interface/eth0.dhclient && service networking restart && resolvconf -u
,再重启了一次服务器。检查 /etc/resolv.conf
符合预期,与其他子网 ECS 也能互通,搞定。