Openwrt上使用Mosdns+AdguardHome DNS分流实现防跳反诈+去广告
前言
近日我搬到了江苏苏州上大学,宿舍网络用的是大名鼎鼎的,以跳反诈和跨网Qos著称的江苏电信。
简单的试了几次,发现这个DNS劫持问题还不是一般的严重。 甚至连Jetbrains系IDE的Plugin Marketplace都被反诈劫持了,极其恶心。部分舍友更是苦不堪言
1 | 舍友A的ACG资源站进不去,被反诈 |
简单试了一下,问题还不小。
首先使用任何常规的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
在打开的页面中选择设置及端口,把DNS服务器端口随便改成一个不用的端口
保存并应用后,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重定向改成无,点击保存并应用。
注意:如果遇到网络问题导致下载不下来核心,可以把页面下拉到最底下,核心更新地址改成我自建的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 | AdGuard DNS filter:https://adguardteam.github.io/HostlistsRegistry/assets/filter_1.txt |
规则不要写太多,会影响性能。
写完之后去上游DNS服务器,设置->DNS设置,把上游DNS服务器改成未来MosDNS监听的地址和端口,例如:
1 | 127.0.0.1:11451 |
保存并应用,测试失败无所谓。Bootstrap DNS可以写个运营商dns反正用不着
接着到底下的DNS服务配置,这里可以参考我的,主要是把拦截模式改成NXDOMAIN了
接着改一下缓存(这还是挺重要的~)
主要是改一下缓存大小还有打勾乐观缓存!
打勾乐观缓存可以大幅度提升查询速度并减少对上游的请求,还是挺有用的。
保存并应用,Adgh配置完成。
PS:用一段时间后可以去主页看一下品平均处理时间,如果低于10ms说明性能不错,如果大一点建议排查下上游响应速度和缓存问题
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,可以参考我的配置:
此处国内DNS用的是阿里私有DoH,国外用的Cloudflare Zerotrust DoH。
内置预设中已经给我们贴心的设置好了国内外分流规则,直接使用即可。
接着来到高级选项,勾上连接复用和防DNS泄露,打开缓存,底下去广告规则集随便选几个,保存并应用就行。
如果你是Apple用户,可以打开Apple域名解析优化。
接下来就完成啦,Enjoy!
经实测,此方案可以完美避开江苏电信的反诈劫持,并且去广告,防DNS泄露都可以一网打尽,爽~