Android એપ VPN ની બહાર નામો ઉકેલે છે: બાઇન્ડિંગ માટેની ચેકલિસ્ટ
VPN ચાલુ હોય ત્યારે પણ Android ડિફૉલ્ટ નેટવર્ક દ્વારા નામ ઉકેલી શકે છે. પ્રોસેસને VPN નેટવર્ક સાથે બાંધો અને ચકાસો કે એપે ખરેખર કયો રિઝોલ્વર વાપર્યો.
Android એપ કોઈ આંતરિક નામ ઉકેલી શકતી નથી, જ્યારે VPN ક્લાઇન્ટનું પોતાનું બ્રાઉઝર તેને પહોંચી જાય છે, અને એ જ બિલ્ડ બીજા ફોન પર કામ કરે છે. URL એ ચલ નથી. ચલ એ છે કે એપ પ્રોસેસને નામ ઉકેલવા માટે કયું નેટવર્ક વાપરવાની મંજૂરી છે, અને Android એ બાંયધરી આપતું નથી કે સક્રિય VPN એ જ છે જે તમારા સોકેટ્સ વાપરે છે. આ તપાસો ક્રમમાં કરો અને જ્યારે રિઝોલ્વર સ્નેપશોટ તમારી ધારણા સાથે ન મળે ત્યારે થોભો.
પગલું 1: એપ કયા નેટવર્ક પર છે તે સાબિત કરો
સ્ટેટસ બારને બદલે એપનું પોતાનું દૃશ્ય વાંચો. ConnectivityManager માંથી સક્રિય નેટવર્ક, તેના LinkProperties, DNS સર્વરની સૂચિ અને ખાનગી DNS સેટિંગ મેળવો. જો સૂચિમાં VPN નો રિઝોલ્વર હોય, તો એપ પાસે તે સુધીનો માર્ગ છે; જો તેમાં Wi-Fi નો રિઝોલ્વર હોય, તો ટનલ તે પ્રોસેસ માટે ડિફૉલ્ટ નેટવર્ક નથી.
VPN આઇકન ફક્ત એ કહે છે કે ટનલ અસ્તિત્વમાં છે. તે એ નથી કહેતું કે એપની પ્રોસેસ તેની સાથે બંધાઈ છે, અને Android હંમેશા નામ-રિઝોલ્યુશનને સક્રિય દેખાતા નેટવર્ક દ્વારા રૂટ કરતું નથી. બીજા ઉપકરણ પર ફોરવર્ડ કરતી સ્થાનિક VPN એપ્સ, ઇન્ટરનેટ વગરના Wi-Fi નેટવર્ક અને વેન્ડર બિલ્ડ એપને ટનલના સર્વરને બદલે ડિફૉલ્ટ રિઝોલ્વરને પૂછતી મૂકી શકે છે.
પગલું 2: VPN ટ્રાન્સપોર્ટ માંગો અને પ્રોસેસ બાંધો
જ્યારે એપે ટનલનો રિઝોલ્વર વાપરવો જ પડે, ત્યારે VPN ટ્રાન્સપોર્ટ સાથે નેટવર્ક માંગો અને કૉલબેકમાં પ્રોસેસ બાંધો, જેથી કોડ અનુમાન ન કરે કે નેટવર્ક ક્યારે આવશે:
val request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_VPN)
.build()
connectivityManager.requestNetwork(request, object : NetworkCallback() {
override fun onAvailable(network: Network) {
val bound = connectivityManager.bindProcessToNetwork(network)
Log.i(TAG, "bound to VPN network: " + bound)
}
})
આ કૉલ સમગ્ર પ્રોસેસનું ડિફૉલ્ટ નેટવર્ક બદલે છે, તેથી પછી બનેલા દરેક સોકેટ તેને વાપરે છે. પહેલેથી અસ્તિત્વમાં રહેલા સોકેટ પોતાનું બનાવટનું નેટવર્ક જાળવી રાખે છે, તેથી બાઇન્ડ પહેલાં ખૂલેલો કનેક્શન પૂલ જૂના માર્ગ દ્વારા ઉકેલવાનું ચાલુ રાખી શકે છે. પરત મળતું મૂલ્ય બુલિયન છે, અને ખોટું પરિણામ એટલે બાઇન્ડ થયું નથી; ટૂંકા વિલંબ સાથે ફરી પ્રયાસ કરો અને બંને પ્રયાસો લોગ કરો.
પગલું 3: બાઇન્ડને જરૂરી હોય તેટલા સુધી મર્યાદિત રાખો
સમગ્ર પ્રોસેસનું બાઇન્ડિંગ અસ્પષ્ટ છે. ટેલિમેટ્રી, અપડેટ તપાસ અને તૃતીય-પક્ષ SDK પણ ટનલ પર જાય છે, અને જો ટનલમાં ઇન્ટરનેટ ન હોય તો તે નિષ્ફળ થવા લાગે છે. એક જ વિનંતી માટે નેટવર્કની સોકેટ ફેક્ટરી વાપરો અને બાકીનું બધું ઉપકરણના ડિફૉલ્ટ પર રાખો. જાણી જોઈને એક મોડેલ પસંદ કરો: દરેક કનેક્શન માટે સાંકડું બાઇન્ડ, અથવા પ્રોસેસ બાઇન્ડ જે VPN અદૃશ્ય થાય ત્યારે સ્પષ્ટ અનબાઇન્ડ સાથે.
રિઝોલ્વરની બે સુવિધાઓ કોઈપણ ભૂલ વગર બાઇન્ડને નિષ્ફળ કરી શકે છે. કડક મોડમાં ખાનગી DNS વિનંતીઓને નેટવર્ક રિઝોલ્વરને બદલે નામવાળા DoT સર્વર પર મોકલે છે, અને પોતાનું DNS-over-HTTPS ક્લાઇન્ટ ધરાવતી એપ સિસ્ટમ રિઝોલ્વરને સંપૂર્ણપણે ટાળે છે. બાઇન્ડ નિષ્ફળ ગયું છે એવું તારણ કાઢતા પહેલાં બંને તપાસો. જે ક્વેરી ક્યારેય VPN ના DNS સર્વર સુધી પહોંચતી નથી તે કોઈ ટનલ-બાજુના લોગમાં દેખાશે નહીં.
પગલું 4: CONNECTED અવરોધ પર ભરોસો ન કરો
WorkManager માં NetworkType.CONNECTED નો અર્થ છે કે નેટવર્ક જોડાયેલું છે, અને VPN ટ્રાન્સપોર્ટ તેને ત્યારે પણ સંતોષે છે જ્યારે નીચેની Wi-Fi કે સેલ્યુલર કડી ગઈ હોય. જોબ ચાલે છે, દરેક વિનંતી નિષ્ફળ જાય છે, અને રિટ્રાય નીતિ તેને શેડ્યુલિંગ બગ જેવા તોફાનમાં ફેરવે છે. ટનલ એ નેટવર્ક છે; અવરોધ ક્યારેય ઇન્ટરનેટ તપાસ ન હતો.
કામને ખરેખર જે ક્ષમતા જોઈએ તે તપાસો, જેમ કે માન્ય ઇન્ટરનેટ ઍક્સેસ, અને બેકઑફ સાથે મર્યાદિત રિટ્રાય નીતિ રાખો. જો જોબને ખાનગી નામ જોઈએ, તો કામ કરતા પહેલાં પસંદ કરેલા નેટવર્કમાં તે નામ ઉકેલો, અને જે વિનંતી સફળ થઈ શકતી નથી તેને ફરી પ્રયાસ કરવાને બદલે સ્પષ્ટ ભૂલ સાથે ઝડપથી નિષ્ફળ જાઓ.
પગલું 5: પુરાવા નોંધો અને શ્રેણી ફરી ચકાસો
પસંદ કરેલા નેટવર્કના ટ્રાન્સપોર્ટ પ્રકારો, LinkProperties માંથી DNS સર્વરો, બાઇન્ડે સાચું પરત કર્યું કે નહીં, અને પ્રથમ વિનંતીની ચોક્કસ નિષ્ફળતા લોગ કરો. પછી એ જ બાઇન્ડિંગ હેઠળ ખાનગી નામ અને જાહેર નામ ચલાવો. તે જોડી બતાવે છે કે એપે ટનલ રિઝોલ્વર વાપર્યો કે ચૂપચાપ ઉપકરણના ડિફૉલ્ટ પર પાછી ફરી, જે વપરાશકર્તા અનુભવે છે તે તફાવત છે.
તમે સપોર્ટ કરો તે સૌથી જૂના Android સંસ્કરણ પર અને એક વર્તમાન રિલીઝ પર પુનરાવર્તન કરો. જે રિઝોલ્વર વર્તન ડિફૉલ્ટ માર્ગને સાચો દેખાવા દે છે તે જ ત્યાં છે જ્યાં ઉપકરણો અને સંસ્કરણો અલગ પડે છે, અને ફક્ત નવા પરીક્ષણ ઉપકરણ પર પસાર થતું બિલ્ડ તમે શિપ કરો તે શ્રેણી માટે ચકાસાયેલું નથી. adb shell dumpsys connectivity એ ઝડપી રીત છે જ્યારે તમે નિષ્ફળતાનું પુનરુત્પાદન કરો ત્યારે ઉપકરણ કયા નેટવર્ક અને ક્ષમતાઓ જણાવે છે તેની પુષ્ટિ કરવા.