VPN за отделни приложения в Android: изключването не е блокиране
Списъкът на екрана принадлежи на един собственик на тунел и изключването на приложение го насочва около този тунел, а не извън мрежата. Започнете оттам.
Двама души задават един и същ въпрос и получават несъвместими отговори, защото стоят на различни места. Единият е отворил екрана с настройките за VPN и редактира списък с приложения. Другият пише VpnService.Builder.addDisallowedApplication() в редактор. И двамата го наричат VPN филтър за отделни приложения. Само един от тях притежава контрола, който описва, и нито един не блокира нищо.
Започнете от екрана, който потребителят вижда
Отворете Настройки, намерете реда за VPN и вижте коя връзка е наистина активна. Ако клиентът предлага списък за отделни приложения, този списък принадлежи на собствения му тунел. Платформата не публикува общ API, чрез който несвързано приложение да чете или редактира избора на приложения на друг VPN, затова второ приложение не може да поправи този списък вместо потребителя.
Това е първото разклонение в разбора. Ако инсталираният VPN няма такава настройка, няма какво да се заобикаля с код: функцията липсва в продукта, който притежава тунела. Ако я има, правилната поправка е на този екран и се прави от човека, който може да го отвори.
Проследете пакета в тунела
Когато вашето приложение построи тунел, то създава TUN интерфейс и обявява чий трафик влиза в него. Извикванията за членство се случват преди интерфейсът да бъде установен и след това наборът от правила е фиксиран за тази сесия:
val builder = VpnService.Builder()
builder.addAddress("10.8.0.2", 32)
builder.addRoute("0.0.0.0", 0)
builder.addDisallowedApplication("com.example.bypass")
val tun = builder.establish() // membership decided here
Тези извиквания се отнасят само за тунела, който приложението ви току-що създаде. Те не са политика за цялото устройство, не остават за други клиенти и не могат да стигнат до чужд VPN. Когато извикване на builder се провали, защото пакетът не може да бъде намерен, интерфейсът изобщо не се установява и това е чист, а не тих провал.
Защо изключването изглеждаше като блокиране
Изключеното приложение се насочва около вашия тунел към подлежащата мрежа. Това е обратното на блокиране: трафикът все пак напуска устройството, само извън интерфейса, който контролирате. Приложение от типа на защитна стена прави обратното: приема трафика на приложението в своя тунел и после изхвърля пакетите или отказва да ги препрати, така че интерфейсът е същият, а посоката на политиката е обърната.
Работата зад това обръщане не е флаг за конфигурация. Четете IP пакети от дескриптора на тунела, решавате за всеки поток и или ги препращате през защитен сокет, или ги изхвърляте. Всичко, което не обработите, просто спира и затова полуготов тунел изглежда като счупена мрежа, а не като работещ филтър. Ако целта ви е блокиране, предвидете бюджет за обработка на пакети, фонова услуга и писмена политика за трафика, който не можете да класифицирате.
Какво се чупи, когато го построите сами
Android обикновено разрешава един активен VPN наведнъж, така че филтриращият ви тунел и тунелът за поверителност се състезават за едно и също място, освен ако продуктите не поддържат верижно свързване. Постоянният VPN с блокиране на връзки променя режима на отказ по начин, който има значение тук: трафик, който не може да влезе в тунела, се изхвърля вместо да бъде изпратен директно, което иска дизайнът срещу изтичане и което сесията за отстраняване на грешки рядко очаква.
Видимостта на пакетите е вторият капан. Разрешаването на името на пакет на приложение може да се провали с NameNotFoundException, а в по-новите версии на Android наборът от видими пакети зависи от заявките, които сте обявили. Обработвайте изключението, вместо да предполагате, че всяко име се разрешава, и препрочитайте списъка при инсталиране или премахване на приложения, вместо да го кеширате завинаги.
Управляваните устройства добавят трети собственик. Политика за корпоративна мобилност може да зададе VPN за отделни приложения или постоянен профил и обикновено приложение не може да я отмени. Проверете дали устройството се управлява, преди да отстранявате грешки в собствения си код, защото в този случай списъкът, който се опитвате да промените, може да не е редактируем от никого, който държи телефона.
Тествайте с приложение, което контролирате
Не тествайте с приложението, което се опитвате да филтрирате. Използвайте второ приложение, чието мрежово поведение можете да наблюдавате, и проверете дали трафикът му излиза през вашия тунел, а този на целта не излиза. Ако и двете останат вътре, политиката работи и целта е изключена; ако нито едно не излезе, тунелът е грешен и списъкът с приложения не е проблемът.
После решете кое от три неща всъщност строите. Тунел за отделни приложения е API на builder, а списъкът е част от профила ви. Защитна стена на устройството е обработка на пакети плюс жизнен цикъл, който можете да защитите. Промяната на чужд VPN изобщо не е поддържан път и честният отговор там е, че настройката принадлежи на този продукт.