dnsmasq读取addn-hosts配置却忽略,fallback到系统/etc/hosts问题求助
看起来你遇到的问题确实有点蹊跷——明明日志显示dnsmasq已经读取了/etc/hosts.d里的文件,但解析就是不按预期走,甚至明明加了no-hosts,系统/etc/hosts还在生效。我来帮你一步步排查:
1. 先纠正addn-hosts的用法误区
你现在用addn-hosts=/etc/hosts.d指向目录,但dnsmasq的addn-hosts参数设计是用来指定单个额外hosts文件的。如果要加载整个目录下的所有hosts文件,应该改用hostsdir=/etc/hosts.d这个参数。虽然你的日志显示dnsmasq读取了目录里的文件,但这可能是dnsmasq的兼容行为,实际解析时没有正确应用这些条目。
修改/etc/NetworkManager/dnsmasq.d/00-add-hosts.conf:
log-queries no-hosts # 替换addn-hosts为hostsdir hostsdir=/etc/hosts.d address=/development/127.0.0.1
2. 确认no-hosts是否真的生效
你提到系统/etc/hosts的内容依然生效,但ps输出里启动命令确实有--no-hosts,这有点矛盾。可以做个快速测试:
- 在/etc/hosts里临时加一条:
192.168.99.99 test-no-hosts.com - 执行
dig @127.0.0.1 test-no-hosts.com - 如果返回192.168.99.99,说明
no-hosts没有真正生效,可能是NetworkManager的dnsmasq模块在启动时额外注入了加载/etc/hosts的配置?
这种情况下,可以尝试在00-add-hosts.conf里再加一条hostsfile=/dev/null,强制dnsmasq不加载任何默认hosts文件。
3. 直接测试dnsmasq的解析逻辑
不要用ping(ping可能会调用系统的hosts缓存或者其他解析方式),改用dig/nslookup直接指定dnsmasq的地址,确保测试的是dnsmasq本身的解析:
dig @127.0.0.1 1.example.com nslookup 1.example.com 127.0.0.1
看看返回的IP是不是0.0.0.0。如果还是不对,查看dnsmasq的实时日志,观察它怎么处理查询:
# 先重启NetworkManager让配置生效 sudo systemctl restart NetworkManager # 实时查看dnsmasq相关日志 journalctl -u NetworkManager -f | grep dnsmasq
然后再执行dig命令,看日志里有没有对应的查询记录,以及dnsmasq是怎么返回结果的。
4. 检查/etc/hosts.d目录和文件的权限
虽然日志显示dnsmasq读取了文件,但还是确认一下权限:dnsmasq运行在dnsmasq用户下,所以/etc/hosts.d目录和里面的文件需要让dnsmasq用户有可读权限:
sudo chmod 755 /etc/hosts.d sudo chmod 644 /etc/hosts.d/* sudo chown -R root:root /etc/hosts.d
(不需要改成dnsmasq用户所有,只要保证其他用户有读权限就行)
备注:内容来源于stack exchange,提问作者vrs

