You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

dnsmasq读取addn-hosts配置但未生效,仍回退使用系统/etc/hosts的问题排查

dnsmasq读取addn-hosts配置但未生效,仍回退使用系统/etc/hosts的问题排查

首先,我帮你梳理下几个关键的排查点和可能的问题根源:

1. 先确认测试方式是否准确——别被系统nsswitch的解析顺序误导

你提到添加域名到/etc/hosts就生效,但其实这可能是系统域名解析的优先级问题,而非dnsmasq本身的问题。

系统默认的/etc/nsswitch.conf里,hosts配置通常是:

hosts: files dns myhostname

这意味着系统会先读取本地/etc/hosts文件,再去查询DNS服务器。所以你直接用ping或浏览器测试时,可能根本没走到dnsmasq就已经读取了/etc/hosts的内容。

正确的测试方式应该是直接查询dnsmasq服务:

dig @127.0.0.1 1.example.com

如果这个命令返回0.0.0.0,说明dnsmasq的配置其实是生效的,问题出在系统解析顺序;如果返回真实IP,再继续排查dnsmasq本身。

2. 你的addn-hosts配置可能用错了选项

dnsmasq中,addn-hosts是用来指定单个额外hosts文件的,而如果要加载整个目录下的所有hosts文件,应该用hostsdir选项!

你当前配置的是:

addn-hosts=/etc/hosts.d

但/etc/hosts.d是目录,不是单个文件。虽然日志显示dnsmasq读取了目录里的文件,但这可能是某些版本的兼容行为,并非标准用法,很可能导致匹配异常。

修改配置文件/etc/NetworkManager/dnsmasq.d/00-add-hosts.conf:

# 替换原来的addn-hosts行
hostsdir=/etc/hosts.d

然后重启NetworkManager生效:

sudo systemctl restart NetworkManager

3. 检查dnsmasq的查询日志,确认解析行为

你已经开启了log-queries,可以通过日志查看dnsmasq对目标域名的处理逻辑:

journalctl -u NetworkManager | grep "1.example.com"
  • 如果日志里出现reply 1.example.com is 0.0.0.0,说明dnsmasq已经正确解析了域名,问题在系统解析顺序;
  • 如果出现forwarding 1.example.com to 192.168.0.1,说明dnsmasq没有匹配到hostsdir里的记录,需要检查:
    • 域名拼写是否完全一致(比如有没有多写/漏写.、www前缀等);
    • /etc/hosts.d下的文件格式是否正确(必须是IP 域名的格式,用空格分隔,不能用tab或多余字符);
    • 文件权限是否允许dnsmasq读取(目录权限设为755,文件权限设为644即可,dnsmasq用户需要读权限)。

4. 确认no-hosts选项是否真的生效

从你ps的结果看,dnsmasq确实带了--no-hosts参数,理论上会忽略系统/etc/hosts。但如果你直接用系统命令测试还是读取了/etc/hosts,那一定是nsswitch的解析顺序导致的——系统先读了files(即/etc/hosts),根本没走到dnsmasq。

如果希望系统优先使用dnsmasq的解析结果,可以修改/etc/nsswitch.conf的hosts行:

hosts: dns files myhostname

但注意:这样修改后,所有域名查询都会先走dnsmasq,再读本地hosts,适合你的sinkhole场景。


备注:内容来源于stack exchange,提问作者vrs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 13:04:32