Как отключить расширение пакетного туннеля с завершением работы хост-приложения

Прямо сейчас я реализовал простое расширение пакетного туннеля с помощью API-интерфейсов сетевого расширения для iOS 11+. Я хочу сделать это VPN только для приложений, чтобы трафик из Моего приложения можно было туннелировать через нашу VPN и прокси. Итак, мои вопросы

  1. Как остановить туннелирование при переключении пользователя на другие приложения. Один из вариантов - использовать методы делегирования приложения -(void)applicationWillResignActive:(UIApplication *)application или -(void)applicationDidEnterBackground:(UIApplication *)application.
  2. Если Пользователь напрямую завершает работу приложения с помощью принудительного выхода, тогда также следует отключить VPN - мы можем использовать -(void)applicationWillTerminate:(UIApplication *)application, но когда я пытался, иногда это не работало должным образом.
  3. Что реализовать, чтобы справиться с тем же случаем, когда приложение вылетает. - В качестве обходного пути я думал реализовать что-то вроде механизма пинг-понга, где, если приложение активно, оно должно продолжать пинговать или обновлять любые общие данные, к которым будет обращаться расширение Packet Tunnel. Таким образом, в случае, если приложение остановится или завершится, Tunnel узнает о неактивности приложения и прекратит туннелирование самостоятельно.
  4. Чтобы поддерживать VPN-туннелирование активным, нам необходимо периодически обновлять токен, поэтому есть ли способ обновить настройки VPN и немедленно отразить изменения без перезапуска (остановки и повторного запуска) туннеля.

Пожалуйста, предложите правильные решения или обходной путь для вышеуказанных сценариев. Это было бы мне большим подспорьем.


person Mrug    schedule 11.12.2018    source источник


Ответы (1)


Я не думаю, что вы можете надежно достичь того, на что надеетесь, программно в своем приложении.

Вы можете настроить свою VPN как VPN для каждого приложения. и свяжите с VPN только свое приложение. Это должно соответствовать большинству ваших требований. Ограничение заключается в том, что его можно развернуть только с помощью решения для управления мобильными устройствами (MDM).

Другим вариантом может быть запуск VPN как стандартная VPN и туннелирование всех приложений через нее, но в расширении сети VPN используйте NEPacketTunnelFlow :: readPacketObjects (), выберите NEFlowMetaData из ответа NEPacket и используйте sourceAppUniqueIdentifier параметр для идентификации вашего приложения. Затем вы можете закодировать обработку пакетов в Network Extension так, чтобы данные из вашего приложения затем могли быть отправлены через вашу VPN и прокси, а все другие полученные пакеты потенциально могли быть переадресованы предполагаемым получателям.

person Jordan Johnson    schedule 01.01.2019
comment
Второй вариант также ограничен VPN для каждого приложения, т.е.также требует MDM: эти метаданные присутствуют только для данных, проходящих через поставщиков VPN для каждого приложения, то есть поставщиков прокси приложений и поставщиков туннелей пакетов в режиме VPN для каждого приложения. - person LBC; 13.04.2020