前言

最近编译了openwrt固件,在openwrt上使用了adguardhome+smartDNS+passwall的dns配置,实现过滤广告+国内dns国外dns分流解析的功能

dns解析路线如下

国内域名解析发起 -> 127.0.0.1#53 (dnsmasq) -> 127.0.0.1#23333 (adguardhome过滤广告域名) -> passwall分流 ->  127.0.0.1#6053(smartdns) -> 223.5.5.5, 114.114.114.114

国外域名解析发起 -> 127.0.0.1#53 (dnsmasq) -> 127.0.0.1#23333 (adguardhome过滤广告域名) -> passwall分流 ->  127.0.0.1#7913(smartdns) -> 代理加速 -> 1.1.1.1#853 (cloudflare DoT)

这样无论哪里的网站访问速度都非常快,而且经过了广告过滤,体验很好

感兴趣可以移步别人写的配置Openwrt 正确配置 AdguardHome 和 smartdns 和 passwall

但唯一有一点很奇怪,当passwall重启时,dns解析不会经过adguardhome,但又能正确经过passwall分流,即便我已经在dnsmasq里设置了上游服务器127.0.0.1#23333

707994271CEE43E1908698F6E0D59612.png

可以看到我在20:44:11发起了对www.baidu.com的dns查询,但adguardhome并没有接收到解析,可以推断dnsmasq并没有将adguardhome作为上游服务器

D072FEC1F2D54F9B857344D64BF33235.png

我就在想是不是passwall的脚本的问题,在passwall重启的时候会将dnsmasq的配置文件覆盖

于是尝试service dnsmasq restart重启dnsmasq以后adguardhome就恢复正常解析了

我的临时解决方式是在crontab里添加定时重启dnsmasq的命令,但实际上治标不治本,今天就来详细解决一下这个问题

解决问题思路及流程

首先找到passwall与dnsmasq相关的配置文件

find / dnsmasq|grep passwall |grep dnsmasq

D9B801D5785F4AC2A989D640540476AD.png

在这里以直觉判断就是/overlay/upper/usr/share/passwall/helper_dnsmasq_add.lua这个文件修改了dnsmasq配置

使用vim查看, 输入?dnsmasq回车,即可搜索到和dnsmasq相关内容,我这里是直接跳转到最后

71DAAA2827BC482A89E301D9EA0922A4.png

这里我已经做了修改了,我修改的内容是

--for s in string.gmatch(dnsmasq_default_dns, '[^' .. "," .. ']+') do
--      conf_out:write(string.format("server=%s\n", s))
--end
conf_out:write("server=127.0.0.1#23333\n")

把原来的添加dns服务器lua语句用--注释掉,然后添加conf_out:write("server=127.0.0.1#23333\n")这一句,adguardhome就能在passwall重启后正常作为dnsmasq的上游服务器

尝试重启passwall,并尝试解析dns

service passwall restart
nslookup www.baidu.com

EC449299478244F298F86A86A602B72B.png

2CA4B6109F154BAEB95E56523EE087C1.png

可以看到adguardhome正常解析了,问题就此解决