在android 4.0上以编程方式设置VPN连接

时间:2012-05-31 15:09:20

标签: android android-4.0-ice-cream-sandwich vpn

我正在以编程方式在Android设备上设置VPN连接。我成功地使用OS 2.3.5和之前的设备(我使用反射来访问隐藏的类)。但是在android 4.0中,他们摆脱了旧类并使用了VPNService类。

我认为最好的起点是使用Android提供的ToyVPN示例,但我面临很多挑战。在示例代码中,他们只需要发送服务器地址:

InetSocketAddress server = new InetSocketAddress(mServerAddress, Integer.parseInt(mServerPort));

然后打开频道创建VPN隧道:

tunnel = DatagramChannel.open();

但在我的情况下,我需要发送服务器地址,用户名和密码。到目前为止,我还没有想出如何这样做。我最好的猜测是做这样的事情:

Authenticator.setDefault(new Authenticator(){
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("user","pass".toCharArray());
        }});

    try {
        // Create a DatagramChannel as the VPN tunnel.

        tunnel = DatagramChannel.open();

但是这没用。 所以我要问的是:

  1. 除了ToyVpn中使用的方法之外,有没有办法以编程方式创建VPN连接?
  2. 如果没有,当我想建立与服务器的连接时,如何发送凭据?
  3. 修改

    我忘了提到我需要指定VPN类型(PPTP,L2TP,L2TP / IPSec PSK或L2TP / IPSec CRT)。

2 个答案:

答案 0 :(得分:8)

基本上,Android 4.0+中引入的VPN API只允许您实施您自己的 VPN实施。它只不过是打开Linux TUN设备并将文件描述符传递给您,以及设置您提供的路由/ DNS服务器/等。整个VPN协议实现完全取决于您。

所以简短的回答是:不。您无法使用 VPN API 来设置任何

  

PPTP,L2TP,L2TP / IPSec PSK或L2TP / IPSec CRT

VPN连接,除非您推出自己实现的上述VPN类型。

话虽这么说,您仍然可以尝试广播一个Intent,让您的用户进入系统VPN设置活动,并要求他们手动配置/启动VPN。

哦,还有一件事要补充。在撰写本文时,Android的最新DevicePolicyManager(API级别21)已提供WiFi settings provisioning support。我个人猜测Google可能会继续添加更多Android for Work功能,其中可能包括您需要的VPN配置支持。 I/O 2015仅在几天之后,让我们拭目以待......

答案 1 :(得分:3)

有一种方法可以通过编程方式设置VPN连接。您可能想看看OpenVPN for Android (ics-openvpn)项目的来源。如果您的应用程序不需要直接建立连接,您还可以使用意图来触发来自ics-openvpn的连接。 OpenVPN提供了多种设置,但您仍需要查看它是否与您的服务器兼容。

Android 4.0(ICS)中引入的VpnService类只能执行一些设置,例如创建网络接口(仅限tun模式),某些路由和DNS服务器。您的应用仍然需要能够在没有root权限的情况下进行连接。您可能需要查看here以获取有关如何使用VpnService的更多信息。

据我探索过ics-openvpn的代码,该应用程序集成了一个可在应用程序的APK中运行的OpenVPN二进制文件。应用程序执行此二进制文件,通过本地套接字发送和接收命令。二进制文件几乎可以处理所有内容,您只需要解析输入以了解您将调用的VpnService.Builder的哪些方法,以及您将通过套接字发回哪些信息(这包括确认,配置文件,凭据,字节数等等)