Dwie osoby zadają to samo pytanie i dostają odpowiedzi, które się nie zgadzają, bo stoją w różnych miejscach. Jedna ma otwarty ekran ustawień VPN systemu i edytuje listę aplikacji. Druga pisze VpnService.Builder.addDisallowedApplication() w edytorze. Obie nazywają to filtrem VPN na aplikację. Tylko jedna z nich ma kontrolę, którą opisuje, i żadna niczego nie blokuje.

Zacznij od ekranu, który widzi użytkownik

Otwórz Ustawienia, znajdź wpis VPN i spójrz na połączenie, które jest naprawdę aktywne. Jeśli klient oferuje listę na aplikację, ta lista należy do tunelu samego klienta. Platforma nie publikuje ogólnego API, przez które niepowiązana aplikacja mogłaby czytać lub zmieniać wybór aplikacji innego VPN, więc druga aplikacja nie naprawi tej listy za użytkownika.

To pierwsze rozwidlenie w przewodniku. Jeśli zainstalowany VPN nie ma takiego ustawienia, nie ma czego obchodzić kodem: funkcji nie ma w produkcie, który posiada tunel. Jeśli ma, właściwa poprawka jest na tym ekranie i wykonuje ją osoba, która może go otworzyć.

Śledź pakiet do tunelu

Gdy twoja aplikacja buduje tunel, tworzy interfejs TUN i deklaruje, których aplikacji ruch do niego wchodzi. Wywołania członkostwa następują przed ustanowieniem interfejsu, a potem zestaw reguł jest ustalony dla tej sesji:

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

Te wywołania dotyczą tylko tunelu, który twoja aplikacja właśnie utworzyła, i niczego innego. Nie są polityką całego urządzenia, nie utrzymują się dla innych klientów i nie mogą sięgnąć do czyjegoś VPN. Gdy wywołanie konstruktora rzuca wyjątek, bo pakietu nie da się rozwiązać, interfejs nigdy nie zostaje ustanowiony, co jest czystą, a nie cichą porażką.

Dlaczego wykluczenie wyglądało jak blokada

Wykluczona aplikacja jest kierowana wokół twojego tunelu do sieci pod spodem. To przeciwieństwo blokowania: ruch nadal opuszcza urządzenie, tylko poza interfejsem, który kontrolujesz. Aplikacja w stylu zapory działa odwrotnie. Wpuszcza ruch aplikacji do swojego tunelu, a potem odrzuca pakiety lub odmawia ich przekazania, więc interfejs jest ten sam, a kierunek polityki jest odwrócony.

Praca za tym odwróceniem nie jest flagą konfiguracji. Czytasz pakiety IP z deskryptora tunelu, decydujesz dla każdego przepływu, a potem przekazujesz je przez chroniony socket albo odrzucasz. Wszystko, czego nie obsłużysz, po prostu się zatrzymuje, i dlatego na wpół gotowy tunel wygląda jak zepsuta sieć, a nie działający filtr. Jeśli celem jest blokada, zaplanuj obsługę pakietów, usługę pierwszego planu i pisemną politykę dla ruchu, którego nie potrafisz zaklasyfikować.

Co się psuje, gdy zbudujesz to sam

Android zwykle pozwala na jeden aktywny VPN naraz, więc twój tunel filtrujący i tunel prywatności konkurują o to samo miejsce, chyba że produkty wspierają łańcuchowanie. Zawsze włączony VPN z blokowaniem połączeń zmienia tryb awarii w sposób, który tu ma znaczenie: ruch, który nie może wejść do tunelu, jest odrzucany zamiast wysyłany bezpośrednio, czego chce projekt zapobiegania wyciekom i czego sesja debugowania rzadko się spodziewa.

Widoczność pakietów to druga pułapka. Rozwiązanie nazwy pakietu aplikacji może się nie udać z NameNotFoundException, a w nowszych wersjach Androida zestaw widocznych pakietów zależy od zadeklarowanych zapytań. Obsłuż wyjątek zamiast zakładać, że każda nazwa się rozwiąże, i czytaj listę ponownie przy instalacji lub usuwaniu aplikacji, zamiast trzymać ją w pamięci podręcznej na zawsze.

Urządzenia zarządzane dodają trzeciego właściciela. Polityka mobilności przedsiębiorstwa może ustawić VPN na aplikację lub profil zawsze włączony, a zwykła aplikacja nie może tego nadpisać. Sprawdź, czy urządzenie jest zarządzane, zanim zaczniesz debugować własny kod, bo w tym przypadku lista, którą próbujesz zmienić, może być nieedytowalna dla nikogo, kto trzyma telefon.

Przetestuj to aplikacją, którą kontrolujesz

Nie testuj aplikacją, którą próbujesz filtrować. Użyj drugiej aplikacji, której zachowanie sieciowe możesz obserwować, i sprawdź, czy jej ruch wychodzi przez twój tunel, podczas gdy ruch celu nie. Jeśli oba zostają w środku, polityka działa, a cel jest wykluczony; jeśli żaden nie wychodzi, sam tunel jest zły, a lista aplikacji nie jest problemem.

Potem zdecyduj, którą z trzech rzeczy naprawdę budujesz. Tunel na aplikację to API konstruktora, z listą jako częścią twojego profilu. Zapora urządzenia to obsługa pakietów plus cykl życia, którego możesz bronić. Zmiana czyjegoś VPN nie jest w ogóle obsługiwaną ścieżką, a uczciwa odpowiedź tam brzmi, że to ustawienie należy do tego produktu.

Powiązane artykuły