AdAway 中文文档 下载 App

127.0.0.1 重定向的完整链路 —— 从广告请求到被拦截的全过程

以一次 APP 开屏广告为例

假设你打开了一个资讯 APP,它的代码里硬编码了一行:

fetch("https://ads.example.com/banner?id=123")

APP 不知道 ads.example.com 是什么,它只知道要连这个域名。系统接手后:

  1. APP 发起 DNS 查询:ads.example.com → ???
  2. 系统查 hosts 文件:AdAway 写的 hosts 里有一行 127.0.0.1 ads.example.com
  3. 系统直接返回 127.0.0.1:跳过了 DNS 服务器,不联网
  4. APP 尝试连接 127.0.0.1:这是它自己手机的回环地址,没有广告服务器在监听
  5. 连接超时 / 拒绝:APP 收到错误,广告位空着或者显示占位图

整条链路没有任何网络请求发出去,广告服务器甚至不知道有这回事。这就是 hosts 文件拦截相比 VPN 拦截的一个优势:完全无感、零流量、零延迟。

两个特殊 IP 的区别

AdAway 用两个 IP 来标记拦截:

两者效果几乎一样。AdAway 的解析器会把这两种都视为"拦截",其他 IP 则视为"重定向规则"(见 重定向规则)。

与 VPN 拦截的本质区别

VPN 模式(非 root 设备上 AdAway 的工作方式、AdGuard/Blokada 的主要方式)的链路是:

  1. 系统创建一个虚拟 VPN 网卡
  2. 所有 DNS 请求先经过这个虚拟网卡
  3. 虚拟网卡检查域名是否在黑名单里
  4. 在黑名单 → 伪造 DNS 响应返回 127.0.0.1
  5. 不在 → 转发给真实 DNS 服务器

VPN 方案是"流量劫持",hosts 方案是"系统配置"。

hosts 方案的优势:

hosts 方案的劣势:

hosts 文件的解析规则(官方源码确认)

从 AdAway 的 HostsSyntax 文档可以看到它的合并逻辑:

AdAway 会剥离所有 localhost 条目,自己添加一份。只会把 IP 为 127.0.0.1 或 0.0.0.0 的条目视为"拦截",其他 IP 视为"重定向规则"。解析器会校验每一行有真实的主机名,无效行忽略。所有源合并后去重。

这意味着 AdAway 生成的 hosts 文件是"干净"的——没有重复行、没有格式错误的行、自己维护 localhost 条目。你可以在 /system/etc/hosts 里看到它的产物,开头有注释:

# This hosts file is generated by AdAway.
# Please do not modify it directly, it will be overwritten when AdAway is applied again.

一句话总结

AdAway 的拦截机制就是:提前在系统的域名映射表里写好"所有广告域名 → 127.0.0.1",让操作系统在 DNS 解析的第一步就直接返回自己,跳过所有联网环节。 简单、可靠、透明。