127.0.0.1 重定向的完整链路 —— 从广告请求到被拦截的全过程
以一次 APP 开屏广告为例
假设你打开了一个资讯 APP,它的代码里硬编码了一行:
fetch("https://ads.example.com/banner?id=123")
APP 不知道 ads.example.com 是什么,它只知道要连这个域名。系统接手后:
- APP 发起 DNS 查询:
ads.example.com → ??? - 系统查 hosts 文件:AdAway 写的 hosts 里有一行
127.0.0.1 ads.example.com - 系统直接返回 127.0.0.1:跳过了 DNS 服务器,不联网
- APP 尝试连接 127.0.0.1:这是它自己手机的回环地址,没有广告服务器在监听
- 连接超时 / 拒绝:APP 收到错误,广告位空着或者显示占位图
整条链路没有任何网络请求发出去,广告服务器甚至不知道有这回事。这就是 hosts 文件拦截相比 VPN 拦截的一个优势:完全无感、零流量、零延迟。
两个特殊 IP 的区别
AdAway 用两个 IP 来标记拦截:
127.0.0.1—— IPv4 回环地址,请求发去自己0.0.0.0—— IPv4 "无效地址",请求直接被系统拒绝
两者效果几乎一样。AdAway 的解析器会把这两种都视为"拦截",其他 IP 则视为"重定向规则"(见 重定向规则)。
与 VPN 拦截的本质区别
VPN 模式(非 root 设备上 AdAway 的工作方式、AdGuard/Blokada 的主要方式)的链路是:
- 系统创建一个虚拟 VPN 网卡
- 所有 DNS 请求先经过这个虚拟网卡
- 虚拟网卡检查域名是否在黑名单里
- 在黑名单 → 伪造 DNS 响应返回 127.0.0.1
- 不在 → 转发给真实 DNS 服务器
VPN 方案是"流量劫持",hosts 方案是"系统配置"。
hosts 方案的优势:
- 零额外开销:不跑 VPN 进程、不耗电池、不走虚拟网卡
- 系统原生支持:所有 APP 自动遵守,没有绕过可能
- 可回退:root 模式下 Systemless Hosts 随时卸载恢复
hosts 方案的劣势:
- 需要 root(或者 VPN 模式回退,但 VPN 模式就失去了上面两个优势)
- 无法拦 IP 直连:不走域名的请求不受影响
- 部分 APP 会自建 DNS:某些 APP 内置 DNS 解析器,绕过系统 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 解析的第一步就直接返回自己,跳过所有联网环节。 简单、可靠、透明。