为了配合一些上网插件并达到最好的过滤效果,需要将AdGuardHome前置于OpenWrt自带的dnsmasq:
[设备] -> [AdGuardHome 53端口] -> [dnsmasq 54端口] -> 一些插件 -> 多种DNS服务器
AdGuardHome在这里作为第一级DNS服务器,运行在标准53端口上,直接接受客户端连接。然后其上游为OpenWrt的自带dnsmasq的DNS服务器,这里需要将其端口改为端口54以避免冲突。之后一些上网插件会自动将dnsmasq的上游设置为它的一些程序,最终连接到大陆或外网的DNS。
这一套似乎没什么问题,但其实有一些坑:
坑1: DHCP v4 不下发DNS服务器配置
OpenWrt dnsmasq的DNS服务若运行在未53端口上时,其DHCP v4 服务就不会默认发送DNS选项。导致部分支持IPv6的设备依然可以通过IPv6连接DNS,表现正常,但仅支持IPv4的设备就会无法上网。
解法很简单,需要在OpenWrt -> 网络 -> lan -> DHCP 服务器 -> 高级设置 处,手动强制加入一个DHCP选项来下发DNS服务器配置:6,<路由器IP>

坑2: 在一些插件内,勾选DNS重定向会绕过AdGuardHome

如果你勾选了这个选择,那DNS请求会被强制直接转达到dnsmasq的地址,也就是54端口上,导致AdGuardHome被绕过了。那如果你仍然需要类似的功能呢?可以在 OpenWrt -> 网络 -> 防火墙 -> 端口转发中手动创建一条规则

具体如下:
# /etc/config/firewall
config redirect 'dns_int'
option name 'Intercept-DNS'
option family 'any'
option proto 'tcp udp'
option src 'lan'
option src_dport '53'
option target 'DNAT'