OpenWRT dnsmasq 启动失败(崩溃循环)排查与修复实战

 

一、故障背景

在 OpenWRT 环境中配置 dnsmasq 作为 DNS 服务时,出现服务脚本显示 running 但 53 端口始终未监听的异常现象,尝试常规重启服务(/etc/init.d/dnsmasq restart)无效。通过实时跟踪 dnsmasq 运行日志,最终精准定位核心故障并完成修复,本文完整记录从日志排查到服务恢复的全流程,适用于同类故障场景参考。

二、核心排查与修复步骤(从实时日志定位错误开始)

步骤 1:实时跟踪日志,精准定位启动失败根源

dnsmasq 服务异常时,实时运行日志是定位问题的核心手段(远优于依赖服务脚本的 status 命令,其易出现缓存假状态),通过以下命令捕获实时报错信息:

logread -f | grep -i dnsmasq

关键报错信息输出

Tue Feb  3 21:12:50 2026 daemon.crit dnsmasq[1]: Bad address in --address at line 17 of /var/etc/dnsmasq.conf.cfg01411c
Tue Feb 3 21:12:50 2026 daemon.crit dnsmasq[1]: FAILED to start up
Tue Feb 3 21:12:50 2026 daemon.info procd: Instance dnsmasq::cfg01411c is in a crash loop 7 crashes, 0 seconds since last crash

报错信息解读

  1. Bad address in –address at line 17:dnsmasq 解析运行配置文件时,第 17 行的 address 配置项格式非法,校验不通过;
  2. FAILED to start up:因配置格式错误,dnsmasq 核心进程启动失败;
  3. crash loop 7 crashes:OpenWRT 服务管理进程 procd 检测到 dnsmasq 启动失败,反复尝试重启,陷入崩溃循环。

错误源关联/var/etc/dnsmasq.conf.cfg01411c 是 OpenWRT 由 /etc/config/dhcp 自动生成的 dnsmasq 运行配置,其报错行对应 /etc/config/dhcp 中自定义的本地域名解析配置,因格式违规导致启动失败。

步骤 2:紧急修复配置,终止崩溃循环并启动服务

核心思路:删除/注释违规的 address 配置项,保留其他正常的 DNS 核心配置(端口 53、监听地址、上游 DNS 等),让 dnsmasq 跳过错误配置正常启动。

  1. 删除违规的 address 配置项
uci del_list dhcp.@dnsmasq[0].address='homeassistant.local/192.168.81.38'
  1. 保存 UCI 配置并强制清理残留进程
# 保存配置(关键:让修改写入系统配置文件)
uci commit dhcp
# 强制杀死崩溃循环的 dnsmasq 残留进程,避免干扰新启动
killall -9 dnsmasq
  1. 全新启动 dnsmasq 并设置开机自启
# 启动服务 + 开机自启,避免OpenWRT重启后服务失效
/etc/init.d/dnsmasq start && /etc/init.d/dnsmasq enable

步骤 3:三重验证,确认服务完全恢复正常

放弃依赖 status 命令的缓存状态,采用 Linux 底层进程 + 端口监听 + 解析功能 三重硬指标验证,确保服务真实运行。

验证 1:检查 dnsmasq 真实进程是否启动

pidof dnsmasq

正常结果:输出一串数字 PID(如 1568),表示 dnsmasq 核心进程已成功运行。

验证 2:检查 53 端口是否被 dnsmasq 独占监听

# 全量查询53端口的TCP/UDP监听状态(含进程信息)
ss -tulwnp | grep 53

正常结果(关键看 dnsmasq 进程和 :53 端口):

udp   UNCONN 0      0         0.0.0.0:53        0.0.0.0:*    users:(("dnsmasq",pid=1568,fd=5))
tcp   LISTEN 0      32        0.0.0.0:53        0.0.0.0:*    users:(("dnsmasq",pid=1568,fd=6))

验证 3:验证 DNS 解析功能(本地+外网全链路)

# 测试外网域名解析(验证上游DNS转发功能)
nslookup www.baidu.com 127.0.0.1
# 测试本地局域网IP反向解析(验证基础功能)
nslookup 192.168.0.1

正常结果:两条命令均能返回对应的 IP 或域名信息,说明 DNS 解析链路完全通畅。

三、进阶补充:本地域名解析的正确配置方法

若需实现自定义本地域名解析(如将 homeassistant.local 解析到 192.168.0.38),需遵循 dnsmasq 对 address 配置项的严格格式规范,以下两种常用正确写法可直接使用(选其一即可):

写法 1:单域名解析(仅解析主域名)

仅解析 homeassistant.local 主域名,不包含子域名:

# 格式规范:/目标域名/目标IP
uci add_list dhcp.@dnsmasq[0].address='/homeassistant.local/192.168.0.38'
# 保存配置并重启服务生效
uci commit dhcp && /etc/init.d/dnsmasq restart

写法 2:泛域名解析(包含所有子域名)

解析 homeassistant.local 及所有 *.homeassistant.local 子域名:

# 格式规范:/.泛域名/目标IP(前缀加.表示泛域名)
uci add_list dhcp.@dnsmasq[0].address='/.homeassistant.local/192.168.0.38'
# 保存配置并重启服务生效
uci commit dhcp && /etc/init.d/dnsmasq restart
注意:配置完成后必须执行 uci commit dhcp 保存配置,并重启 dnsmasq 服务,否则配置不会生效;同时确保域名和 IP 无拼写错误,避免再次触发启动失败。

四、故障总结与经验沉淀

  • 「日志为王」:logread -f | grep -i dnsmasq 是排查 dnsmasq 故障的核心命令,能实时输出启动细节和报错信息,比 status 命令更精准、更可靠;
  • 配置格式严格:dnsmasq 对自定义配置项(如 address)的格式要求极高,微小的格式错误(如缺少前缀、引号不闭合)会直接导致服务启动失败;
  • 验证硬标准:判断 dnsmasq 服务是否正常运行,需满足「进程有有效 PID + 53 端口被监听 + 本地/外网解析正常」三者缺一不可,拒绝依赖服务脚本的缓存状态;
  • 崩溃循环处理:遇到 procd 崩溃循环时,需先通过 killall -9 dnsmasq 强制清理残留进程,再重新启动服务,避免进程冲突导致的启动失败;
  • 配置溯源:/var/etc/ 下的 dnsmasq 运行配置由 /etc/config/dhcp 自动生成,故障排查时需溯源至原始 UCI 配置文件,而非运行配置文件。

OpenWRT dnsmasq 故障排查修复实战 | 创作时间:2026-02-03