Dnsmasq自建内网DNS

  前几天就连大名鼎鼎的114也挂了,看到业内QQ群里好多哥们一些只配置了一个可用DNS的业务纷纷躺枪。

  这里简单回顾下DNS的工作原理。DNS(Domain Name System)系统顾名思义是用于将域名转换为IP的系统。当用户主机上的应用程序需要使用域名进行联网时发起一个DNS请求:

  1. 主机操作系统会检查自己的hosts缓存文件和本地DNS解析器缓存里有没有这个域名对应的IP。

  2. 如果上一步查询失败,则会根据适配器网卡中的DNS配置,去访问DNS服务器进行请求,若该域名属于该DNS管辖的区域,则直接返回结果,否则查询该DNS服务器自身的缓存。这个过程也叫作递归查询

  3. 若上一步查询失败,则该DNS服务器会和上级DNS服务器之间展开迭代查询,直至查到最终结果后,由该DNS服务器将结果返回给用户。

  虽然自建的软DNS并不适合大规模使用,但对于机房项目里小范围主机集群内使用,还是扛得住的。那么构建一个可以自动连接到多个上游DNS的内部DNS就很有必要。

  另一方面,之前一个主机数量最多的项目里已经虚拟机+物理机50多台,主机名的解析是个潜在的问题。研发部门的同学之前已经提过,因为我们没有做内部的主机名解析导致出现问题了,当时暂时写入/etc/hosts文件临时解决了。但作为维护人员,从长远看这是个需要考虑的问题,所有主机的hosts文件都手动写死?那么这个项目里新增主机的时候会很痛苦,需要每台机器上都添加一条解析记录。通过自动化工具批量修改或许能缓解一下,但总是差点意思。

  本文使用Dnsmasq提供的DNS缓存功能来实现内网DNS。(当然他还支持DHCP、路由广播、网络启动,这里暂时用不到)。当接收到一个DNS请求时,在默认配置下就像普通主机一样,Dnsmasq首先会查找/etc/hosts这个文件,然后查找/etc/resolv.conf中定义的外部DNS。那么,在DNS服务器的/etc/hosts文件中加入本地内网服务器的解析列表共享出去,就可以解决内网服务器之间主机名解析的问题。同时,Dnsmasq可以支持配置上游DNS为多个,从而规避部分机器仅设置了单个DNS导致的偶然突发情况。这种服务中转的工作思路很眼熟,没错,和NTP中转是一个套路~

安装

  安装过程很简单,一条在线安装命令就可以搞定:

yum install dnsmasq

配置

  Dnsmasq的默认配置文件是/etc/dnsmasq.conf,初始状态下其实算是空配置。

  编辑配置文件,修改添加下属内容:

# 不使用默认的解析文件
# 默认的解析文件/etc/resolv.conf只允许填写3个DNS,
# 这是安装系统之前resolv.h里写死的
resolv-file=/etc/resolv.dnsmasq.conf
# 设置内网主机的解析列表
# 我们尽可能不使用默认文件,从而不影响Dnsmasq机器自身的工作
addn-hosts=/etc/dnsmasq.host
# 指定监听地址,防止监听不必要的IP,比如外网IP
# 同时需要指定本地监听,避免造成本机功能异常
listen-address=192.168.137.142,127.0.0.1

  编辑完配置文件后,运行语法检查命令确保语法正确:

dnsmasq -test

  注意,无回显即表示语法无误。此时记得手动关闭测试进程,以免待会儿正式开启服务时出现端口占用:

ps -ef | grep dnsmasq
kill -9 XXX

  为Dnsmasq添加上游DNS服务器,这里我们选择一些常见比较稳定的DNS服务器:

vim /etc/resolv.dnsmasq.conf
# 通用DNS
nameserver 114.114.114.114
# 百度DNS
nameserver 180.76.76.76
# 阿里DNS
nameserver 223.5.5.5
# 腾讯DNS
nameserver 119.29.29.29
# 谷歌DNS
nameserver 8.8.8.8

  为Dnsmasq添加本地内网主机解析列表,将本地项目的几十台机器的主机名和IP对应关系写入:

vim /etc/dnsmasq.host
10.0.1.101 vm_test1.localdomain
10.0.1.102 vm_test2.localdomain
10.0.1.103 vm_test3.localdomain

测试验证

  运行启动服务:

systemctl enable dnsmasq
systemctl start dnsmasq

  可以看到53端口已处于监听:

  在测试机上测试域名解析,可以正常解析:

  查看转发日志,发现由于我们没有配置严格的从上往下查询顺序,所以Dnsmasq在遇到不确定的域名(这里故意输错了一个不存在的域名www.qq,com)时会对上游DNS进行群发,符合我们的要求,可以避免单个DNS服务提供商的突发故障:


发表评论

评论列表,共 0 条评论

    暂无评论