Подтвердить что ты не робот

Настроить VPN-соединение программно на Android 4.0

Я работаю над программным настройкой VPN-соединения на устройствах Android. Я был в состоянии сделать это для устройств, использующих ОС 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();

Но это не сработало. поэтому я спрашиваю:

  • Есть ли способ, отличный от того, что используется в ToyVpn, для программного создания VPN-соединения?
  • Если нет, как мне отправить учетные данные, когда я хочу установить соединение с сервером?

Edit

Я забыл упомянуть, что мне нужно указать тип VPN (PPTP, L2TP, L2TP/IPSec PSK или L2TP/IPSec CRT).

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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