37

我需要实现一个 Android 应用程序,该应用程序允许用户配置 VPN 连接,而无需访问 Android 设备的本机菜单。有了这个我有两个问题:

  1. 在 Android 4.0 +(api 级别 14 及更高版本)中,我发现有一个名为 VpnService 的新组件,它提供了一个用于创建虚拟网络接口、配置它以及从它拦截/转发包到 VPN 服务器的钩子,但没有内置 VPN 协议,如 PPTP 或 IPSec,只是有可能实现它们。我的问题是是否有任何现成的解决方案可以让 PPTP 和 IPSec 与 VpnService 一起使用?

  2. 在早期版本的 Android 中,从我目前发现的情况来看,似乎使用 VPN 的唯一方法是通过在 android 中包装(使用反射)一些隐藏的 api 来访问和配置设备的内置 vpn 解决方案,但这是一个繁琐的解决方案,因为设备需要植根,隐藏的 api 实现也可能因设备和操作系统版本而异。有没有更好的方法来以编程方式配置底层 linux 操作系统的内置 VPN?

4

1 回答 1

28

1) 我不知道 Android 4.x ICS VpnService 的任何开源 PPTP 或 IPSec 实现。VpnService 旨在创建自定义协议 VPN 应用程序(理论上可以是 pptp 或 IPSec)。我发现利用这个新 API 的唯一开源实现是 OpenVPN 的一个:

https://github.com/schwabe/ics-openvpn

这提供了一种潜在的 VPN 解决方案,您可以完全控制(服务器也是开源的),但它不是 PPTP 或 IPSec。如果你了解 PPTP 协议,应该可以以此为模型来实现这样的 VPN 客户端。

2) 是的,确实在早期版本中,唯一的方法是通过私有 API。事实上,即使您想在以后的版本中使用内置的 VPN 支持(即内置 PPTP 或 IPSec 支持),您也必须利用这些隐藏的 API。也许可以使用底层的 linux 内核在较低级别执行此操作,但这需要 root 操作系统并绕过 Android 应用程序范例。这不一定是使用私有 API 的更好选择。

有关如何使用这些 API 配置 VPN 的一些信息:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/net/vpn/PptpProfile.java(PPTP 配置文件对象的示例,需要传递到 API)

如何使用 Android 4.0 以编程方式创建新的 VPN 接口?(解释如何在系统上存储这个新的 VPN 配置文件)

我不确定这些 API 的一致性和可靠性。我希望它们能够在大多数 Android 设备上工作,因为供应商不太可能重新实现基本的 VPN 实现,尽管他们可能已经添加了自己的。他们还可能更改了启用此类配置文件所需的 API,或扩展了其功能。

于 2012-12-04T00:24:28.150 回答