
主路由中AdGuardHome+MosDNS+OpenClash折腾记录
本文最后更新于 2025-04-02,文章内容可能已经过时。
原文链接,参与讨论:https://www.right.com.cn/forum/thread-8355510-1-1.html
〇:前言
声明:
本文是根据各教程与方案配置后做的总结,方便日后查阅。本人小白一枚,下面说的话都不经大脑,望各路大神多多指教。由于网络结构、设备性能、固件差异、地理位置、个人运气...的不同,本文的配置方案可能不会适合所有人,仅供参考。
这套配置适合路由内存大于512MB的设备使用,小于512MB的设备考虑使用MosDNS替代ADG的去广告和缓存功能。
设备:小米AX9000
固件:ImmortalWrt 23.05官方固件,内核版本5.15.137 (固件安装与配置教程)
插件:AdGuardHome核心v0.107.45、luci-app-mosdns-1.5.18、mosdns核心5.3.1-1、luci-app-openclash-0.46.003-beta
工具:putty(用于ssh连接)、WinSCP(用于文件传输)
感谢以下文章作者提供的教程和帮助:
shiift的OPenWRT 旁路由+MosDNS+openclash+AdGuard Home 傻瓜配置图文教程 https://www.right.com.cn/forum/thread-8284982-1-1.html
moonlight91的关于[OPenWRT 旁路由+MosDNS+openclash+AdGuard Home 傻瓜配置图文教程]优化方案 https://www.right.com.cn/forum/thread-8290791-1-1.html
super131的OpenClas.h,完美解决DNS泄露、污染(教程) https://www.right.com.cn/FORUM/thread-8312798-1-1.html
在7楼的关于论坛里很多人推崇的MosDNS+Clash模式到底有没有用 https://www.right.com.cn/forum/thread-8295979-1-1.html
基于DNS的内网透明代理分流方案 https://songchenwen.com/tproxy-split-by-dns
Openclash的Github中issue#3467 能否在 Wiki 加上 "实验性:绕过中国大路 IP" 具体实现的流程图 https://github.com/vernesong/openclash/issues/3467
浅谈在代理环境中的 DNS 解析行为 https://blog.skk.moe/post/what-happend-to-dns-in-proxy/
我有特别的 DNS 配置和使用技巧 https://blog.skk.moe/post/i-have-my-unique-dns-setup/
一、原理图
本文提供的方案的DNS查询流程:
上网设备发出DNS查询请求(包括国内外域名) --> 防火墙重定向查询请求到AdGuardHome的53端口,AdGuardHome中判断是否有指定客户端需要特殊处理 (由于使用的是重定向功能,所以ADH知道具体是谁发出的DNS查询,用DNSmasq转发就不行了),拦截广告域名,搜索缓存是否命中 (是广告就拦截,命中就返回结果,并且结束查询) --> 继续向上游服务器(MosDNS)查询,MosDNS判断域名是国内还是国外,国内用国内的公共DNS服务器(查询后返回结果),国外就继续向OpenClash查询 --> OpenClash马上返回fake-ip,并将域名连接信息打包发给远程服务器,由远程服务器进行查询与连接 (实际上OpenClash还会判断域名是国内还是国外)
方案优点:
用同一套AdGuardHome规则同时去除国内外广告,利用AdGuardHome的功能,特殊设备可特殊指定其DNS,AdGuardHome的DNS查询可视化,同时配置备用服务器,有一定的鲁棒性,挂了Open至少还能访问国内,挂了MosDNS还 有AdGuardHome的备用服务器,挂了AdGuardHome...额就挂了,所以遇到这种情况的请在计划任务中设置定时重启AdGuardHome。
使用fake-ip可加快外网网站的连接速度,避免PCDN业务NAT类型发生变化,同时Bt/Pt中的国外流量不走clash内核。
方案缺点:
资源消耗比较大,AdGuardHome本身就很吃内存,不太适合配置较低的硬路由,但配置思路可以参考,我用的是小米的AX9000,运行流畅没问题;网络结构比较复杂,但功能丰富。
二、OpenClash
为避免在配置过程中断网,从整体结构的顶部开始配置。请提前下载好上面的两个工具。
1、安装OpenClash界面
方式一:
直接在系统>软件包中搜索luci-app-openclash安装(但这种方式安装的openClash不是最新的)
方式二(推荐):
a)在GitHub中下载ipk,用WinSCP软件(软件中使用SCP协议连接路由)或其他文,件管理器将ipk上传到tmp文件夹中
b)打开ssh,运行命令opkg install /tmp/luci-app-openclash_0.46.003-beta_all.ipk
上述安装方式任选其一,刷新路由界面,就能看到服务列表中看到OpenClash界面。
2、下载openClash的meta内核
普通版本的Clash内核已经不再维护,这里使用meta内核以支持OpenClash的更多高级功能。
方式一:
在服务>OpenClash界面中,插件设置>下载更新,在meta内核选项中选择下载到本地(你也可以试试点检查与更新,反正我没成功过)
方式二:
前往Github地址,dev或master文件夹下的meta,根据自己路由CPU架构下载,解压
3、安装meta内核
将解压好的内核上传到路由的/etc/openClash/core/文件夹下,并将文件改名为clash_meta。
4、配置openClash
1)插件设置
a. 模式设置:下方切换页面到fake-ip模式,勾选使用Meta内核,根据需求看是否需要UDP流量转发(一般浏览网页就不用)。
b. 流量控制:取消路由本机代理(除非你路由上有插件需要深造),勾选绕过服务器地址,取消勾选绕过中国大路ip(后面设置的防火墙规则会让非fake-ip不走代理)。
c. DNS设置:停用本地DNS挟持(下面会配置防火墙重定向到AdGuardHome),勾选禁止Dnsmasq缓存。
d. IPv6设置:取消IPv6流量代理,取消允许IPv6类型的DNS解析(如有需要自行开启)。
e. GEO数据库订阅:勾选自动更新GeoIP MMDB数据库和GeoSite数据库(不要选Dat数据库,这个数据库文件很大)。
f. 开发者选项:前往https://www.right.com.cn/forum/thread-8290791-1-1.html 下载NFTables-Script.zip,(根据自己的防火墙类型选择,一般新的Openwrt固件都是使用nftables的fw4防火墙,新手可试一下运行nft命令和iptables命令看看,能运行nft命令的说明是fw4防火墙,只能运行iptables的说明不是fw4防火墙,都能运行那就下载nftables的脚本)
注意:如果选择not_china的脚本,就会让非中国ip和fake-ip走clash内核,而clash内核就会代理这个ip的连接,这会让bt/pt的国外流量也走代理,当然你可以在clash的配置文件或者防火墙脚本中设置除了443等常用端口外不走代理。
如果选择只fake-ip的脚本,文章中也说到了,纯ip的连接不会进入内核,可能导致一些直连IP的应用无法使用(如电报),当然你也可以在防火墙或者自定义脚本中加入电报的ip走内核代理。
自行配置防火墙可以思考一下这篇文章 https://blog.rachelt.one/articles/new-to-nftables-from-config-to-dnat/
g. 保存配置
2)覆写设置
a. 常规设置:GitHub地址修改,改为https://testingcf.jsdelivr.net/这个,其他的好像都访问不了。
b. DNS设置:勾选自定义上游DNS服务器,勾选Fake-IP 持久化,勾选Fake-IP-Filter,下方nameserver设置127.0.0.1,端口5335,协议UDP(用于openClash插件本身的dns解析需求);fallback组中选择cloudflare和1.1.1.1,协议为https的两个选项。
c. 规则设置:打开仅代理命中规则流量 (开了之后漏网之鱼不会全部都走代理,而是访问443,80,22端口的漏网之鱼才会走代理 ,可防止如bt/pt下载用的tracker进入代理)
d. 保存配置
3)配置订阅
添加自己的airport链接,保存更新配置即可,而后可以在运行日志中查看插件运行情况,一般config配置好就可以正常启动了,如果config文件没法下载或检查没法通过,可以尝试一下在配置订阅中使用在线订阅转换功能。
三、MosDNS
可参考文章:https://github.com/IrineSistiana/mosdns/discussions/455
安装前确保你的路由有40M的空余空间,否则安装失败。
1、安装MosDNS
MosDNS的Github下载地址:https://github.com/sbwml/luci-app-mosdns/releases,里面包含了luci界面包、luci界面中文包、mosdns插件本身、v2dat软件包。
可直接在系统>软件包中搜索luci-app-mosdns下载,如果报错,查看error输出,看缺少哪个软件包,在github网址上下载(一般需要先手动安装v2dat),上传ipk包到/tmp目录下,用opkg install 命令进行安装。安装成功时ssh界面是没有error显示的,在配置MosDNS时确保成功安装。
2、配置MosDNS
1)基本选项
勾选启用,取消DNS转发,勾选远程DNS首选IPv4,勾选自定义国内DNS,勾选Apple域名解析优化,国内DNS服务器选带有DNS over HTTPS的那几个,远程服务器自定义为127.0.0.1:7874 (这是OpenClash的DNS服务端口),Bootstrap自己用电脑ping一下看哪个地址延时最短 (Bootstrap是用来解析国内DNS服务器的地址)。
2)高级选项
取消TCP/DoT连接复用 (之前这里配置错了,抱歉,普通的DoH服务器不支持这个),勾选启用EDNS客户端子网,下面的IP地址不用填,勾选防止DNS泄露,DNS缓存改为0 (除非你想用MosDNS做缓存而不是AdGuardHome),乐观缓存TTL也改为0,取消自动保存缓存,覆盖最小/最大TTL都为0。
3)更新数据库
启用自动更新。
4)点击保存并应用。
四、AdGuardHome
AdGuardHome项目地址:https://github.com/AdguardTeam/AdGuardHome
Openwrt官方里关于AdGuardHome的配置教程:https://openwrt.org/docs/guide-user/services/dns/adguard-home
1、安装AdGuardHome
1)在系统>软件包中搜索adguardhome,点击安装即可。
提示:如果你的固件没有内置的adguardhome插件,那么自己下载的软件包是没有luci界面的,我也不推荐大家去找luci-app-adguardhome,GitHub上的大多数都比较老了,rufeng大佬的甚至4年没有更新了,直接使用命令去配置也比较简单。
2)安装AdGuardHome,输入命令:/usr/bin/AdGuardHome -s install
AdGuardHome是一个独立的软件,不需要其他的依赖,如果内置空间比较有限的朋友们可以把AdGuardHome的执行文件移到U盘上去运行,位置在/usr/bin/AdGuardHome,移动后使用上面的-s install 命令就可以运行了
如果你不想用AdGuardHome了,并且你是用命令行安装的,这里提供其卸载操作 (直接使用opkg remove并不会真正卸载)
展开查看AdGuardHome的卸载方式
1、输入命令以停止AdGuardHome服务:/usr/bin/AdGuardHome -s uninstall
2、删除相关文件
删除/usr/bin/目录下所有AdGuardHome开头的文件 (包括执行文件、.yaml、.sig)、data文件夹、adh-backup文件夹;
删除/etc/config目录下的adguardhome文件 (如果存在);
删除/etc/init.d目录下的adguardhome文件 (如果存在);
2、配置AdGuardHome
1)用3000端口打开AdGuardHome的Web界面,配置好Web端口(默认的80端口被路由web占用,改为3000)和DNS端口 (默认的53端口被dnsmasq占用,改为5353),如果上面的3000或5353端口被其他程序占用则改为其他,账户密码后,进入Web端
2)设置>常规设置,不要勾选浏览安全和家长控制服务,这两个服务需要连接到AdGuardHome网络,网络不好DNS全部都解析不了,日志推荐在配好网络之后就关掉,Openwrt官方中说了7天的查询日志就能吃掉53mb的空间,(空间多的是的当我没说),输入完后点击保存。
3)设置>DNS设置,上游DNS服务器填127.0.0.1:5335,指向MosDNS地址,使用最快IP地址选项,后备DNS服务器配几个,防止MosDNS挂掉就上不了网,Bootstrap服务器不用配置,因为已经在MosDNS中配置了,其他设置可以参考https://www.right.com.cn/forum/thread-8275129-1-1.html
4)过滤器根据自己路由的性能和空间大小选择,我用的是anti-AD、hagezi/dns-blocklists的MultiPro。
3、配置DNS查询方式
方式1:dnsmasq转发(兼容性最高,效率最差)
dnsmasq转发原理就是Openwrt中原来用于查询DNS的软件不自己查询DNS结果,而是将DNS请求转发给AdGuardHome,但是ADG中显示的客户端只有localhost(127.0.0.1),因为经过了dnsmasq的转发。
进入dnsmasq设置:网络->DHCP/DNS
1)常规:本地域名留空(默认会让本地主机查询的域名结果追加.lan后缀,影响后面的调试)
2)过滤器:取消过滤 IPv6 AAAA 记录
3)转发:DNS转发填写127.0.0.1#5353
(注意端口号为ADG的DNS查询端口)
4)限制:DNS 查询缓存、最小缓存 TTL和最大缓存 TTL都改为0(让ADG去设置)
方式2:防火墙重定向53端口到ADG(兼容性与效率的平衡)
防火墙重定向可以让AdGuardHome的Web界面显示具体的客户端ip,而不是localhost(127.0.0.1)。如果你有需要使用一些依赖dnsmasq的软件包如ssr plus、passwall等,重定向53端口可能会导致一些问题。
在系统->启动项->本地启动脚本中输入下面的命令让防火墙重定向53端口到AdGuardHome的5353端口上,注意自己是哪种防火墙类型!!!以下命令应写在 exit 0
前
nftables的设置:
nft add table inet adg_redir
nft -- add chain inet adg_redir prerouting { type nat hook prerouting priority -100 \; }
nft add rule inet adg_redir prerouting tcp dport 53 redirect to 5353
nft add rule inet adg_redir prerouting udp dport 53 redirect to 5353
iptables的设置:
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5353
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 5353
方式3:用53端口代替dnsmasq(效率最高,兼容性最差,但建议尝试)
ADG直接用53端口代替dnsmasq进行DNS查询,不用经过dnsmasq和防火墙的转发,效率是最高的,也建议大家先尝试这种方法,因为上面的防火墙没有设置IPv6的转发,因此IPv6不会经过ADG。(IPv6的防火墙转发表非常复杂)
1)ADG设置DNS查询端口为53
2)网络->DHCP/DNS->设置及端口:DNS 服务器端口改为0
其他事项
如果你不想让某个设备走进ADG,可以在设置>客户端设置中单独对跑业务的设备配置运营商的DNS,避免走去MosDNS占用资源
五、运行检查
配置完成后,整套DNS去广告、分流和远程解析就应该可以正常工作了。
用adblock-tester.com,d3ward.github.io/toolz/adblock.html两个网站测试广告拦截的程度 (我使用的上面提到的三个规则,前者测试是97分,后者是99%)
whoer.net、browserleaks.com、ipleak.net测试DNS有无泄露,列表上显示的都是国外的DNS则说明没有泄露。
在AdGuardHome的Web界面中,能够看到具体ip的客户端,如果是空白的,确认防火墙配置正确,确认AdGuardHome的端口没有被其他程序占用,确认关闭dnsmasq的重定向。
在OpenClash的管理面板中,能够看到当前正在代理的域名连接都在列表上,如果你看到bt/pt的纯ip连接都在列表上,按照上面步骤二-4.1-f配置自定义脚本。
故障排查思路
AdGuardHome用来去广告,可能有误杀,浏览器输入域名后马上返回域名错误则可能是被AdGuardHome拦截了。
某些网站走了不该走的路,如国内的走国外了,国外的没出去,在MosDNS中指定白名单灰名单黑名单;国内国外都出去了,检查OpenClash中有没有添加自定义防火墙脚本。
国内能走,国外走不了,检查OpenClash工作是否正常。
内存和运存空间比较局限的设备需要特别注意运行时的内存占用情况,及时做出调整,避免宕机,下面提供个人的一些解决方案。
1、减少AdGuardHome中的过滤条目,使用一些规则比较少的规则列表,比如只使用一个anti-AD;
2、关闭AdGuardHome中的查询日志,只保留统计记录;
3、将AdGuardHome移出闪存,在外部存储设备运行;
4、直接弃用AdGuardHome,直接使用MosDNS的DNS缓存和去广告功能;
5、把MosDNS也去掉,留下OpenClash,配合dnsmasq完成分流、去广告、深造多合一;
6、把OpenClash换成Passwall。
7、如果还是不够空间和运存,那就啥也别装了......
呼,文章就写到这,造轮子真爽