CentOS 7下DNSMasq配置后dig查询无应答区域且返回NXDOMAIN问题排查
CentOS 7下DNSMasq配置后dig查询无应答区域且返回NXDOMAIN问题排查
我仔细看了你的配置和命令输出,问题的核心很明确:你的系统当前并没有使用本地运行的dnsmasq服务来做DNS查询,而是直接走了公共DNS(8.8.8.8),所以自然查不到你本地hosts里配置的域名。
先给你拆解下问题点:
- 你的dnsmasq监听在
5353端口(从dnsmasq.conf的port=5353可以看到),但系统默认的DNS查询端口是53,所以你直接运行dig或nslookup时,会用resolv.conf里的DNS服务器(最后是8.8.8.8),根本没请求本地的dnsmasq。 - 虽然resolv.conf里写了
nameserver 127.0.0.1,但因为dnsmasq不在53端口监听,这个配置相当于无效,系统连不上本地的DNS服务,就会自动往下用后面的8.8.8.8。 - ping能通是因为ping优先读取本地hosts文件,和DNS服务无关,这就是为啥ping正常但DNS查询失败。
下面是一步步的解决方法:
第一步:先验证dnsmasq本身的配置是否正常
先确认dnsmasq能正确解析你的本地域名,运行这条命令:
dig @127.0.0.1 -p 5353 ns.mallet.lan
如果返回结果里有ANSWER SECTION,显示192.168.1.100,说明dnsmasq的配置本身没问题,只是系统没把它作为默认DNS。
第二步:让dnsmasq监听默认的53端口
系统默认DNS查询都是走53端口,把dnsmasq改回这个端口会省很多事:
- 编辑
/etc/dnsmasq.conf,把port=5353改成port=53(或者直接注释掉这行,因为默认就是53)。 - 检查53端口是否被其他服务占用,比如bind、systemd-resolved:
ss -tulpn | grep :53
如果有其他服务在占用,先停止它们(比如systemctl stop named或systemctl stop systemd-resolved),再重启dnsmasq:
systemctl restart dnsmasq
第三步:确保系统默认DNS指向本地dnsmasq
CentOS 7的NetworkManager会自动覆盖/etc/resolv.conf,所以需要先禁用这个行为:
- 编辑
/etc/NetworkManager/NetworkManager.conf,在[main]节添加一行:
dns=none
- 重启NetworkManager生效:
systemctl restart NetworkManager
- 手动修改
/etc/resolv.conf,让它优先查询本地dnsmasq,同时把你的本地域名加入搜索域:
nameserver 127.0.0.1 nameserver 192.168.0.1 nameserver 8.8.8.8 search mallet.lan home
第四步:验证修复效果
现在运行dig ns.mallet.lan,你应该能看到:
- SERVER字段显示
127.0.0.1#53 - ANSWER SECTION里返回
192.168.1.100
同时nslookup ns.mallet.lan也会正确返回IP地址。
另外补充两个注意点:
- 如果需要让局域网内其他机器也能用这个dnsmasq服务,记得开放防火墙的53端口:
firewall-cmd --add-service=dns --permanent firewall-cmd --reload
- 你的dnsmasq配置里有
strict-order,它会让dnsmasq严格按照resolv.conf里的顺序查询上游DNS,保持127.0.0.1在resolv.conf第一位就没问题。
备注:内容来源于stack exchange,提问作者xbuccaneer




