官方文档
简介
Dnsmasq 是一个轻量级的 DNS 服务器,也可以作为 DHCP 服务器使用。但作为轻量级的产品,不适合终端数过多的场景。具体的数量限制可自行测试,一般作为百来台终端场景的 DNS 服务器是可以胜任的。
场景介绍
我使用的场景为:公司内部服务全部通过域名访问,但都不能被外网访问,且内网访问的域名要和外网域名区分开,这时通过搭建一个集中的 DNS 服务器,再通过 DHCP 服务器下发 DNS 服务器地址,即可实现客户端无需修改配置网络信息同时也可解析内网域名进行系统访问。
安装
我这里使用 Debian12 操作系统,直接使用官方软件源进行安装即可
apt install dnsmasq -y
配置
配置文件默认路径为 /etc/dnsmasq.conf ,其中的配置内容全部被注释,但我们只需要关注以下几个部分即可
本地域名解析
dnsmasq 服务通过配置本地域名解析可以实现特定域名解析到指定 IP 的目的,对于内网场景尤为适用,如我想将 a.example.com 域名解析到内网服务器 192.168.133.127 地址上,即可使用 address 参数,参数格式如下:
address=/域名/目标IP
实际配置:
address=/a.example.com/192.168.133.127
同样也支持通配符域名解析,如将 *.example.com 域名解析到内网服务器 192.168.133.127 地址上,将 *.example.cn 域名解析到内网服务器 192.168.133.128 地址上
address=/*.example.com/192.168.133.127
address=/*.example.cn/192.168.133.128
不过默认配置中, 没有配置 address 参数,这时就会读取 /etc/hosts 文件并通过该文件内容解析请求的域名,我们可以指定自定义的 hosts 文件以区分系统文件与自定义文件,自定义的 hosts 文件内容格式与系统 /etc/hosts 文件相同,指定自定义 hosts 文件使用 addn-hosts 参数,直接在配置文件中指定即可:
addn-hosts=/etc/dnsmasq.hosts
另外自定义 hosts 文件和系统 hosts 文件优先级低于 address 参数优先级。如果不想让dnsmasq 使用 hosts 文件进行域名解析,可以使用以下参数禁用,直接在 dnsmasq.conf 配置文件中添加即可:
no-hosts
上游 DNS 服务器
当 dnsmasq 服务本地域名解析中未配置请求对应的域名时就需要向上游 DNS 服务器进行请求解析,如请求解析 a.example.net ,但 dnsmasq 只配置了 *.example.com 域名和 *.example.cn 域名,这时就需要向上游 DNS 服务器请求解析。
默认配置中,dnsmasq 会读取 /etc/resolv.conf 文件中的 DNS 服务器地址作为上游服务器,但我们可以通过 resolv-file 参数指定自定义的 resolv.conf 文件,如 dnsmasq-resolv.conf 文件,该自定义文件内容格式与 /etc/resolv.conf 文件相同,只是用于区分自定义文件和系统文件。示例配置:
resolv-file=/etc/dnsmasq-resolv.conf
该配置优先级高于 /etc/resolv.conf 文件,当自定义的文件中未找到需要解析的域名,才会向 /etc/resolv.conf 文件中的 DNS 服务器进行请求解析。
另外还可以通过 server 参数指定上游 DNS 服务器,该参数优先级高于 resolv-file 参数。参数格式:
# 基础格式。所有未在本地解析的域名都会向该上游 DNS 服务器请求解析
server=IP地址
# 域名特定解析格式。指定域名向指定的上游 DNS 服务器请求解析,其余域名都向基础格式配置的上游 DNS 服务器请求解析。同时也可使用通配符域名。
server=/域名/IP地址
server=/*.域名/IP地址
# 本地解析格式。指定域名只在本地域名中解析,不向上游 DNS 服务器进行请求解析
server=/本地域名/
实际配置:
# 基础格式。所有未配置在本地域名解析中的域名都会向下方指定的上游 DNS 服务器请求解析
server=223.5.5.5
server=8.8.8.8
server=114.114.114.114
# 域名特定解析格式。a.example.com 域名解析请求转发到 192.168.100.101 地址的 DNS 服务器进行解析,所有以 example.cn 结尾的域名解析请求转发到 192.168.100.102 地址的 DNS 服务器进行解析。
server=/a.example.com/192.168.100.101
server=/*.example.cn/192.168.100.102
# 本地解析格式。a.example.cn 域名只在本地域名解析中解析,不向上游 DNS 服务器进行请求解析
server=/a.example.cn/
如果不想让 dnsmasq 使用 /etc/resolv.conf 文件中的 DNS 服务器地址作为上游 DNS 服务器,只使用自定义的上游 DNS 服务器,则在 dnsmasq.conf 配置文件中添加以下参数即可:
no-resolv
至此已经可以满足基础的 DNS 解析服务了,更多参数使用方法可以参考默认配置文件中的注释进行配置。
配置完成后重启或者重新加载服务配置文件即可:
# 重启服务
systemctl restart dnsmasq
# 重新加载配置文件
systemctl reload dnsmasq
重新加载配置文件会存在不能立即生效的问题,这是因为有缓存,可以通过在配置文件中添加以下参数禁用缓存:
cache-size=0
然后重新加载配置文件使其生效,便可优化。