Установите VPN-соединение программно на android 4.0

Я работаю над программной установкой VPN-соединения на устройствах android. Я успешно смог сделать это для устройств, использующих OS 2.3.5 и раньше (я использовал отражение, чтобы добраться до скрытых классов). Но с android 4.0 они избавились от старых классов и вместо этого используют класс VPNService.

Я подумал, что лучшим местом для начала было бы использовать пример ToyVPN android, но я сталкиваюсь с множеством проблем с ним. В примере кода им нужно было только отправить адрес сервера:

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).

2 ответов


в основном VPN API, представленный в Android 4.0+, позволяет реализовать только свой реализация VPN-сети. Это не более, чем открытие устройства Linux TUN и передать вам файловый дескриптор, а также настройка маршрутов / DNS-серверов / и т.д. Вы предоставили. Вся реализация протокола VPN зависит исключительно от вас.

Итак, короткий ответ: нет. вы не можете использовать VPN API настроить любой из

PPTP, L2TP, L2TP / IPSec PSK или L2TP / IPSec CRT

VPN-соединения, если вы не развернете свою собственную реализацию упомянутых типов VPN.

Это, как говорится, вы все еще можете попытаться транслировать намерение привести своего пользователя к активности настроек системы VPN и попросить их вручную настроить/запустить VPN.

Ну и еще одна вещь, чтобы добавить. На момент написания этой статьи последний Android DevicePolicyManager (API level 21) уже предоставляет настройка WiFi поддержка. Я бы лично предположил, что Google может продолжать добавлять больше Android для работы функции, которые могут включать поддержку подготовки VPN, которая вам нужна. I / O 2015 всего несколько дней так что давайте подождем и посмотрим...


существует способ установить VPN-соединение программно. Возможно, вы захотите взглянуть на OpenVPN для Android (ics-openvpn) проекта. Если нет необходимости для вашего приложения, чтобы сделать соединение напрямую, вы также можете использовать intents для запуска соединения из ics-openvpn. OpenVPN предлагает широкий спектр настроек, но вам все равно нужно посмотреть, совместим ли он с вашим сервером.

класс VpnService, представленный в Android 4.0 (ICS), может делать только некоторые такие параметры, как создание сетевого интерфейса (только режим tun), некоторые маршруты и DNS-серверы. Это по-прежнему необходимо для вашего приложения, чтобы иметь возможность подключаться без разрешения root. Возможно, вы захотите проверить здесь для получения дополнительной информации о том, как использовать VpnService.

насколько я изучил код ics-openvpn, приложение интегрирует двоичный файл OpenVPN в APK приложения. Приложение выполняет этот двоичный файл, отправляя и получая команды через локальный сокет. Бинарные заботится о почти все, вам просто нужно проанализировать входные данные, чтобы узнать, какие методы VpnService.Builder вы будете звонить, и какую информацию вы будете отправлять обратно через сокет (это включает в себя подтверждения, файлы конфигурации, учетные данные, байт-счета и т. д.)