openwrt出现dnsmasq部分域名解析不了的问题

前言

最近几天在访问一些常用网站的时候,如ping.chinaz.com,出现了域名无法解析的情况,由于是常用网站,才不得不进行问题排查。网上搜索了几个方法,都是不行,如以下方法:

原理

对于dnsmasq就不多介绍了,主要功能是可以实现DNS解析以及DHCP分配IP的功能,openwrt环境提供了uci方式配置dnsmasq,配置文件是/etc/config/dhcp.conf,dnsmasq本身也有配置文件,比如/etc/dnsmasq.conf,它们之间的关系如下:

  • uci配置文件:/etc/config/dhcp.conf,该文件能够通过luci界面进行修改,后台把它转换成dnsmasq能够识别的配置项。
  • dnsmasq本身的配置文件:/etc/dnsmasq.conf,通常情况下,dnsmasq运行时会读取该文件,但默认情况下,该文件全是注释,看似不起任何作用。
  • 运行时配置文件:/var/dnsmasq.conf.cfgxxxx

使用ps来查看dnsmasq加载的配置文件,如下:

1
2
3
4
root@fangdm:~#ps |grep dnsmasq
2243 root 1108 S grep dnsmasq
16520 dnsmasq 2124 S /usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf.cfg01411c -k -x /var/run/dnsmasq/dnsmasq.cfg01
root@fangdm:~#

可以发现/var/dnsmasq.conf.cfgxxxx是真实有效的配置文件。打开配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
root@fangdm:~# cat /var/etc/dnsmasq.conf.cfg01411c
# auto-generated config file from /etc/config/dhcp
conf-file=/etc/dnsmasq.conf
dhcp-authoritative
domain-needed
filterwin2k
no-negcache
log-queries=extra
localise-queries
read-ethers
enable-ubus
expand-hosts
bind-dynamic
local-service
cache-size=9999
domain=lan
server=/lan/
interface=br-lan
dhcp-leasefile=/tmp/dhcp.leases
resolv-file=/tmp/resolv.conf.auto
dhcp-broadcast=tag:needs-broadcast
addn-hosts=/tmp/hosts
conf-dir=/tmp/dnsmasq.d
user=dnsmasq
group=dnsmasq


dhcp-ignore-names=tag:dhcp_bogus_hostname
conf-file=/usr/share/dnsmasq/dhcpbogushostname.conf

srv-host=_vlmcs._tcp,fangdm,1688,0,100

bogus-priv
conf-file=/usr/share/dnsmasq/rfc6761.conf
dhcp-range=set:lan,192.168.1.100,192.168.1.249,255.255.255.0,24h
no-dhcp-interface=pppoe-wan

从上可以看出:

1、dnsmasq运行时读取的配置文件是/var/dnsmasq.conf.cfgxxxx,该配置文件由/etc/config/dhcp.conf转换而来;从文件中的配置项conf-file=/etc/dnsmasq.conf来看,dnsmasq运行时还会读取/etc/dnsmasq.conf

2、server=/chinaz.com/114.114.114.114表示chinaz.com这个域名以及 子域名都是通过 114来解析 ,而配置 server=114.114.114.114 则表示全部域名都走114解析。

dnsmasq在运行的时候,会将/etc/resolv.conf配置为127.0.0.1

1
2
3
root@fangdm:~# cat /etc/resolv.conf
search lan
nameserver 127.0.0.1

与此同时,/var/dnsmasq.conf.cfgxxxx有指定了resolv-file=/tmp/resolv.conf.auto,这个文件的内容如下:

1
2
3
4
5
6
7
root@fangdm:~# cat /tmp/resolv.conf.auto
# Interface wan
nameserver 218.85.152.99
nameserver 218.85.157.99
# Interface wan_6
nameserver 240e:14:e000::1
nameserver 240e:14:6000::1

dnsmasq会使用这些DNS做为上游的DNS来解析的。

排查

经过了多个方法排查,确认了一点,我所遇到的问题,之前没有过遇到过,或者没有人分享过。不过经过排查之后,可以确认的是:dnsmasq进程是可以正常启 动的,上游DNS设置也是正确的。那为什么还会失败呢?再次观察/var/dnsmasq.conf.cfgxxxx,发现有一个配置项为:conf-dir=/tmp/dnsmasq.d,表示此目录下面还有配置文件,dnsmasq-adbyby.conf 以及 dnsmasq-go.conf,指向到/var/etc/dnsmasq-adbyby.d或者是/var/etc/dnsmasq-go.d上,打开一个文件看下:

1
2
3
4
5
6
root@fangdm:/tmp/etc/dnsmasq-go.d# grep chinaz 01-pollution.conf
server=/chinaz.com/127.0.0.1#7453
root@fangdm:/tmp/etc/dnsmasq-go.d#
root@fangdm:/tmp/etc/dnsmasq-go.d# netstat -tunpl |grep 7453
tcp 0 0 127.0.0.1:7453 0.0.0.0:* LISTEN 24377/pdnsd
udp 0 0 127.0.0.1:7453 0.0.0.0:* 24377/pdnsd

竟然看到了chinaz.com这个域名是走 7453端口,而这个端口的进程是pdnsd。查到这边,就明白了,很多之前有听说pdnsd可以用来加速dnsmasq效果的 ,其实现在dnsmasq也支持缓存了 ,没有必要使用了,而且此次问题的来源正是 pdnsd,直接 卸载就立马正常了。

总结

现在回头去看原因,是非常简单的,但分析的时候还是很费脑,跑去看dnsmasq配置文件含义,dnsmasq的启动脚本以及openwrt的界面配置等一些操作,总结来说,还是对openwrt不熟悉,不然直接去查dnsmasq的日志即可。

在openwrt的Luci是可以 开启dns记录日志 的 ,但是并没有说明 log-queries=extra 这个配置项是记录到哪里了,后续如果有问题可以在/etc/dnsmasq.conf配置文件中加入以下参数,即可现实日志的记录:

1
2
3
log-dhcp
log-queries
log-facility=/tmp/dnsmasq.log

参考链接

dnsmasq详解及配置

openwrt上安装smartdns加速访问

在openwrt环境下配置dnsmasq

  • 本文作者: wumingx
  • 本文链接: https://www.wumingx.com/others/openwrt-dnsmasq.html
  • 本文主题: openwrt出现dnsmasq部分域名解析不了的问题
  • 版权声明: 本站所有文章除特别声明外,转载请注明出处!如有侵权,请联系我删除。
0%