Openwrt上使用Mosdns+AdguardHome DNS分流实现防跳反诈+去广告

1,588 字 8 分钟
AI 摘要
针对校园网DNS劫持,介绍在OpenWrt上用AdGuardHome做过滤与缓存、MosDNS按国内外分流到不同DoH上游,配置dnsmasq端口以避开反诈劫持并去广告。

Openwrt 上使用 Mosdns + AdguardHome DNS 分流实现防跳反诈 + 去广告

前言

近日我搬到了江苏苏州上大学,宿舍网络用的是大名鼎鼎的,以跳反诈和跨网 Qos 著称的江苏电信。

简单的试了几次,发现这个 DNS 劫持问题还不是一般的严重。 甚至连 Jetbrains 系 IDE 的 Plugin Marketplace 都被反诈劫持了,极其恶心。部分舍友更是苦不堪言

舍友A的ACG资源站进不去,被反诈
舍友B的小网站也被反诈

简单试了一下,问题还不小。

首先使用任何常规的 UDPDNS, 全部都会被劫持…

使用阿里系 DoH/DoT,发现似乎阿里和反诈有合作,即便在此协议下还是会在查询时直接给你返回反诈 IP,甚至私有的移动解析开出来的也是这样 (搜了一下,阿里系确实是这样。)

又试了几家国内有名的 DoH/DoT,腾讯 360 的查询速度不知为何奇慢无比,600ms+,给我搞无语了, 于是就决定折腾一下 dns 分流解决这个问题。

折腾前我软路由上的 DNS 查询方案

折腾分流前软路由是直接关闭了 dnsmasq,哈基米(懂得都懂)覆写了上游 dns 到 127.0.0.1:53,并配合 nfttables 劫持了所有 dns 数据包到它的上游。 上游是本地的 AdguardHome,AdguardHome 上游是阿里移动解析的私有 DoH,经常反诈。

为什么是 MosDNS?

一开始打算用的是 SmartDNS,但是它的配置有那么一点复杂,而且分流部分写的不是很友好

还有个使用单 AdguardHome 实现分流的方案,性能不好,而且维护那么大的一份文件也不方便 。 最终还是选定了 MosDNS。

MosDNS 最舒服的一点就是配置简单。我的需求仅仅是国内外分流,而 luci-app-mosdns 的默认配置就提供了该方案。

且 MosDNS 的分流这一块确实很不错,支持使用 Geosite/GeoIP 规则集,对于我这种习惯了写哈基米分流的用户来说实在是惬意。顺便还自带防 DNS 泄露呢。

缺点就是性能不如 SmartDNS,但是由于实际上 AdguardHome 已经写好了缓存加打开了乐观缓存,这一点性能损耗几乎可以忽略不计。

核心思路

使用哈基米劫持 dns 请求到 AdguardHome,AdguardHome 上游使用 MosDNS,MosDNS 分流到不同的上游。 国内请求走阿里系 DoH,国外请求走 Cloudflare DoH。

1. 折腾 Dnsmasq

PS:这一步既可以让 dnsmasq 劫持数据包到他的上游,也可以直接改端口或者关闭,我个人采用了后者,毕竟一层一层套娃感觉不是很好。

首先登录并进入 luci 界面,点击网络 ->DHCP/DNS dnsmasq-1

在打开的页面中选择设置及端口,把 DNS 服务器端口随便改成一个不用的端口 dnsmasq-2

保存并应用后,Dnsmasq 配置就完成了。

注意:完成这一步后请检查一下你软路由机器的 DNS 是不是 127.0.0.1,如果是的话暂时改成随便一个可用的 DNS,运营商 DNS 都行,否则会无法正常解析域名。

2. 安装 AdguardHome

如果你和我一样是 iStoreOS 或者在 OpenWRT 上安装了 iStore,可以打开Are-u-ok提供的Adgh的.run构建仓库,选择好架构直接下载打包好的 Adgh 的.run 包,点击 iStore - 手动安装,上传下下来的包就行

如果你是原生 OpetnWRT,不带 iStore,可以参考Openwrt论坛上的这篇文章, 或者网上搜一下别的教程安装 AdguardHome

安装完后可以在服务 ->AdguardHome 中打开 Adgh 的 luci 界面,把启用打勾,把 53 重定向改成无,点击保存并应用。 adgh-1

注意:如果遇到网络问题导致下载不下来核心,可以把页面下拉到最底下,核心更新地址改成我自建的 Github 反代,像这样:

https://gh.21119855.xyz/https://github.com/AdguardTeam/AdGuardHome/releases/download/${Cloud_Version}/AdGuardHome_linux_${Arch}.tar.gz

3. 配置 AdguardHome

打开 Adgh 后台,端口写 53,接口写 br-lan,设置一下账号密码。保存并应用 过滤器 - DNS 黑名单里填写去广告规则,这里推荐几条我自用的:

AdGuard DNS filter:https://adguardteam.github.io/HostlistsRegistry/assets/filter_1.txt
CHN: AdRules DNS List:https://adguardteam.github.io/HostlistsRegistry/assets/filter_29.txt
Anti-AD聚合:https://anti-ad.net/adguard.txt
uBlock:https://adguardteam.github.io/HostlistsRegistry/assets/filter_50.txt
Github上某大佬的聚合规则:https://raw.githubusercontent.com/8680/GOODBYEADS/master/data/rules/adblock.txt
屏蔽PCDN:https://thhbdd.github.io/Block-pcdn-domains/ban.txt

规则不要写太多,会影响性能。 写完之后去上游 DNS 服务器,设置 ->DNS 设置,把上游 DNS 服务器改成未来 MosDNS 监听的地址和端口,例如:

127.0.0.1:11451

保存并应用,测试失败无所谓。Bootstrap DNS 可以写个运营商 dns 反正用不着 接着到底下的 DNS 服务配置,这里可以参考我的,主要是把拦截模式改成 NXDOMAIN 了 adgh-2 接着改一下缓存(这还是挺重要的~) adgh-3 主要是改一下缓存大小还有打勾乐观缓存! 打勾乐观缓存可以大幅度提升查询速度并减少对上游的请求,还是挺有用的。

保存并应用,Adgh 配置完成。

PS:用一段时间后可以去主页看一下品平均处理时间,如果低于 10ms 说明性能不错,如果大一点建议排查下上游响应速度和缓存问题

adgh-4

4. 安装 MosDNS

MosDNS 的安装极为简单,官方仓库里给出了一键脚本,安装即可:

Terminal window
sh -c "$(curl -ksS https://raw.githubusercontent.com/sbwml/luci-app-mosdns/v5/install.sh)"

5. 配置 MosDNS

打开 luci 界面,进入服务 ->MosDNS 启用打上勾,监听端口设置为前面 Adgh 的上游端口,例如 11451 打开自定义国内 DNS,并分别填写国内外上游 DNS,可以参考我的配置: mosdns-1

此处国内 DNS 用的是阿里私有 DoH,国外用的 Cloudflare Zerotrust DoH。 内置预设中已经给我们贴心的设置好了国内外分流规则,直接使用即可。

接着来到高级选项,勾上连接复用和防 DNS 泄露,打开缓存,底下去广告规则集随便选几个,保存并应用就行。 如果你是 Apple 用户,可以打开 Apple 域名解析优化。

接下来就完成啦,Enjoy!

经实测,此方案可以完美避开江苏电信的反诈劫持,并且去广告,防 DNS 泄露都可以一网打尽,爽~

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Openwrt上使用Mosdns+AdguardHome DNS分流实现防跳反诈+去广告

https://blog.icybit.cn/posts/31
作者
IcyMichiko
发布于
2025-09-30
许可协议
CC BY-NC-SA 4.0

评论

Markdown

评论区加载中…