前言
最近几天在访问一些常用网站的时候,如ping.chinaz.com,出现了域名无法解析的情况,由于是常用网站,才不得不进行问题排查。网上搜索了几个方法,都是不行,如以下方法:
- 在
网络 --> DHCP/DNS --> 常规配置中,重绑定保护取消掉 openwrt路由器dnsmasq部分域名无法解析) - 在/etc/dnsmasq.conf添加配置no-resolv和server等:https://oracleblog.org/its-my-life/can-not-resolv-some-domain-name-in-openwrt/
- dnsmasq进程无法启动:http://www.openwrt.pro/post-44.html
原理
对于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 | root@fangdm:~#ps |grep dnsmasq |
可以发现/var/dnsmasq.conf.cfgxxxx是真实有效的配置文件。打开配置如下:
1 | root@fangdm:~# cat /var/etc/dnsmasq.conf.cfg01411c |
从上可以看出:
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 | root@fangdm:~# cat /etc/resolv.conf |
与此同时,/var/dnsmasq.conf.cfgxxxx有指定了resolv-file=/tmp/resolv.conf.auto,这个文件的内容如下:
1 | root@fangdm:~# cat /tmp/resolv.conf.auto |
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 | root@fangdm:/tmp/etc/dnsmasq-go.d# grep chinaz 01-pollution.conf |
竟然看到了chinaz.com这个域名是走 7453端口,而这个端口的进程是pdnsd。查到这边,就明白了,很多之前有听说pdnsd可以用来加速dnsmasq效果的 ,其实现在dnsmasq也支持缓存了 ,没有必要使用了,而且此次问题的来源正是 pdnsd,直接 卸载就立马正常了。
总结
现在回头去看原因,是非常简单的,但分析的时候还是很费脑,跑去看dnsmasq配置文件含义,dnsmasq的启动脚本以及openwrt的界面配置等一些操作,总结来说,还是对openwrt不熟悉,不然直接去查dnsmasq的日志即可。
在openwrt的Luci是可以 开启dns记录日志 的 ,但是并没有说明 log-queries=extra 这个配置项是记录到哪里了,后续如果有问题可以在/etc/dnsmasq.conf配置文件中加入以下参数,即可现实日志的记录:
1 | log-dhcp |