Настроить 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).
Ответы
Ответ 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, и т.д.)