dnsmasq 部署笔记

发现实验室留着5台主机没人用,反正闲着也是闲着,于是琢磨着部署个集群玩玩,貌似有很多东西并没有亲自体验过,如ceph,mesos,kubernetes等,之后应该会贴出相关的笔记。

无论部署什么服务,只要是分布式的,基本离不开域名解析,因为我基本记不住IP,所以DNS服务就很必要了。

本文为我在ubuntu上配置DNS服务的笔记,这里ubuntu的版本为16.04,DNS程序为DNSmasq。

按照DNSmasq的官方描述,这是一个能够为小型网络设施提供DNS和DHCP服务的服务器程序,基本上各大发行版基本都有对应的包,总体而言它很“轻”。而我只需要为5台主机提供服务,完全够用,当然本文只涉及DNSmasq的DNS功能。

如下为5台服务器的IP和域名:

域名IP
node0.cpv.org192.168.1.230
node1.cpv.org192.168.1.231
node2.cpv.org192.168.1.232
node3.cpv.org192.168.1.233
node4.cpv.org192.168.1.234

ubuntu的源里就有DNSmasq的包,因此我们就不必大费周章地编译了。

sudo apt install dnsmasq

DNSmasq的配置文件主要为:

  1. /etc/dnsmasq.conf文件
  2. /etc/dnsmasq.d文件夹内的其他配置文件

从优先级来看,后者更高。如今的很多服务器程序都采用类似的配置策略,比如Nginx,只不过DNSmasq是自动加载后者的罢了。之后我们会在dnsmasq.d文件夹内添加本地命名解析表,而dnsmasq.conf则是关于服务器本身的配置信息。

在进行配置前,首先我们需要修改本机的nameserver,这里推荐直接修改/etc/network/interface文件,将dns-nameservers一项设置为127.0.0.1即可。

DNSmasq位于node0,它需要为node0和集群之外的主机提供DNS服务,因此在它监听的地址应该分别为:

  • 127.0.0.1
  • 192.168.1.230

只需要修改配置文件dnsmasq.conf中的listen-address即可,将其修改为

listen-address=127.0.0.1,192.168.1.230

DNSmasq处理DNS查询请求的流程如下:

  1. 查看DNS缓存
  2. 如1失败,则查看本地记录(包括hosts内的记录)
  3. 如2失败,则向上一级DNS服务转发查询请求

因此必须为DNSmasq提供上一级DNS服务器的信息,具体的做法是为DNSmasq提供一个resolv,其对应的文件为/etc/resolv.dnsmasq,该文件的格式和resolv.con一样,例如:

nameserver 202.102.93.153
nameserver 8.8.4.4

只需按照如下命令运行即可:

dnsmasq -r /etc/resolv.dnsmasq

这里必须要提供绝对路径,一般而言相对路径对于daemon进程并没有什么意义。

不过很明显,我们应该让systemd来协助管理服务,并且并没有理由去修改dnsmasq.service,毕竟有配置文件。修改前面提到的dnsmasq.conf,添加

resolv-file=/etc/resolv.dnsmasq

为了使上述配置生效,需要重启DNSmasq(如果你之前已经启动过了的话)

sudo systemctl restart dnsmasq

此时,配置应该已经生效了,让我们来测试一下,祭出网络测试专用域名

root@cluster-0:/etc# dig baidu.com
; <<>> DiG 9.10.3-P4-Ubuntu <<>> baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 47004
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;baidu.com.         IN  A
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Aug 10 21:58:14 CST 2016
;; MSG SIZE  rcvd: 27

然而并没有查到A类记录,ping的结果也是unknow host,似乎配置文件并没有生效啊。

先查看下DNSmasq进程的信息吧。

root@cluster-0:/etc# ps -ax | grep dnsmasq
17218 ?        S      0:00 /usr/sbin/dnsmasq -x /var/run/dnsmasq/dnsmasq.pid -u dnsmasq -r /var/run/dnsmasq/resolv.conf -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local-service --trust-anchor=.,19036,8,2,49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5

怎么加载的是/var/run/dnsmasq/resolv.conf?一定是哪里出了问题,既然是systemd管理的服务,那么就从service文件入手,打开/etc/systemd/system/multi-user.target.wants/dnsmasq.service,发现了如下信息:

ExecStart=/etc/init.d/dnsmasq systemd-exec

So,虽然切换到了systemd,但依旧是initrc的那一套?不管了,打开探探究竟。

发现了如下内容:

\# Note that if the resolvconf package is installed it is not possible to 
\# override it just by configuration in /etc/dnsmasq.conf, it is necessary
\# to set IGNORE_RESOLVCONF=yes in /etc/default/dnsmasq.

也就是说如果系统安装了resolvconf,那么默认情况下修改/etc/dnsmasq.conf是没有用的,那么就按照注释所说,将/etc/default/dnsmasq中的相关项加上即可(其实就是去掉最后一行的'#')。

然后再次重启dnsmasq服务,此时我们应该就能够获得baidu域名的A类记录了。

好,接下来就是添加本地的记录了,这里可以采用2种方式:

  1. 直接修改hosts文件,dnsmasq在启动时会自动加载
  2. 在dnsmasq.d中添加相关配置

这里采用的是后者,/etc/dnsmasq.d/cluster.conf的内容如下:

address=/node0.cpv.org/192.168.1.230
address=/node1.cpv.org/192.168.1.231
address=/node2.cpv.org/192.168.1.232
address=/node3.cpv.org/192.168.1.233
address=/node4.cpv.org/192.168.1.234

表达的意思即为如果有host查询nodeX.cpv.org的记录,即强制返回对应的静态IP,不在继续向上发送请求。

除此之外,可能还会用到如下写法:

server=/google.com/10.25.3.4

如果host查询的域名为*.google.com则将请求转发给对应IP的DNS服务器。此处的IP地址为随便指定的,只用来作个示例。

重启服务后,就能用ping或者dig来验证结果了,应该不会再有什么问题,至少我这里是这样的。

关于更加深入的内容,暂时并没有涉及,如果未来有需要,会更新本文,并在ChangeLog处给出提示。

说两句: