23

我正在以编程方式在 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. 如果没有,当我想与服务器建立连接时如何发送凭据?

编辑

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

4

2 回答 2

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。

Oh and one more thing to add. At the time of this writing, Android's latest DevicePolicyManager (API level 21) already provides WiFi settings provisioning support. I would personally guess that Google might continue to add more Android for Work features, which may include VPN provisioning support you need. I/O 2015 is only a few days away so let's wait and see...

于 2015-05-19T07:46:07.377 回答
3

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

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

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

于 2015-02-25T18:16:57.093 回答