关于OpenClash结合AdguardHome使用的2个小启发
前言
这两天可谓是折腾来折腾去,把家里软路由搞来搞去,最终没弄出什么花来,最后只在OpenWrt中加了个AdguardHome来达到广告过滤的效果。
出发点
之前说过,我家里的网络架构是ESXI底层,直通了一张4口的Intel X710万兆网卡,安装了iKuai以及OpenWrt,iKuai用来DHCP,OpenWrt用来折腾,但是慢慢研究之后,我发现OpenWrt的作用越来越小,于是不可抑制的萌生出 把OpenWrt去掉,直接用平时跑服务的Ubuntu Server替代 的想法。
最后折腾了好几天,Ubuntu Server 上面尝试了 Mihomo 、 Singbox 搭配 Tproxy透明代理 之类的结构,反反复复最后还是决定不在Ubuntu Server上乱搞了,一心一意回归最省心的方案:保留OpenWrt 以及 OpenClash。
过程
折腾过程中,在 Ubuntu Server 成功科学上网后,我又想把AdguardHome的广告过滤功能加上,但是这样结构非常复杂,也可能是我中间可能没有配置好,只要一加 AdguardHome ,局域网设备就无法代理,最主要的是 Tproxy 的 DNS劫持代码还要自己写,尤其是关于IPv6的,搞的几天都没睡好觉。
其实Singbox的配置文件也非常麻烦,一天没去公司,就在那边盯着Singbox的官方文档看,对比 Mihomo ,难度提升了好几个等级。
最后退而求其次,继续保留现有的架构,iKuai主路由,OpenWrt旁路由,OpenWrt安装OpenClash负责国内外分流的工作。
启发
一、 SmartDNS 在 FakeIP 模式下的尴尬处境
之前我一直使用SmartDNS搭配OpenClash使用,但是这次折腾完,了解到SmartDNS的作用非常尴尬。主要表现为:
SmartDNS 的“返回最快 IP”完全失效
FakeIP 的工作方式是:
拦截 DNS 查询
无论真实 IP 是什么,都返回一个保留网段的假 IP(如 198.18.x.x)
真实解析在代理端完成
这意味着:
SmartDNS 精心挑选的最快 IP 永远不会被客户端使用
SmartDNS 的测速、多上游查询、优化逻辑全部被 FakeIP 覆盖掉
换句话说: SmartDNS 的核心价值在 FakeIP 下被 100% 抹掉。
SmartDNS 产生的真实 IP 会与 FakeIP 机制冲突
SmartDNS 的设计目标是:
返回真实、最快、可直连的 IP
让客户端直接访问这些 IP
但 FakeIP 模式要求:
所有需要代理的域名必须返回 FakeIP
真实 IP 不能直接暴露给客户端
因此两者天然冲突:
SmartDNS 返回真实 IP → FakeIP 透明代理无法识别
FakeIP 返回假 IP → SmartDNS 的结果被覆盖
最终 SmartDNS 的解析结果 要么被忽略,要么导致路由错误。
FakeIP 会导致 DNS 污染,而 SmartDNS 无法避免甚至可能加剧问题
FakeIP 的一个重大问题是:
FakeIP 映射是临时的
应用层(浏览器、系统)会缓存 FakeIP
代理关闭或重启后映射表消失,但缓存仍在
导致访问失败、权限弹窗、资源加载错误等
例如 Chrome 会把 FakeIP 段(198.18.0.0/15)视为本地网络,引发权限弹窗与加载失败。
SmartDNS 在这种情况下:
仍然会返回真实 IP
但 FakeIP 机制会覆盖它
SmartDNS 无法避免 FakeIP 污染
甚至可能让用户误以为“DNS 已经优化”,从而更难排查问题
因此,在 FakeIP 模式下:SmartDNS 既不能发挥优势,也无法改善 FakeIP 的问题,反而可能让系统行为更复杂、更难排查。
二、上游DNS的解析
我觉得这是最容易出错的一个点,各种网络应该基本上为了对抗运营商的拦截,都会自带一套上游DNS的解析,比如OpenClash可以填写自定义上游DNS,AdguardHome也是,MosDNS也是。
如果只是一两个软件配合还好,结构还算比较清晰,如果在这个基础上继续增加,再加上FakeIP的解析模式,再考虑一个DNS劫持,哪个地方劫持?这一套解析流程是我最头疼的地方。
只要在这中间环节有一点设置错误的地方,就会造成局域网流量走向错误或者造成回环,最终上网就会有问题。
放弃SmartDNS,使用AdguardHome搭配OpenClash
基于上面的现状,以及自身的需求,我在可行性的基础上,跑了最需要的两个应用:
广告过滤: AdguardHome
科学上网: OpenClash
操作方法很简单:
在OpenWrt界面 - 网络 - DNS - 设置及端口,将 DNS服务器端口 改为其他任意端口,把默认的53端口让出来给后面的AdguardHome;
在OpenWrt界面 - 系统 - 软件包,搜索
adguardhome并安装打开AdguardHome的Web界面
IP:3000,确定DNS监听端口为53;设置 上游DNS服务器 ,只填一个:
127.0.0.1:7874(OpenClash的DNS监听端口),后备DNS服务器 留空不填,Bootstrap DNS 服务器 填运营商DNS或者公共DNS,DNS缓存配置栏目,关闭所有,因为FakeIP模式缓存也没用,反而会解析错误;来到OpenWrt 的 OpenClash 界面,插件设置 - DNS设置 - 本地DNS劫持,选择 禁用 ;
这个影响不关键,打开劫持的话,流量不会经过AdguardHome,直接到OpenClash,只是没有广告过滤的效果。
确保主界面的 DNS代理 为 开,因为OpenClash是Mihomo内核,本身就有DNS功能
顺便一提:
FakeIP模式下,OpenClash的覆写设置-设置自定义上游DNS服务器,只需填写 nameserver 栏目下的dns,而且只填写 国内的 运营商dns或者公共dns,fallback 和 default-nameserver 全部取消。
成果
我老婆买的360摄像头,全天都在请求一些网站,虽然对网络没啥影响,但是现在舒服了。
改天一定要把这个摄像头给砸了!
最后
虽然我把 SmartDNS 贬得一文不值,但是它在其他非FakeIP模式下的大多数情况还是非常好的,但也就是因为现在FakeIP模式非常实用,导致SmartDNS非常尴尬,另一方面也让我想起了刚接触软路由的时候,很多视频都说SmartDNS+AdguardHome,可以在AdguardHome后台的 上游服务器的平均响应时间 栏目,看到响应时间为1ms。(现在想来,不能无脑抄作业,每个家庭的网络情况都不同。)
现在我也不敢说我这套流程就一定是对的,但是至少是有效果的。
打开页面基本没有前置广告了,科学上网的目的也达到了。
最后,其实我也越来越觉得网络架构简单一点比较好,这也是为什么之前想把OpenWrt去掉的原因,让整个环节少一跳,代价太大了~~~以后再研究研究吧,昨天终于睡了个好觉。



