dnsmasq使用

2234 字
11 分钟
dnsmasq使用

一、dnsmasq介绍#

1.1 简介#

dnsmasq 是一个轻量级、功能强大的网络服务工具,常用于中小型网络或嵌入式系统(如路由器、虚拟化环境等)。它可以同时提供 DNS 缓存服务、DHCP 服务、TFTP 服务、PXE 启动支持等功能。

1.2 基本概述#

dnsmasq 的主要目标是为本地网络提供简单易用的网络基础服务,通常用在:

  • 局域网 (LAN)
  • 虚拟化平台(如 libvirt、KVM、OpenStack)
  • 树莓派、OpenWRT、嵌入式设备
  • 容器网络(如 Docker、Podman)

它通过一个配置文件(通常是 /etc/dnsmasq.conf)集中管理网络服务。

1.3 主要功能#

  • **DNS 缓存服务器:**dnsmasq 可以作为上游 DNS 的代理服务器,对解析结果进行缓存,提升网络解析速度。

    • 加快域名解析速度;

    • 减少外部 DNS 查询次数;

    • 可配置静态域名映射(本地 DNS 记录)。

  • **DHCP 服务:**dnsmasq 还可以充当 DHCP 服务器,为局域网设备动态分配 IP 地址。

  • **TFTP 服务:**dnsmasq 可以提供 TFTP 服务,用于无盘启动或网络刷机。

  • **PXE 网络启动:**结合 DHCP 与 TFTP,可以让设备通过网络加载启动镜像(常用于自动化安装系统、测试环境)。

  • **DNS 重定向 / 局域网劫持:**可以用来实现简单的广告屏蔽或内部域名解析。

二、安装配置#

2.1 yum安装#

Terminal window
yum install dnsmasq -y
# 验证版本
dnsmasq -v

2.2 软件配置#

2.2.1 配置路径#

Terminal window
/etc/dnsmasq.conf # 主配置文件(单文件模式)
/etc/dnsmasq.d/ # 分模块配置目录

/etc/dnsmasq.conf

  • /etc/dnsmasq.conf 是 dnsmasq 的主配置文件,用于配置 dnsmasq 的全局选项和参数。
  • 在这个文件中,你可以配置诸如监听地址、缓存大小、域名解析规则、DHCP设置等全局性的选项。
  • 所有的配置都直接写入到这个文件中。

/etc/dnsmasq.d/ 目录

  • /etc/dnsmasq.d/ 目录是一个目录,用于存放 dnsmasq 的额外配置文件。
  • 在这个目录中,你可以创建多个以 .conf 为后缀的配置文件,每个文件可以包含特定的配置选项。
  • 这种组织结构使得配置更加灵活,可以将不同功能或用途的配置分开放置在不同的文件中,便于管理和维护。

启动时的加载顺序:

Terminal window
1. 读取 /etc/dnsmasq.conf
2. 解析 conf-file / conf-dir 指令
3. 加载 /etc/dnsmasq.d/*.conf

2.2.2 模块化配置#

这里不将所有配置全都放到dnsmasq.conf中,而是将配置文件拆分多个模块,放在dnsmasq.d文件夹中,而主配置文件dnsmasq.conf只作为启动文件

2.2.2.1 修改主配置文件#

编辑 /etc/dnsmasq.conf只保留这一行(其他全部注释或删除):

Terminal window
# 加载 /etc/dnsmasq.d/ 下所有 .conf 配置
conf-dir=/etc/dnsmasq.d/,*.conf

2.2.2.2 在模块文件夹下创建配置文件#

  1. 模块 1:00-base.conf 基础核心配置
Terminal window
# 监听 DNS 端口(标准 53)
port=53
# 不解析不带域名的主机名(避免无效广播解析),拒绝解析类似 pc01 这种无域名的请求。
domain-needed
# 不返回内网私有地址的反向解析(防泄露、防污染),拒绝 10/172.16/192.168 等内网段的反向解析。
bogus-priv
# 自动给简单主机名补上域名(如 test → test.lan)
expand-hosts
# 定义本地域名(可选)
domain=lan
  1. 01-listen.conf 监听地址 / 网卡
Terminal window
# 监听本机所有 IP(内网 IP + 127.0.0.1)。明确 dnsmasq 在哪几个 IP 上提供 DNS
listen-address=127.0.0.1,192.168.1.10
# 只绑定指定网卡,不监听 0.0.0.0(更安全)强制只绑定上面列出的 IP,不监听全网卡。
bind-interfaces
# 只允许在 eth0 上提供服务(可选二选一)按网卡控制,适合多网卡机器。
# interface=eth0
# 排除某个网卡(可选)
# except-interface=docker0
  1. 模块 3:02-dns-cache.conf DNS 缓存配置
Terminal window
# 缓存条目数量(根据内存调整:512M → 10000;2G → 50000)
cache-size=10000
# 不缓存“解析失败”的结果(避免一直返回错误)
no-negcache
# 最小缓存 TTL(单位秒),防止上游 TTL 太短
min-cache-ttl=60
# 最大缓存 TTL
max-cache-ttl=86400

参数作用:

  • cache-size:DNS 解析结果缓存条数,越大越吃内存。
  • no-negcache:不缓存 NXDOMAIN(域名不存在)。
  • min/max-cache-ttl:控制缓存时间,稳定内网解析。
  1. 模块 4:03-upstream-dns.conf 上游公共 DNS
Terminal window
# 不使用系统 /etc/resolv.conf 作为上游
no-resolv
# 向上游 DNS 递归查询(阿里云 + 114 示例)
server=223.5.5.5
server=223.6.6.6
server=114.114.114.114
# 同时查询所有上游,取最快返回(可选)
all-servers

参数作用:

  • no-resolv:禁止读取系统自带 DNS,保证配置可控。
  • server=IP:定义上游递归 DNS,可写多个。
  • all-servers:并发查询所有上游,降低延迟。
  1. 04-local-hosts.conf 本地自定义域名
Terminal window
# 方式一:使用额外 hosts 文件(推荐)
# 从自定义 hosts 读取本地域名
addn-hosts=/etc/dnsmasq.hosts
echo >> /etc/dnsmasq.hosts <<EOF
192.168.1.10 router.lan
192.168.1.20 nas.lan
192.168.1.30 pihole.lan
EOF
# 方式二:直接在 dnsmasq 配置写(简单)
# 静态域名解析
address=/router.lan/192.168.1.10
address=/nas.lan/192.168.1.20
# 泛解析(*.test.lan → 192.168.1.100)
address=/test.lan/192.168.1.100

**参数作用 : **

  • addn-hosts:加载额外 hosts,不污染系统 /etc/hosts
  • address=/域名/IP:强制指定域名解析结果,可做内网劫持、广告拦截。
  1. 05-log.conf 日志配置
Terminal window
# 记录所有 DNS 查询请求
log-queries
# 日志输出到文件(也可以用 systemd 日志)
log-facility=/var/log/dnsmasq.log
# 异步日志,不阻塞 DNS 响应
log-async

参数作用

  • log-queries:记录谁查了什么域名。
  • log-facility:指定日志文件。
  • log-async:异步写日志,提升性能。

2.2.2.3 验证语法和测试#

Terminal window
# 验证语法,出现ok则代表没问题
dnsmasq --test
# 启动软件
systemctl start dnsmasq
# 测试
dig @127.0.0.1 router.lan
# 结果如下
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.16 <<>> @127.0.0.1 router.lan
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7685
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;router.lan. IN A
;; ANSWER SECTION:
router.lan. 0 IN A 192.168.1.10
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Feb 10 16:16:51 CST 2026
;; MSG SIZE rcvd: 55

2.2.3 全局配置#

2.2.3.1 全局参数#

参数说明
resolv-file定义dnsmasq从哪里获取上游DNS服务器的地址,默认从/etc/resolv.conf获取。
strict-order表示严格按照resolv-file文件中的顺序从上到下进行DNS解析,直到第一个解析成功为止。
listen-address定义dnsmasq监听的地址,默认是监控本机的所有网卡上。
address启用泛域名解析,即自定义解析A记录。例如:address=/long.com/192.168.115.10,访问long.com时的所有域名都会被解析成192.168.115.10
bogus-nxdomain对于任何被解析到此IP的域名,将响应NXDOMAIN使其解析失效。可以多次指定,通常用于对于访问不存在的域名,禁止其跳转到运营商的广告站点。
server指定使用哪个DNS服务器进行解析,对于不同的网站可以使用不同的域名对应解析。例如:server=/google.com/8.8.8.8表示对于google.com的服务,使用谷歌的DNS解析。
Terminal window
# 在/dnsmasq.conf中创建如下内容
resolv-file=/etc/dnsmasq-resolv.conf # 指定上游DNS服务器列表文件
strict-order # 按顺序查询上游DNS服务器
listen-address=127.0.0.1,192.168.106.33 # 监听自身服务器IP地址
addn-hosts=/etc/dnsmasq.hosts # 额外的hosts文件
cache-size=10000 # 设置DNS缓存大小
log-facility=/var/log/dnsmasq.log # 日志文件位置

参数说明:

  • resolv-file:这个选项指定了 dnsmasq 应该使用的 resolv.conf 文件的位置。通常情况下,dnsmasq 会读取系统的 resolv.conf 文件来获取 DNS 服务器的配置,但是通过这个选项可以指定一个自定义的文件。
  • strict-order:这个选项告诉 dnsmasq 在解析域名时是否应该严格按照 /etc/resolv.conf 中列出的 DNS 服务器顺序进行查询。如果设置为 strict-order,dnsmasq 将严格按照列表顺序进行查询;如果未设置或设置为 no, 则将按照最快响应的顺序进行查询。
  • listen-address:这个选项指定了 dnsmasq 监听的 IP 地址。dnsmasq 只会在指定的 IP 地址上接收 DNS 查询请求,一般配置自身服务器的 IP 地址。
  • addn-hosts:这个选项指定了 dnsmasq 应该读取的附加 hosts 文件的位置。dnsmasq 在解析域名时会优先查找这个文件,以便将域名解析到指定的 IP 地址。
  • cache-size:这个选项设置了 dnsmasq 缓存的大小为 10000 条记录。它决定了 dnsmasq 可以缓存的 DNS 查询结果的数量。
  • log-facility:这个选项指定了 dnsmasq 日志的位置。dnsmasq 将会把日志信息写入到指定的文件中。

2.2.3.2 创建需要的文件#

  1. 创建/etc/dnsmasq-resovl.conf
Terminal window
# 添加内容
server=223.5.5.5
server=223.6.6.6
server=114.114.114.114
  1. 创建/etc/dnsmasq.hosts
Terminal window
# 添加内容
echo >> /etc/dnsmasq.hosts <<EOF
192.168.1.10 router.lang
192.168.1.20 nas.lang
192.168.1.30 pihole.lang
EOF

2.2.3.3 验证语法和测试#

Terminal window
# 验证语法,出现ok则代表没问题
dnsmasq --test
# 启动软件
systemctl start dnsmasq
# 测试
dig @127.0.0.1 router.lang
# 结果如下
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.16 <<>> @127.0.0.1 router.lang
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14737
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;router.lang. IN A
;; ANSWER SECTION:
router.lang. 0 IN A 192.168.1.10
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Feb 10 16:36:44 CST 2026
;; MSG SIZE rcvd: 56

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

dnsmasq使用
https://2233941.xyz/posts/dnsmasq使用教程/
作者
lumifly
发布于
2026-07-26
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
lumifly
不逐世间万丈星河,自守一隅细碎明光
✨ 今日一言
" 加载中... "
——
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
本年还剩 -- --%
本月还剩 -- --%
本周还剩 -- --%
距离--
--
--
天气预报
站点统计
文章
24
分类
1
标签
15
总字数
136,852
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.12.1
文章许可
CC BY-NC-SA 4.0

文章目录