系统应用流量遗漏 — Android netd 代发 DNS 查询的归属问题
原因一:netd 代发 DNS 查询
Android 有一个底层网络守护进程叫 netd(Network Daemon),负责网络接口配置、防火墙规则、DNS 解析等底层操作。很多时候:
- 应用自己发 DNS 查询 → PCAPdroid 能准确归属到应用 UID
- 应用调用 Android 系统 API 请求域名解析 → 系统把查询委托给 netd → netd 代发 → PCAPdroid 收到的 DNS 查询源 UID 是 netd 的(系统 UID),无法归属到原始应用
这种情况下:
- PCAPdroid Connections 里能看到 DNS 查询(因为确实有包发出来)
- 但它会显示为"未知"或某个系统 UID
- App 标签页里按应用聚合的流量可能不包含这个 DNS 查询
原因二:短连接 UID 丢失
应用发起的短连接(比如一次性探测、快速关闭的连接),Android 系统可能来不及建立完整的 UID→包映射,PCAPdroid 收到时只能归为"未知"。Root 模式下也会出现这个问题——即使网卡级抓包也丢失了关联信息。
原因三:Root 模式下 DNS 归属更差
Root 模式虽然绕过了 VpnService,但:
- Root 模式下如果设置了 App 过滤,某些 netd 代发的 DNS 查询可能完全被过滤掉(因为 App 过滤靠 UID 匹配,netd 的 UID 不匹配任何普通应用)
- Root 模式下短连接 UID 报成未知的概率更高,且无法关联回原始应用
实际影响
这些遗漏主要影响:
- App 标签页的统计不准确:某个应用实际发了 DNS 查询,但 App 标签里没包含进去
- TLS 解密规则:按"应用"配置解密规则时,netd 代发的 DNS 查询不走应用,不会被解密(但 DNS 本身是明文的,不需要解密)
- 防火墙按应用拦截:netd 代发的 DNS 查询不会被应用级防火墙拦截——这是 Android 架构决定的,PCAPdroid 无法绕过
严重吗
对于绝大多数用户场景不严重:
- 你想看某个 App 发了什么 HTTP 请求、连到了什么域名——这些主流量 PCAPdroid 都能抓到
- DNS 查询虽然可能不在 App 统计里,但DNS 查询内容本身在 Connections 里是可见的(明文)
- 真正影响 TLS 解密和 HTTP 请求检查的是主流量,不是 DNS
想更精准
| 方案 | 效果 | 代价 |
|---|---|---|
| 有条件就用 Root 模式 + Root 抓包 | 更接近真实网卡层 | TLS 解密和防火墙不可用 |
| 接受"应用级统计不完美" | 主要流量都能抓到 | App 标签页数据略粗 |
| 配合其他工具交叉验证 | 弥补单点工具不足 | 多工具学习成本 |