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 — зусім не падтрыманы шлях, і сумленны адказ там такі: налада належыць таму прадукту.