android - 关于Android理解VpnService代码的问题
问题描述
我一直在学习 Android VpnService,我在 Github https://github.com/M66B/NetGuard/#netguard中找到了一个使用名为 NetGuard 的 VpnService 构建网络防火墙的好项目。我已阅读 ServiceSinkhole 中的代码,但我仍然无法理解如何在代码中阻止 Internet 访问?你能告诉我在哪里可以找到代码中的阻塞方式吗?谢谢!
解决方案
“阻止互联网访问”到底是什么意思?我建议您阅读VpnService和VpnService.Builder类的(综合)文档,其中解释了如何使用提供的 API 设置 VPN 隧道。设置好 VPN 后,您基本上可以“挂钩”到 Android 设备的网络流量,因此您完全负责哪些出站数据包离开设备,以及哪些入站数据包传送到应用程序。换句话说,你可以使用这个钩子随意丢弃数据包,从而“阻止互联网访问”。这个“钩子”是调用返回的文件描述符VpnService.Builder.establish()
:
[...] 该接口适用于 IP 数据包,并返回一个文件描述符供应用程序访问它们。每次读取都会检索一个路由到接口的传出数据包。每次写入都会注入一个传入数据包,就像从接口接收到的数据包一样。[...]
本质上,要阻止应用程序的 Internet 访问,只需避免将其出站数据包写入 VPN 隧道(从文件描述符读取出站数据包),并避免将其入站数据包写入文件描述符(从 VPN 隧道读取入站数据包) )。
推荐阅读
- jquery - 在 vue 中使用 fotorama
- c# - 从 WinForms UserControl 中删除边框
- machine-learning - XGBoost 超参数调优
- c# - 删除/保护 url 中的 id 不被篡改
- c# - 如何构建此决策树?
- javascript - 带有承诺的jquery多个http get请求
- javascript - 如何在不重新加载整个页面的情况下重新加载 Next.js 页面初始道具
- javascript - 当应用程序托管在 Heroku (Node.js) 上时,无法连接到 Websocket
- c++ - 将模板(没有规范)传递给 std::thread() 会产生错误:
匹配错误 - python - Pandas groupby 变换('mean')skipna=False