Установите 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();
но это не сработало. поэтому я спрашиваю:
- есть ли способ, кроме того, что используется в ToyVpn, создать VPN-соединение программно?
- если нет, как отправить учетные данные, когда я хочу установить соединение с сервером?
редактировать
Я забыл упомянуть, что мне нужно указать тип 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 вы будете звонить, и какую информацию вы будете отправлять обратно через сокет (это включает в себя подтверждения, файлы конфигурации, учетные данные, байт-счета и т. д.)