安卓端 AdGuard 与代理软件共存指南(无需 Root 权限)

先说思路:

  • 基本设置:AdGuard 创建系统 VPN 服务,作为所有网络流量的第一个入口。代理软件则以后台纯代理服务的模式运行。

  • 流量走向:AdGuard 捕获所有流量后,首先进行广告和跟踪器过滤,然后将过滤后的流量转发给代理软件的本地端口。

  • 防止循环在 AdGuard 中将代理软件本身排除,避免 AdGuard 将流量发给代理 → 代理又发回给 AdGuard 的无限循环问题。

  • DNS 联动:将 AdGuard 的 DNS 请求也指向代理软件的本地 DNS 端口,从而实现 DNS 级别的广告过滤和分流。

前言

在安卓设备上,创建本地的系统 VPN 服务是没有 Root 权限过滤网络流量的主要方式。由于同一时间只能有一个应用激活系统 VPN 服务,而这又是 AdGuard 和许多代理工具实现流量过滤的关键,因此 AdGuard 和代理软件的共存问题就成了一个老生常谈的话题。

本指南将以 AdGuard for Android(新版 UI)和 Exclave 代理软件为例,详细演示如何实现完美共存。Exclave 是一款自定义程度高、协议支持全面的优秀客户端,我会在后续文章中详细介绍。本指南的原理和步骤同样适用于其他主流代理软件。

AdGuard 官方知识库中也有相关教程,但不够详细:https://adguard.com/kb/zh-CN/adguard-for-android/solving-problems/outbound-proxy/

教程

第一步:在 AdGuard 中排除代理软件

此操作的目的是避免 AdGuard 将流量发给代理 → 代理又发回给 AdGuard 的无限循环问题,从而导致无法上网。

  1. 打开 AdGuard,进入 应用管理

  2. 在应用列表中找到你的代理软件(本例中是 Exclave)。

  3. 关闭 通过 AdGuard 路由流量 开关。

提示:

  • 新版 AdGuard:应用管理 在底部导航栏的第三个图标。

  • 旧版 AdGuard:在侧滑栏中点击 应用管理,找到代理软件后在 常规 中关闭 已开启 通过 AdGuard 路由应用流量。

第二步:配置代理软件为仅代理模式

代理软件不再创建系统 VPN 服务,而是作为一个纯粹的本地代理服务器等待 AdGuard 转发流量。

  1. 打开 Exclave,在侧滑栏中点击 设置

  2. 软件设置 中将 服务模式 设置成 仅代理

  3. 入站设置 中打开 启用 HTTP 入站启用 DNS 入站

  4. 记下以下三个端口号,稍后会用到:

  • SOCKS5 代理端口

  • HTTP 代理端口

  • 本地 DNS 端口

第三步:将代理软件设置为 AdGuard 的上游代理

AdGuard 在进行广告和跟踪器过滤后需要将流量转发给代理软件的本地端口。

  1. 打开 AdGuard,进入 设置 - 过滤 - 网络 - 代理

  2. 开启代理,在 代理服务器 中点击 添加代理并填写以下信息:

  • 代理名称:任意填写,可以填入代理软件名以方便识别。

  • 代理类型:选择 SOCKS5

  • 代理主机:填入 127.0.0.1 (这代表设备本机)。

  • 代理端口:填入上一步记下的 SOCKS5 代理端口。

  1. 打开 通过 SOCKS5 路由 UDP

  2. 确保你的代理软件已启动并连接到可用节点,然后点击 检查连接,应提示 代理可用

  3. 点击 保存并选择

提示:

  • 新版 AdGuard:设置 在底部导航栏的第五个图标。

  • 旧版 AdGuard:在侧滑栏中点击 设置 - 网络 - 代理,其他操作相同。

此时,AdGuard 应该已经能通过代理软件连接网络,通知栏中会显示 通过代理服务器拦截广告和跟踪器,点击 禁用 可以关闭 AdGuard 和代理软件,点击 禁用代理 会断开 AdGuard 和代理软件的连接,即仅保留广告拦截,不进行代理。

第四步:配置 AdGuard 的 DNS 上游

为了让 AdGuard 的 DNS 过滤也能让代理软件进行分流解析,还需要最后一步设置。

  1. 打开 AdGuard,进入 防护 - DNS保护功能

  2. 开启 DNS 保护功能,在 DNS服务器 中选择 自动 DNS

  3. 集成模式或出站代理的 DNS 服务器 字段中填入 127.0.0.1: 加上你在第二步记下的本地 DNS 端口。例如,如果本地 DNS 端口为 6450,就填入 127.0.0.1:6450

提示:新版 AdGuard 的 防护 在底部导航栏的第二个图标。旧版 AdGuard 没有自动 DNS 功能,你需要在侧滑栏中点击 设置 - DNS - 选择DNS服务器,添加自定义DNS服务器,在 服务器地址 中填入 127.0.0.1: 加上你在第二步记下的本地 DNS 端口。

注意:新版 AdGuard 的自动 DNS 功能会根据代理的连接状态自动切换 DNS 上游。当代理断开时,它会自动回落到系统 DNS 上游,避免断网。而旧版 AdGuard 的自定义 DNS 服务器在关闭代理软件后仍然会使用代理软件的 DNS 上游,只有等到超时才会回落到系统 DNS 上游。

最后一步:检查并确认路由模式

完成以上四步后,基本功能已经实现,但还需检查 AdGuard 是否创建了系统 VPN 服务。

进入 AdGuard 的 设置 - 过滤 - 网络 - 路由模式,确保它处于默认的 本地 VPN 状态。

提示:旧版 AdGuard 在侧滑栏中点击 设置 - 网络 - 路由模式,其他操作相同。

关于分应用代理

如果你之前在代理软件中设置了分应用 VPN,你会发现原先在代理软件中设置的“分应用代理”规则失效了,所有应用现在都通过代理连接。

这是因为分应用代理依赖于系统 VPN 服务来识别流量来源。由于现在是 AdGuard 接管了 VPN,代理软件无法知道流量来自哪个应用,自然无法按应用进行分流。

解决方法是在 AdGuard 中进行分应用代理设置。打开 AdGuard,进入 应用管理,找到需要设置的软件,切换 通过代理路由应用程序 即可。你也可以进入 AdGuard 的 设置 - 过滤 - 网络 - 代理,在 通过代理运行的应用 中进行批量设置。

注意:旧版 AdGuard 没有分应用代理功能,你只能关闭 AdGuard 对该应用流量的路由,但这也会导致 AdGuard 对该应用的广告过滤直接失效。

其实,与其依赖分应用代理,更推荐在代理软件中配置基于域名(geosite)和 IP(geoip)的路由规则。这种方式更灵活、更强大,不受系统 VPN 服务归属的影响。

原理解析 & 方案对比

本方案的网络流量流向

  • DNS 解析[App 发起 DNS 查询][AdGuard VPN 捕获][AdGuard DNS 过滤 (去广告)][转发至 127.0.0.1 DNS 端口][代理软件 DNS 分流 (判断国内外转发到不同的上游服务器)][返回最终 IP 地址]

  • 数据传输[App 使用 IP 地址发包][AdGuard VPN 捕获][AdGuard 防火墙/规则过滤][转发至 127.0.0.1 SOCKS5 端口][代理软件根据规则代理/直连][互联网]

与其他方案对比

  • AdGuard 作为本地 HTTP 代理:一些教程推荐此方案,让代理软件继续使用 VPN 服务。优点是可随时单独关闭 AdGuard 或代理软件。缺点是需要 Root 权限,且 AdGuard 的防火墙和 DNS 过滤功能会失效,功能损失较大。

  • 配置 AdGuard 为手动代理:此方案需要为每个 WLAN 网络手动配置系统代理,不仅繁琐,而且对移动数据无效,很多应用也会忽略系统代理设置,因此极不推荐。

本方案的优缺点

  • 优点:无需 Root,功能完整,AdGuard 的所有过滤功能(广告、跟踪器、DNS、防火墙)和代理软件的代理、分流功能都能同时生效。

  • 缺点:二者高度绑定。你无法单独关闭 AdGuard 而不关闭代理软件,因为 AdGuard 是流量的唯一入口。禁用 AdGuard 会导致代理也失效。

12 个赞

好教程 学习了

2 个赞

虽然没有安卓设备,但是感谢你的分享。

点赞 :xhj16:

2 个赞

感谢分享

1 个赞

好教程。点击收藏!

1 个赞

学习了,不错的教程:+1:

1 个赞

竟然还可以共存 太厉害了 感谢大佬的详细教程

1 个赞

謝謝指數~學習下…

1 个赞

了解了很多,感谢科普~

1 个赞

学习一下

1 个赞

谢谢分享,虽然暂时不用

1 个赞

谢谢分享,不过好麻烦

1 个赞

好教程

1 个赞

好教程。点击收藏!

1 个赞

真详细啊

1 个赞

写的非常详细,基本上是手把手教了
实际上设置起来不慢的

1 个赞

感谢分享 :xhj19:

1 个赞

感谢分享 :ac32:

有用