首页 文章

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

提问于
浏览
22

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

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

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

然后通过打开 Channels 创建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();

但这没效果 . 所以我要问的是:

  • 除了ToyVpn中使用的方法之外,还有一种方法可以通过编程方式创建VPN连接吗?

  • 如果没有,当我想 Build 与服务器的连接时,如何发送凭据?

Edit

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

2 回答

  • 8

    基本上Android 4.0中引入的VPN API只允许您实现 your own 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离我们只有几天了所以让我们拭目以待......

  • 3

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

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

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

相关问题