前言

这两天可谓是折腾来折腾去,把家里软路由搞来搞去,最终没弄出什么花来,最后只在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的作用非常尴尬。主要表现为:

  1. SmartDNS 的“返回最快 IP”完全失效

    FakeIP 的工作方式是:

    • 拦截 DNS 查询

    • 无论真实 IP 是什么,都返回一个保留网段的假 IP(如 198.18.x.x)

    • 真实解析在代理端完成

    这意味着:

    • SmartDNS 精心挑选的最快 IP 永远不会被客户端使用

    • SmartDNS 的测速、多上游查询、优化逻辑全部被 FakeIP 覆盖掉

    换句话说: SmartDNS 的核心价值在 FakeIP 下被 100% 抹掉。

  2. SmartDNS 产生的真实 IP 会与 FakeIP 机制冲突

    SmartDNS 的设计目标是:

    • 返回真实、最快、可直连的 IP

    • 让客户端直接访问这些 IP

    但 FakeIP 模式要求:

    • 所有需要代理的域名必须返回 FakeIP

    • 真实 IP 不能直接暴露给客户端

    因此两者天然冲突:

    • SmartDNS 返回真实 IP → FakeIP 透明代理无法识别

    • FakeIP 返回假 IP → SmartDNS 的结果被覆盖

    最终 SmartDNS 的解析结果 要么被忽略,要么导致路由错误

  3. 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

操作方法很简单:

  1. 在OpenWrt界面 - 网络 - DNS - 设置及端口,将 DNS服务器端口 改为其他任意端口,把默认的53端口让出来给后面的AdguardHome;

  2. 在OpenWrt界面 - 系统 - 软件包,搜索 adguardhome 并安装

  3. 打开AdguardHome的Web界面 IP:3000 ,确定DNS监听端口为 53

  4. 设置 上游DNS服务器 ,只填一个: 127.0.0.1:7874 (OpenClash的DNS监听端口),后备DNS服务器 留空不填,Bootstrap DNS 服务器 填运营商DNS或者公共DNS,DNS缓存配置栏目,关闭所有,因为FakeIP模式缓存也没用,反而会解析错误;

  5. 来到OpenWrt 的 OpenClash 界面,插件设置 - DNS设置 - 本地DNS劫持,选择 禁用

    这个影响不关键,打开劫持的话,流量不会经过AdguardHome,直接到OpenClash,只是没有广告过滤的效果。

  6. 确保主界面的 DNS代理 为 开,因为OpenClash是Mihomo内核,本身就有DNS功能

顺便一提:

FakeIP模式下,OpenClash的覆写设置-设置自定义上游DNS服务器,只需填写 nameserver 栏目下的dns,而且只填写 国内的 运营商dns或者公共dns,fallbackdefault-nameserver 全部取消。

成果

我老婆买的360摄像头,全天都在请求一些网站,虽然对网络没啥影响,但是现在舒服了。

改天一定要把这个摄像头给砸了!

最后

虽然我把 SmartDNS 贬得一文不值,但是它在其他非FakeIP模式下的大多数情况还是非常好的,但也就是因为现在FakeIP模式非常实用,导致SmartDNS非常尴尬,另一方面也让我想起了刚接触软路由的时候,很多视频都说SmartDNS+AdguardHome,可以在AdguardHome后台的 上游服务器的平均响应时间 栏目,看到响应时间为1ms。(现在想来,不能无脑抄作业,每个家庭的网络情况都不同。)

现在我也不敢说我这套流程就一定是对的,但是至少是有效果的。

打开页面基本没有前置广告了,科学上网的目的也达到了。

最后,其实我也越来越觉得网络架构简单一点比较好,这也是为什么之前想把OpenWrt去掉的原因,让整个环节少一跳,代价太大了~~~以后再研究研究吧,昨天终于睡了个好觉。