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

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

前言

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

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

1
2
舍友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反代,像这样:

1
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黑名单里填写去广告规则,这里推荐几条我自用的:

1
2
3
4
5
6
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监听的地址和端口,例如:

1
127.0.0.1:11451

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

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

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

adgh-4

4. 安装MosDNS

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

1
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泄露都可以一网打尽,爽~