DNS服务器dnsmasq的简单用法
简介:dnsmasq是一个轻量级的DNS、DHCP和TFTP服务器软件,专为小型网络和路由器设计。它能够为局域网提供DNS缓存和DHCP服务,同时支持PXE网络启动功能
主要功能:
- DNS服务:dnsmasq可以作为本地DNS服务器,缓存DNS查询结果,加速域名解析速度。它支持将特定域名解析到本地IP地址,常用于开发测试环境或家庭网络
- DHCP服务:能够为局域网内的设备自动分配IP地址、网关、DNS服务器等网络配置信息
- TFTP服务:支持PXE网络启动,允许客户端通过网络启动操作系统
核心特点:
- 轻量级:资源占用极低,适合嵌入式设备和路由器
- 配置简单:通过单个配置文件即可完成所有设置
- 高性能:支持DNS缓存,减少对外部DNS服务器的查询
- 安全性:支持DNS查询过滤,可屏蔽广告域名
- 跨平台:支持Linux、macOS、Windows等系统
常用场景:dnsmasq广泛应用于家庭路由器、企业内网、开发测试环境、虚拟化平台等场景。在开发中,常用于将本地域名(如test.local)解析到开发服务器,方便多项目开发测试
本例子中演示使用ubuntu服务器,环境准备:
| IP | 192.168.51.246 | 192.168.49.224 |
| 用途 | DNS服务器 | 应用服务器 |
1、安装dnsmasq,执行命令如下:
apt install dnsmasq
systemctl enable dnsmasq --now #启动并设置自启动
注:ubuntu自带一个systemd-resolved.service也是提供本地DNS解析功能,可先停掉,否则提示53端口冲突
systemctl stop systemd-resolved
systemctl disable systemd-resolved
2、常用的dnsmasq的参数如下:
- domain-needed:丢弃所有不包含点号(
.)的纯主机名查询,默认不启用,需要取消注释,比如请求test域名,如果/etc/hosts中找不到,也不会发送到上游服务器,防止私有地址泄露到公网 - port: 默认端口53,如果需要修改取消注释修改即可
- bogus-priv: 过滤私有 IP 地址的反向 DNS 查询(PTR 记录查询),防止这些查询被转发到上游公共 DNS 服务器,如果没有开启bogus-priv,那么dig -x 192.168.1.1 @DNSIP 反向解析会被发送到上游DNS服务器中,在家庭和企业环境中,配合domain-needed使用,一起保护隐私,提高解析效率
- dnssec:dnsmasq 会对从上游 DNS 服务器接收到的 DNS 响应进行 DNSSEC 验证,确保返回的 DNS 记录未被篡改,防止 DNS 欺骗攻击,配合dnssec-check-unsigned一起使用,启用dnssec需要上游 DNS 服务器支持 DNSSEC 验证,也会增加解析延迟和 CPU 开销
- no-resolv:开启后将不读取/etc/resolv.conf中的nameserver地址为上游服务器,将使用server配置的地址为上游服务器,否则就读取/etc/resolv.conf
- resolv-file:用于指定上游 DNS 服务器列表的配置文件路径,例如:resolv-file=/etc/resolv.dnsmasq,内容如下:
# /etc/resolv.dnsmasq
nameserver 8.8.8.8
nameserver 1.1.1.1
如果同时指定了 resolv-file和 server参数,server参数会覆盖 resolv-file中的配置
- server:指定上游DNS服务器,如果配置了server,会覆盖resove-file参数
# 使用 Google DNS
server=8.8.8.8
server=8.8.4.4
# 使用 Cloudflare DNS
server=1.1.1.1
server=1.0.0.1
# 指定端口
server=8.8.8.8#53
# 为特定域指定专用服务器
server=/google.com/8.8.8.8
server=/cloudflare.com/1.1.1.1
# 使用 DNS over TLS (DoT)
server=8.8.8.8@853
server=1.1.1.1@853
# 使用 DNS over HTTPS (DoH)
server=https://dns.google/dns-query
server=https://cloudflare-dns.com/dns-query
- address:用于配置本地 DNS 记录,实现域名到 IP 地址的静态映射,如下:
# 格式:address=/域名/IP地址
address=/example.com/192.168.1.100
address=/test.local/10.0.0.200
# 所有 .local 域名都解析到 192.168.1.1
address=/.local/192.168.1.1
- 注意:如果/etc/hosts中配置了相同的域名,会覆盖掉address的地址,如果要禁止/etc/hosts而使用address,那么需要配置no-hosts参数或者addn-hosts
- addn-hosts:指定域名解析的文件位置,类似/etc/hosts,优先级高于address
addn-hosts=/etc/dnsmasq-hosts
#vim /etc/dnsmasq-hosts
192.168.0.1 abcd.com
- no-hosts:开启后,将不会读取/etc/hosts文件,所以不建议开启
- listen-address:监听地址,可直接写本机IP和回环地址即可
- interface:监听网络接口,填写本机网卡即可
- log-queries:记录所有DNS日志
- log-facility:日志位置
- cache-size:缓存大小,单位为条数
- local-ttl:客户端缓存的DNS记录时间,单位为秒
完整的常用配置如下:
#port=5353
domain-needed
bogus-priv
##dnssec 开启后解析会变慢
##dnssec-check-unsigned
#resolv-file=
no-resolv
server=8.8.8.8
server=8.8.4.4
server=1.0.0.1
server=/google.com/8.8.8.8
server=/cloudflare.com/1.1.1.1
#address=/local.gong.com/192.168.49.15
interface=ens3
listen-address=192.168.51.246,127.0.0.1
cache-size=150
local-ttl=300
#no-hosts 不开启那就读取/etc/hosts
#addn-hosts=/etc/dnsmasq-hosts #和/etc/hosts用一个就行了
log-queries
log-facility=/var/log/dnsmasq.log
配置完成后,可通过命令测试配置是否正常,然后重启dnsmasq,如下:
dnsmasq --test
systemctl restart dnsmasq
3、验证
在DNS服务器上配置/etc/hosts文件,添加域名解析,如图:

在应用服务器上配置DNS地址指向DNS服务器,如图:

配置好后ping对应的域名,已经成功解析,如图:



也可以通过dig命令来测试解析,如图:

如果没有dig命令可通过命令安装,如下:
apt install bind-uils
or
yum -y install bind-uils


