安卓运行adguardhome,完美解决mihomo代理dns被污染
过年回老家,意外的发现老家的路由器会下发ipv6 dns,而我使用box for magisk进行代理时,由于mihomo与ipv6兼容性欠佳,导致ipv6 dns会抢答代理dns,导致代理环境的dns被污染。这种情况其实很好解决,关掉ipv6就好了,但是我有ipv6节点,所以并不打算关闭ipv6。
如果想要鱼和熊掌兼得,就得让代理的dns优先级高于路由器下发的dns。事实上,安卓确实有能实现这个的功能:私人dns。安卓可以配置私人dns,通过dot与dns服务器连接,这里配置的私人dns优先级高于路由器下发的dns,因此可以解决dns抢答的问题。
提前说明以下两点
1.文中的mihomo就是转生后的clash meta,既然clash已经死了,那就用它的新名字来进行称呼
2.dns抢答问题我只在box for magisk这种直接运行内核的情况下发现。如果使用安卓app,app是通过vpn接管网络的,vpn的dns优先级似乎也是高于路由器dns的
基本原理
原理其实很简单。由安卓自带的私人dns功能接管系统所有dns请求,再通过dot让adguardhome与私人dns功能联系,也就是让adgurdhome接管系统所有dns请求。adguardhome里再将mihomo(代理程序)的dns作为上游。从而实现让代理程序的dns完美接管系统dns。
同时,因为adguardhome支持后备dns,也就是当上游dns无法使用时调用的后备dns,从而实现当代理程序关闭后不影响系统dns解析
检查代理程序配置
这里我使用的是mihomo,目前ipv6的问题也主要集中在mihomo上,所以以mihomo作为例子
打开mihomo的配置文件,检查dns配置
1 |
|
这里注意listen和enhanced-mode。
listen后接的端口要记住,例如我这里是1053
而enhanced-mode请使用redir-host,fake-ip似乎无法嵌套dns转发程序使用
安装adguardhome
这里直接安装magisk模块就好了,可以使用我写的一个小模块。
https://github.com/InternetBugs/adguardhome-magisk/releases
安装完成模块后重启,打开 http://127.0.0.1:3000 即可进入配置界面,这里没啥好说的,只不过要注意dns监听端口千万不要用默认的53,否则会因为端口冲突导致手机热点无法开启
dns配置
进入仪表盘后打开dns设置,在上游dns中配置 127.0.0.1:x
这里的x是你mihomo配置文件里的dns监听端口,例如我的就是127.0.0.1:1053
在后备dns中填入任何你喜欢的dns,为了避免污染尽量使用doh或者dot
例如
1 |
|
bootstrap dns服务器则填入纯数字的标准dns
例如
1 |
|
dot配置
可能有人会疑惑,为什么localhost还要使用加密。在此声明,这里配置加密仅仅只是为了能搭配安卓自带的私人dns使用,因为安卓的私人dns只支持dot
配置dot首先需要有一个ssl证书,这里我直接使用我自己的域名解析到127.0.0.1,然后给这个域名申请证书。如果没有域名的话可以考虑弄个自签名证书,不过安卓安装自签名证书后通知栏会有个“你的网络正在受到监控”的提示,挺烦人的。
来到设置界面的加密设置,启动加密,服务器名称填自己的域名,端口这块可以不用动,要动的话千万不要改dns-over-tls默认的853端口,因为私人dns不兼容非标准端口的dot。之后再设置好证书即可,这里的证书我使用的是亚洲诚信的免费一年证书。
安卓配置私人dns
打开手机的设置界面,直接搜索dns,应该就能搜索到
填上自己的域名即可,不需要添加tls和端口
当不需要接管时,将这个选项改为关闭即可