dnsmasq 配置参数详解
dnsmasq 2.91 核心配置参数逐项详解,覆盖 port/domain-needed/bogus-priv/address/server/dhcp-range/interface 等常用指令的默认值、含义、写法与生产模板,配实测回显。
dnsmasq 配置参数详解
目标:系统讲解 dnsmasq 2.91 配置主文件 /etc/dnsmasq.conf 的常用参数——port、domain-needed、bogus-priv、address=、server=、dhcp-range=、interface= 等——给出各参数真实默认值、含义、写法和一套生产配置模板,并附实测回显。已在 Ubuntu 22.04 + dnsmasq 2.91 环境逐条实测。
一、环境信息
| 项目 | 值 |
|---|---|
| dnsmasq 版本 | 2.91-0ubuntu0.22.04.2 |
| 配置主文件 | /etc/dnsmasq.conf |
| 配置目录 | /etc/dnsmasq.d/(自动加载) |
| 默认缓存条数 | 150(cache-size) |
| 默认监听端口 | 53(port) |
| 默认 EDNS 报文上限 | 1232(edns-packet-max) |
| 默认租约文件 | /var/lib/misc/dnsmasq.leases |
| 默认 resolv 文件 | /etc/resolv.conf(resolv-file) |
| 服务托管 | systemd(dnsmasq.service) |
二、前置条件
- 已安装 dnsmasq(apt install dnsmasq)并能正常启动。
- 每次改配置建议先
dnsmasq --test -C <file>校验语法,再systemctl restart dnsmasq。 - 了解本机网卡名(
ip addr查看,示例为 eth0)、局域网 IP(示例 172.17.0.14)、上游 DNS(示例 192.168.146.2)。示例值需替换为真实值。
三、参数查看与修改方式
3.1 查看自带帮助与默认值
dnsmasq --help
实测回显(节选,含参数默认值):
-c, --cache-size=<integer> Specify the size of the cache in entries (defaults to 150).
-p, --port=<integer> Specify port to listen for DNS requests on (defaults to 53).
-P, --edns-packet-max=<integer> Maximum supported UDP packet size for EDNS.0 (defaults to 1232).
-D, --domain-needed Do NOT forward queries with no domain part.
-b, --bogus-priv Fake reverse lookups for RFC1918 private address ranges.
-A, --address=/<domain>/<ipaddr> Return ipaddr for all hosts in specified domains.
-S, --server=/<domain>/<ipaddr> Specify address(es) of upstream servers with optional domains.
-F, --dhcp-range=<ipaddr>,... Enable DHCP in the range given with lease duration.
-l, --dhcp-leasefile=<path> Where to store DHCP leases (defaults to /var/lib/misc/dnsmasq.leases).
3.2 配置生效与语法校验
配置文件放在 /etc/dnsmasq.conf 或 /etc/dnsmasq.d/ 下。改完先校验:
dnsmasq --test -C /etc/dnsmasq.conf
实测回显:
dnsmasq: syntax check OK.
校验通过后重启生效:
sudo systemctl restart dnsmasq
💡 说明:所有参数均可用「长选项名」(如
dhcp-range=)写在配置文件里,同时也可作为命令行参数(如--dhcp-range=)。配置里一行一个参数,#表示注释。
四、参数总览(常用)
| 参数 | 默认 | 作用 |
|---|---|---|
| port | 53 | DNS 监听端口;0=只做 DHCP/TFTP 不做 DNS |
| domain-needed | 关 | 不转发无点主机名查询 |
| bogus-priv | 关 | 屏蔽 RFC1918 私有地址反向查询的转发 |
| cache-size | 150 | DNS 缓存条目数 |
| address=/域/IP | 无 | 指定域名解析到固定 IP(本地权威) |
| server=/域/上游 | 读 resolv.conf | 指定上游 DNS(可按域名分流) |
| dhcp-range=起,止,租期 | 无 | 启用 DHCP 并定义分配段 |
| interface= | 全部接口 | 限定监听的网卡 |
| listen-address= | 全部地址 | 限定监听的 IP |
| resolv-file | /etc/resolv.conf | 上游 DNS 来源文件 |
| local=/域 | 无 | 只本地解析不转发该域 |
| dhcp-authoritative | 关 | 声明本机为权威 DHCP 服务器 |
| no-resolv | 关 | 不读 resolv.conf(配合 server= 用) |
五、核心参数分类详解
5.1 基础监听与端口
port(=53):DNS 服务监听端口。
port=53
💡 说明:设为 0 时完全关闭 DNS 功能,只保留 DHCP/TFTP。若本机 53 被其他进程占用,可换端口或改绑定接口(见 interface)。
interface:只监听指定网卡。dnsmasq 默认监听全部接口,指定后可避免与 systemd-resolved 冲突:
interface=eth0
bind-interfaces
listen-address:只监听指定 IP:
listen-address=172.17.0.14
5.2 转发与过滤(domain-needed / bogus-priv)
domain-needed:不转发无点号(无域部分)的查询,减少不必要上游请求:
domain-needed
bogus-priv:对内网私有地址段(RFC1918)的反向查询直接返回本地答案,不送到公网:
bogus-priv
5.3 本地域名解析(address=)
address=:把指定域名的 A/AAAA 记录固定解析到指定 IP,实现本地权威/泛解析/广告屏蔽:
address=/test.local/10.10.0.99
address=/example.com/0.0.0.0
实测验证(address=/test.local/10.10.0.99):
dig @172.17.0.14 test.local +short
实测回显:
10.10.0.99
💡 说明:写法为
address=/域名/IP,域名可多个用/分隔,如address=/baidu.com/qq.com/0.0.0.0;用/#/IP可做全域名泛解析。
5.4 上游 DNS(server= / resolv-file / no-resolv)
server=:指定上游 DNS,可整体指定或按域名分流:
# 全局上游
server=192.168.146.2
# 仅某域走指定上游
server=/example.com/8.8.8.8
# 反向域(192.168.0.0/24 → 3.168.192.in-addr.arpa)走指定上游
server=/3.168.192.in-addr.arpa/10.1.2.3
resolv-file / no-resolv:控制上游来源。默认读 /etc/resolv.conf;no-resolv 后只采用 server= 显式指定的上游:
no-resolv
server=192.168.146.2
实测验证(转发 example.com 成功):
dig @172.17.0.14 example.com +short
实测回显:
172.66.147.243
104.20.23.154
5.5 DHCP(dhcp-range= / dhcp-option= / dhcp-authoritative)
dhcp-range=:启用 DHCP 并给出分配起止与租期,是 DHCP 服务的关键参数:
# 起,止,租期(dh 表示小时)
dhcp-range=172.22.10.10,172.22.10.100,12h
# 带子网掩码的写法
dhcp-range=192.168.0.50,192.168.0.150,255.255.255.0,12h
实测验证(客户端 udhcpc 收获租约 172.22.10.57,租期 43200 秒=12h):
udhcpc: lease of 172.22.10.57 obtained, lease time 43200
服务器端日志:
dnsmasq-dhcp: DHCPACK(eth0) 172.22.10.57 76:67:f6:ad:41:70
dnsmasq-dhcp: sent size: 4 option: 51 lease-time 12h
dhcp-option=:给客户端下发附加选项(网关、DNS 等):
dhcp-option=option:router,172.22.0.2
dhcp-option=option:dns-server,172.22.0.2
dhcp-authoritative:声明本机为局域网唯一权威 DHCP,加快客户端收敛:
dhcp-authoritative
5.6 租约与缓存
dhcp-leasefile:租约文件(默认 /var/lib/misc/dnsmasq.leases):
dhcp-leasefile=/var/lib/misc/dnsmasq.leases
cache-size:DNS 缓存条目数,常见取 1000:
cache-size=1000
六、生产配置模板
适用环境:816GB 内存、普通 SATA/NVMe 磁盘的小型局域网服务器(10200 台客户端),CPU 2 核即可。日志交给 journald(systemd),租约落盘,DHCP 权威开启。
# ========== 基础 ==========
port=53
cache-size=1000
domain-needed
bogus-priv
no-host-record
# ========== 监听 ==========
interface=eth0
bind-interfaces
listen-address=172.17.0.14
# ========== 上游 DNS ==========
no-resolv
server=192.168.146.2
server=114.114.114.114
# ========== 本地泛解析 ==========
address=/test.local/10.10.0.99
# ========== DHCP ==========
dhcp-range=172.22.10.10,172.22.10.200,12h
dhcp-option=option:router,172.22.0.2
dhcp-option=option:dns-server,172.22.0.2
dhcp-authoritative
dhcp-leasefile=/var/lib/misc/dnsmasq.leases
# ========== 日志 ==========
log-queries
log-dhcp
⚠️ 注意:
listen-address、server、dhcp-range、网关 172.22.0.2 等请替换为实际局域网地址。模板里server=提供了备用的 114.114.114.114 作二线上游。
七、常见问题(FAQ)
7.1 Q1:配置里多个 server= 会怎么选
dnsmasq 对同一查询会轮询 server= 列出的上游(默认随机顺序),strict-order 参数可改为严格按顺序。域分流用 server=/域/上游,优先于全局上游。
7.2 Q2:为什么局域网设备分到 DHCP 后上不了网
先确认 dhcp-option=option:router 网关地址正确、dhcp-option=option:dns-server 指向 dnsmasq 能解析的上游。可 cat /var/lib/misc/dnsmasq.leases 看租约是否正常;再看 journalctl -u dnsmasq 有无 DHCPNACK。
7.3 Q3:address= 与 server= 同时命中同一域谁生效
address= 本地权威优先,dnsmasq 直接返回而不转发;server=/域/上游 只影响需要转发的查询。想屏蔽某域就用 address=/域/0.0.0.0,无需到上游。
7.4 Q4:改完配置怎么快速生效且不出错
一条命令校验成功后重启:
dnsmasq --test -C /etc/dnsmasq.conf && sudo systemctl restart dnsmasq
7.5 Q5:listen-address 写成 127.0.0.1 后局域网查不到
127.0.0.1 只监听本机回环,局域网其他主机自然无法用 dnsmasq。改成服务器局域网 IP(返回查 ip addr)。
八、参考链接
- dnsmasq 官方文档/示例:https://thekelleys.org.uk/dnsmasq/docs.html
- dnsmasq man 手册:
man 8 dnsmasq - Ubuntu dnsmasq 配置包:https://packages.ubuntu.com/jammy/dnsmasq