【问题标题】:Issue about Android understanding VpnService code关于Android理解VpnService代码的问题
【发布时间】:2018-05-08 11:47:57
【问题描述】:

我一直在学习 Android VpnService,我在 Github https://github.com/M66B/NetGuard/#netguard 中找到了一个使用名为 NetGuard 的 VpnService 构建网络防火墙的好项目。 我已阅读 ServiceSinkhole 中的代码,但我仍然无法理解如何在代码中阻止 Internet 访问? 你能告诉我在哪里可以找到代码中的阻塞方式吗? 谢谢!

【问题讨论】:

    标签: android


    【解决方案1】:

    您所说的“阻止 Internet 访问”究竟是什么意思?我建议您阅读 VpnServiceVpnService.Builder 类的(综合)文档,其中解释了如何使用提供的 API 设置 VPN 隧道。设置好 VPN 后,您基本上可以“挂钩”到 Android 设备的网络流量,因此您完全负责哪些出站数据包离开设备,以及哪些入站数据包传送到应用程序。换句话说,你可以使用这个钩子随意丢弃数据包,从而“阻止互联网访问”。这个“钩子”是调用VpnService.Builder.establish()返回的文件描述符:

    [...] 接口对 IP 数据包起作用,并返回一个文件描述符 以便应用程序访问它们。每次读取检索一个传出 路由到接口的数据包。每次写入都会注入一个 传入的数据包就像从接口接收到的一样。 [...]

    本质上,要阻止应用程序的 Internet 访问,只需避免将其出站数据包写入 VPN 隧道(出站数据包从文件描述符中读取),避免将其入站数据包写入文件描述符(从 VPN 隧道读取入站数据包)。

    【讨论】:

    • 感谢您的帮助!我已经阅读了 VpnService 和 VpnService.Builder 并且我理解 prepare() 和establish()。根据您的指导,您建议我在项目中找到有关 VPN 隧道的代码和有关文件描述符的代码?我在 JNI 中发现了一些编写为 c 文件的代码。那是阻止应用程序访问互联网的相应代码吗?我只是 NDK 的新手。再次感谢您的帮助和耐心。
    • 抱歉,我觉得我最近在 JNI 方面的经验不足以帮助您完成这部分工作。顺便说一句,对于未来的问题,您可能想问更精确的问题(这个问题非常广泛)。例如。显示到目前为止您编写的代码以及您面临的问题。万事如意,万事如意!
    猜你喜欢
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多