dnsmasq-域名访问及解析缓存

Posted by 周思进 on June 7, 2020

dnsmasq 是一个轻量级的 DNS、TFTP、PXE、路由公告和 DHCP 服务器。
本文介绍通过 dnsmasq 实现本地域名形式访问设备,及设备进行域名解析的时候将解析结果缓存到本地。

先简单说明下域名形式访问设备的使用场景,在局域网内如有大量的设备,一般要访问这台设备,就需要知道这台设备的 ip 地址,然后通过 ip 地址来访问设备。ip 可以认为是设备的真实身份,就好比一个人的身份证号一样,但你称呼对方的时候肯定是使用他的名称方便。

域名也是一样,比 ip 地址更容易记忆,比如你访问百度肯定是通过 www.baidu.com 来访问,而不会通过输入它的 ip 地址来访问。

不过数据交互还是需要通过 ip 通信来进行交互,所以需要将域名地址解析成对应的 ip 地址,该工作由 dns 服务器完成,比如国外的 8.8.8.8 和国内的 114.114.114.114 等服务器地址。

那些域名都是公网可访问的,其与 ip 的映射关系也都记录在公网 dns 服务器上,而本地域名地址访问设备,顾名思义这个域名地址只在局域网内有用,是在局域网内定义的,而 dnsmasq 可以用来作为本地的 dns 服务器,此时某主机想要访问局域网内的域名地址,则需要将 dns 地址设置成 dnsmasq 运行的服务器地址。

接下来说下具体的配置操作。


域名访问

源码可去官网进行下载:
http://dnsmasq.org/

下载后直接执行 make 就可以生成可执行文件 dnsmasq(在src目录下),如果想安装的话可以再执行 make install

暂不启动服务,先将域名及ip地址的映射关系写入到配置中,这里我们可以不用对 /etc/dnsmasq.conf 配置文件做修改,可以直接将映射关系写入到 /etc/hosts 文件中,如下:

echo "192.168.1.11 dev.sijin1" >> /etc/hosts

即访问域名 dev.sijin1 会自动解析成访问 192.168.1.11,这样就完成了域名映射配置,然后就是起 dnsmasq 服务了。

dnsmasq 需要通过 root 权限启动,但启动后会去除 root 权限,转为 nobody 身份运行(这个机制后面可以学习下进程去特权),如果你的系统没有 nobody 用户,那可以通过执行命令 ./dnsmasq -u username 启动。

服务启动完毕后,就需要将访问 PC 的其中一个 dns 地址修改成运行 dnsmasq 的主机地址,修改完成后,需刷新 dns,使其立即生效,如 windows 系统可在 cmd 执行执行 ipconfig/flushdns 命令使刚设置的 dns 地址立即生效。

然后在浏览器访问域名地址就可以访问对应的设备 ip 地址了。


解析缓存

一般域名解析后都会将解析结果缓存到本地,这样下次想继续访问这个域名的时候,如上次缓存的结果未过期,就无需再次进行域名解析操作,减少了这部分的时间消耗,提升客户访问速度。

如果设备没有 dns 缓存功能,可以通过 dnsmasq 来实现,设置也非常简单,在 /etc/resolv.conf 开头增加 nameserver 127.0.0.1 即可,然后重启 dnsmasq 服务。

这个是否有效可以通过对比测试验证,比如开启 dnsmasq 之前,设备 ping www.baidu.com 的同时进行抓包,然后结束当前 ping 操作,再执行一遍,再没有缓存的情况下,抓包可以看到每重新执行一次该 ping 操作,就会进行一次域名解析;而开启 dnsmasq 缓存功能后,只有第一次 ping 操作可以看到有进行域名解析,后面重新执行 ping 操作则没有再发起域名解析操作。