Aplicația Android refuză să ruleze prin VPN: ce nivel decide
O aplicație poate refuza VPN-ul printr-o verificare locală a transportului, printr-o regulă de adresă pe server sau prin propria politică. Distingeți cele trei cazuri înainte de a schimba ieșirea.
Când o aplicație Android se oprește exact în momentul în care tunelul se ridică, pot fi responsabile trei lucruri diferite, iar ele produc eșecuri asemănătoare. Aplicația poate citi starea de rețea a telefonului însuși și poate refuza local. Serverul poate clasifica adresa de unde veniți și o poate respinge. Sau refuzul poate să nu aibă nicio legătură cu VPN-ul. Ordinea de mai jos strânge dovezi înainte de a schimba ceva, pentru că schimbarea ieșirii este pasul cel mai scump și cel mai puțin probabil să ajute dacă verificarea este locală.
Pasul 1: aflați când refuză aplicația
Momentul este primul criteriu de discriminare. Goliți tamponul de jurnal, reproduceți eșecul și priviți ce a făcut aplicația înainte de a se plânge:
adb logcat -c
# reproduce the failure in the app
adb logcat -d | grep -iE 'vpn|network|connect|http' | tail -60
Dacă aplicația refuză înainte de orice încercare de cerere spre exterior, aveți de-a face cu o decizie locală. Dacă se conectează, trimite ceva și abia apoi arată o eroare, respingerea a venit de cealaltă parte. Dacă aplicația eșuează identic cu tunelul oprit, VPN-ul nu a fost niciodată variabila.
Tratați acel moment ca dovadă, nu ca probă. O aplicație poate reda un răspuns din cache, iar cererile din fundal pot fi reușit sau eșuat înainte de a privi. Notați momentele ultimei cereri reușite și ale erorii, nu doar clipa în care a apărut mesajul.
Pasul 2: citiți cum vede telefonul însuși rețeaua
Android expune starea VPN ca o capacitate de rețea, deci o aplicație nu are nevoie de o listă de furnizori comerciali ca să observe că un tunel este activ. Întreabă serviciul de conectivitate care este rețeaua curentă, iar răspunsul include un bit de transport VPN:
val cm = context.getSystemService(ConnectivityManager::class.java)
val caps = cm.getNetworkCapabilities(cm.activeNetwork)
val onVpn = caps?.hasTransport(NetworkCapabilities.TRANSPORT_VPN) == true
Acea verificare este locală și ieftină și explică o întreagă clasă de rapoarte de tipul "această aplicație nu funcționează prin VPN" fără nicio clasificare la distanță. Ce poate vedea aplicația depinde totuși de propriul context de rețea, așa că nu presupuneți că fiecare aplicație inspectează fiecare profil de pe dispozitiv.
De pe o stație de lucru vedeți aceeași stare pe un dispozitiv de test cu adb shell dumpsys connectivity și căutând intrarea de rețea VPN. Comparați o rulare cu tunelul ridicat cu una cu el coborât și păstrați ambele ieșiri.
Pasul 3: citiți ce vede de fapt serverul
Celălalt observator este serviciul. El vede adresa sursă care sosește și poate acționa asupra adresei, a rețelei de găzduire din spatele ei, a regiunii, a operatorului sau a semnalelor legate de cont și dispozitiv. Niciuna dintre acestea nu este o identitate unică, iar adresarea partajată face blocajele colaterale normale: o adresă restricționată poate scoate din joc utilizatori fără legătură din spatele aceleiași traduceri.
Obțineți adresa pe aceeași cale pe care o folosește aplicația, nu dintr-un browser pe laptop. Pe telefon, o cerere simplă către un serviciu de ecou al adresei arată ce primește partea îndepărtată, iar compararea cu o cerere prin rețeaua mobilă vă spune dacă adresa s-a schimbat deloc.
Dacă aplicația funcționează prin rețeaua mobilă și eșuează prin tunel cu același cont, respingerea este la capătul îndepărtat sau în politica proprie a aplicației. Dacă eșuează în ambele cazuri, VPN-ul nu este diferența și ar trebui să opriți testarea punctelor finale.
Pasul 4: potriviți dovezile cu unul dintre cele trei verdicte
Trei combinații acoperă aproape fiecare raport. Un refuz fără nicio încercare spre exterior în timp ce un tunel este activ indică o verificare locală a transportului. O cerere care pleacă și se întoarce cu eroare, un timp de expirare pe un anumit host sau un mesaj despre regiune indică partea îndepărtată. Un eșec care se repetă pe rețeaua mobilă fără tunel indică contul, versiunea aplicației sau politica serviciului, iar nicio schimbare de VPN nu îl va mișca.
Notați verdictul împreună cu dovezile care l-au produs. Valoarea acestui pas este că oprește bucla în care cineva schimbă nodurile de ieșire de patru ori pentru a repara o verificare care rulează pe telefon.
De asemenea, ține afirmațiile oneste. Găzduirea propriului server schimbă punctul final și ieșirea lui în internet; nu face Androidul să uite că o rețea VPN este activă și nu garantează acceptarea de către un serviciu care clasifică adrese. Un filtru local se poate declanșa pe un VPN pe care îl dețineți la fel de ușor ca pe unul comercial.
Pasul 5: urmați calea susținută și verificați-o
Începeți cu politica documentată a produsului și cu responsabilul său de suport. Trimiteți versiunea clientului, mesajul exact și o fereastră îngustă de eșec; nu trimiteți capturi complete de trafic sau acreditări doar ca să dovediți că o eroare există.
Dacă serviciul permite accesul direct și politica dispozitivului o permite, excluderea pentru o singură aplicație este mecanismul susținut, iar ea scoate deliberat acea aplicație din tunel în loc să ascundă tunelul. Traficul aplicației pleacă apoi pe propria cale, ceea ce este o decizie de politică pe care cineva trebuie să și-o asume. Într-o configurație de blocare fără VPN, o aplicație exclusă poate pur și simplu să piardă conectivitatea, așa că testați această combinație înainte de a promite că funcționează.
După orice schimbare, repetați testul de timp din primul pas, confirmați că aplicația funcționează și că toate celelalte aplicații folosesc în continuare tunelul. Apoi restabiliți configurația anterioară și verificați dacă eșecul revine, pentru că o remediere pe care nu o puteți reproduce este o coincidență pe care o veți întâlni din nou.