VpnService protect() లేదా యాప్ మినహాయింపు: మార్గాన్ని సరిచేసేది ఏది
టన్నెల్ను మోసే సాకెట్ను కాపాడండి, లేదా మొత్తం యాప్ను మినహాయించండి: మీ Android VPN కి ఏ పరిధి కావాలో నిర్ణయించే మూడు షరతులు.
టన్నెల్ యొక్క స్వంత ప్యాకెట్లను టన్నెల్ వెలుపల ఉంచడానికి రెండు మార్గాలు ఉన్నాయి: రవాణా సాకెట్ను కాపాడటం, లేదా మొత్తం యాప్ను VPN నుండి తీసేయడం. అవి వేర్వేరు సమస్యలను పరిష్కరిస్తాయి; కలపడం సులభం కాబట్టే విస్తృతమైనదాన్ని ఎంచుకోవడమే యాప్లు గమనించకుండా స్థానిక నెట్వర్క్ యాక్సెస్ను, విభజిత DNS ను కోల్పోయే విధానం. టన్నెల్ వెలుపల ఉండాల్సిన దానితో ప్రారంభించి, దాన్ని సాధించే అతి చిన్న పరిధిని ఎంచుకోండి.
protect() టన్నెల్ నుండి తీసేది ఏమిటి
VpnService.protect() ఒక్క సాకెట్కు చెందిన పిలుపు. టన్నెల్ను మోసే సాకెట్ లేదా డిస్క్రిప్టర్ను దానికి ఇస్తారు, Android ఆ సాకెట్ను గుర్తు పెట్టి దాని ట్రాఫిక్ VPN ఇంటర్ఫేస్కు బదులు అంతర్లీన నెట్వర్క్ను వాడేలా చేస్తుంది. యాప్ పంపే మిగతావన్నీ ఇప్పటికీ సాధారణ VPN మార్గాన్నే అనుసరిస్తాయి.
ఆ ఇరుకైన పరిధే ఉద్దేశం. కాపాడిన సాకెట్ మీ HTTP క్లయింట్ పేర్లను ఎలా పరిష్కరిస్తుంది, మీ విశ్లేషణ పిలుపులు ఏ ఇంటర్ఫేస్ను వాడతాయి, తర్వాత తెరిచే రెండో కనెక్షన్కు ఏం జరుగుతుంది అనేవి మార్చదు.
పరిధిని నిర్ణయించే మూడు షరతులు
మొదటి షరతు, టన్నెల్ రవాణా మాత్రమే బయటపడాలా అనేది. యాప్ మిగతా ట్రాఫిక్ ఇంకా VPN గుండానే వెళ్లాలంటే, సాకెట్ రక్షణే సరైన పరిధి. రెండో షరతు, సాకెట్ సృష్టిని మీరు నియంత్రిస్తున్నారా అనేది. తన లోపల లోతుగా సొంత సాకెట్ తెరిచే లైబ్రరీ, ఒక హుక్ బయటపెట్టకపోతే లేదా ముందే నిర్మించిన సాకెట్ను స్వీకరించకపోతే, protect() పిలవడానికి మీకు చోటు ఇవ్వదు. మూడో షరతు, యాప్ స్థానిక నెట్వర్క్ను లేదా క్యాప్టివ్ పోర్టల్ను నేరుగా చేరుకోవాలా అనేది; అది టన్నెల్ను సజీవంగా ఉంచడం కంటే వేరైన అవసరం.
addDisallowedApplication() తో యాప్ను మినహాయించడం మొద్దుబారిన సాధనం. యాప్ చేసే ప్రతి కనెక్షన్ను, మీరు పరిశీలించాలనుకున్నవి సహా, VPN నుండి తీసేస్తుంది; కొన్ని పరికరాల్లో స్థానిక ఆవిష్కరణ ఎలా ప్రవర్తిస్తుందో కూడా మారుస్తుంది.
bindProcessToNetwork() లేదా సాకెట్ స్థాయి నెట్వర్క్ హ్యాండిల్తో రవాణాను ఎంచుకున్న నెట్వర్క్కు కట్టడం మూడో ఎంపిక. పరికరంలో Wi-Fi, సెల్యులార్ ఒకేసారి ఉన్నప్పుడు, టన్నెల్ నిర్దిష్ట అప్లింక్ గుండా వెళ్లాలనుకున్నప్పుడు ఇది ఉపయోగకరం.
రవాణా సృష్టించబడుతున్నప్పుడే దాన్ని పిలవండి
రవాణాను సృష్టించే అదే బ్లాక్లో, connect() లేదా send() కంటే ముందు protect() పిలవండి. పిలుపు false తిరిగి వస్తే, సాకెట్ను మూసి సెటప్ విఫలమవ్వనివ్వండి; కొనసాగితే మీ స్వంత ఇంటర్ఫేస్లోకి దాని ప్యాకెట్లు తిరిగి చొరబడగల రవాణా మిగిలిపోతుంది.
ఆకారం ఒకే చోట ఉంచుకోగలంత చిన్నది:
DatagramSocket transport = new DatagramSocket();
if (!protect(transport)) {
transport.close();
throw new IOException("transport not protected");
}
transport.connect(serverAddress);ఇక్కడ మూడు వివరాలు కరుస్తాయి. మొదటిది, మీకు లభించే ఏకైక సంకేతం boolean విలువే, కాబట్టి రద్దు చేసిన అనుమతిని తిరస్కరించిన పిలుపు నుండి వేరుచేయగలంత సందర్భంతో వైఫల్యాన్ని నమోదు చేయండి. రెండోది, protect() సాకెట్ను కవర్ చేస్తుంది, డిస్క్రిప్టర్ సంఖ్యను కాదు: సాకెట్ను మూసి తర్వాత అదే పూర్ణాంకాన్ని మరో సాకెట్కు వాడితే, కొత్త సాకెట్ కాపాడబడదు. మూడోది, స్థానిక లైబ్రరీ రవాణాను తెరిచినప్పుడు, స్థానిక కోడ్ కనెక్ట్ అయ్యే ముందే డిస్క్రిప్టర్ను కాపాడండి, లేకపోతే మార్గం ఇప్పటికే ఎంచుకోబడి ఉండవచ్చు. మీ లక్ష్య API స్థాయి నిజంగా అందించే ఓవర్లోడ్లను నిర్ధారించే చోటు VpnService సూచన.
నిరోధించిన మార్గాన్ని కూడా పరీక్షించండి, విజయ మార్గాన్ని మాత్రమే కాదు
టన్నెల్ పైకి ఉన్నప్పుడే ధృవీకరించండి, ఎందుకంటే ఆ రెండు మార్గాలు భిన్నించగల ఏకైక స్థితి అదే. కాపాడిన రవాణా ద్వారా ఒక అభ్యర్థనను, protect() ఎప్పుడూ పిలవని కోడ్ మార్గం నుండి మరొకదాన్ని పంపి, దూరపు చివర చూసేదాన్ని పోల్చండి: కాపాడిన కనెక్షన్ అంతర్లీన నెట్వర్క్ను మూలంగా తీసుకొని రావాలి, కాపాడనిది టన్నెల్ స్వంత చిరునామాను చూపి దాని బైట్ కౌంటర్లను కదిలిస్తుంది. పరికరంలో, ఏదీ రేడియోను విడిచే ముందే ss లేదా netstat అదే విభజనను చూపుతుంది.
రద్దును విడిగా పరీక్షించండి, ఎందుకంటే అనుమతి మార్పు మీ సాకెట్ కోడ్ను తాకకుండానే ఇంటర్ఫేస్ను కూల్చేస్తుంది. VPN అనుమతిని రద్దు చేయండి లేదా సేవను ఆపండి, రవాణాను తిరిగి నిర్మించి, protect() ఇంకా true తిరిగి ఇస్తుందా, అనుమతి మళ్లీ ఇచ్చిన తర్వాత రవాణా తిరిగి కనెక్ట్ అవుతుందా అని నిర్ధారించండి.
కాపాడిన అభ్యర్థన ఏమైనా టన్నెల్ను అనుసరిస్తే, సాకెట్ ఇప్పటికే మార్గనిర్దేశం చేయబడిన తర్వాతే రక్షణ పిలుపు జరుగుతోంది. దాన్ని ముందుకు కదిలించి మళ్లీ పరీక్షించండి.
నిర్ణయాన్ని రవాణా సెటప్ పక్కనే రాసి ఉంచండి: ఏ సాకెట్లు కాపాడబడుతున్నాయి, ఏ యాప్ ట్రాఫిక్ మినహాయించబడింది, రక్షణ విఫలమైనప్పుడు యాప్ ఏం చేస్తుంది. ఒకే పరీక్ష విఫలమవుతోందని తర్వాతి రీఫ్యాక్టరింగ్ మినహాయింపును మొత్తం యాప్కు విస్తరించకుండా ఆపేది ఆ వరుసే. manifest ను రివర్స్ ఇంజినీరింగ్ చేయకుండా ఉద్దేశాన్ని తనిఖీ చేయడానికి తదుపరి వ్యక్తికి మార్గం కూడా ఇస్తుంది.