安卓运行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
2
3
4
5
6
7
dns:
enable: true
ipv6: true
prefer-h3: false
listen: 0.0.0.0:1053
use-hosts: true
enhanced-mode: redir-host

这里注意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
2
tls://1.12.12.12:853
tls://120.53.53.53:853

bootstrap dns服务器则填入纯数字的标准dns

例如

1
2
223.5.5.5
114.114.114.114

dot配置

可能有人会疑惑,为什么localhost还要使用加密。在此声明,这里配置加密仅仅只是为了能搭配安卓自带的私人dns使用,因为安卓的私人dns只支持dot

配置dot首先需要有一个ssl证书,这里我直接使用我自己的域名解析到127.0.0.1,然后给这个域名申请证书。如果没有域名的话可以考虑弄个自签名证书,不过安卓安装自签名证书后通知栏会有个“你的网络正在受到监控”的提示,挺烦人的。

来到设置界面的加密设置,启动加密,服务器名称填自己的域名,端口这块可以不用动,要动的话千万不要改dns-over-tls默认的853端口,因为私人dns不兼容非标准端口的dot。之后再设置好证书即可,这里的证书我使用的是亚洲诚信的免费一年证书。

安卓配置私人dns

打开手机的设置界面,直接搜索dns,应该就能搜索到
文章配图
填上自己的域名即可,不需要添加tls和端口

当不需要接管时,将这个选项改为关闭即可


安卓运行adguardhome,完美解决mihomo代理dns被污染
https://zhmoegirl.com/posts/e98ecfc2afd5/
作者
InternetBugs
发布于
2024年2月15日
许可协议