一、故障背景
在 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
报错信息解读:
- Bad address in –address at line 17:dnsmasq 解析运行配置文件时,第 17 行的
address配置项格式非法,校验不通过; - FAILED to start up:因配置格式错误,dnsmasq 核心进程启动失败;
- 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 跳过错误配置正常启动。
- 删除违规的 address 配置项
uci del_list dhcp.@dnsmasq[0].address='homeassistant.local/192.168.81.38'
- 保存 UCI 配置并强制清理残留进程
# 保存配置(关键:让修改写入系统配置文件) uci commit dhcp # 强制杀死崩溃循环的 dnsmasq 残留进程,避免干扰新启动 killall -9 dnsmasq
- 全新启动 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 配置文件,而非运行配置文件。