Android VpnService යම් ට්රැෆික් පමණක් අල්ලා ගන්නේ ඇයි, සියල්ල නොවේ
මාර්ග, DNS සටහන් සහ එක් එක් යෙදුමේ විෂය පථය තීරණය කරන්නේ කුමන පැකට් tun උපාංගයට ළඟා වන්නේද, දේශීය උපාංග අතුරුදහන් වන්නේ ඇයි සහ ගොඩනැගුම්කරු ප්රතික්ෂේප කරන්නේ කුමක්ද යන්නයි.
VpnService තුළ කිසිවක් තමන් විසින්ම ට්රැෆික් අල්ලා නොගනී. එය පද්ධතියෙන් tun අතුරුමුහුණතක් ඉල්ලා සිටී, එම අතුරුමුහුණතට ලිපින හා මාර්ග කට්ටලයක් ලබා දෙයි, එම මොහොතේ සිට කර්නලය එම මාර්ගවලට ගැළපෙන සෑම පැකට්ටුවක්ම යෙදුමට කියවිය හැකි ගොනු විස්තරකයකට පිටපත් කරයි. යෙදුමේ කේතය මාර්ග තෝරා නොගත් පැකට්ටු කිසිදා නොදකී, එබැවින් ටනලයක විෂය පථය ක්රමලේඛන ප්රශ්නයක් වීමට පෙර මාර්ගගත කිරීමේ වගු ප්රශ්නයකි. ඒ නිසාම එකම සේවා ක්රියාත්මක කිරීම එක් දුරකථනයක සියලු ප්රවාහ ගිල දැමිය හැකි අතර තවත් එකක කොටසක් පමණි, ඒ නිසාම මාර්ගයක් එකතු කිරීම සමහර විට කැඩුණු ලෙස පෙනුණු ටනලයක් සුවපත් කරයි. ඔබට ලැබෙන්නේ ඔබ ප්රකාශ කළ දේය, ගොඩනැගුම්කරු නිහඬව ප්රතික්ෂේප කළ සියල්ල අඩු කර.
කුමන පැකට් පැමිණේද යන්න මාර්ග තීරණය කරයි
Builder.addRoute(prefix, prefixLength) VPN ජාලයේ මාර්ගගත කිරීමේ වගුවට උපසර්ගයක් ස්ථාපනය කරයි. පද්ධතිය එම ජාලය විෂය පථයේ යෙදුම් සඳහා පෙරනිමිය ලෙස සලකයි, එබැවින් එහි සටහන් භෞතික ජාලයේ පෙරනිමි මාර්ගයට පෙර විමසනු ලැබේ, ගැළපෙන උපසර්ගයක් ප්රවාහයක් හරවා යැවීමට ප්රමාණවත්ය. ඒ නිසා 0.0.0.0/0 සඳහා මාර්ගය IPv4 සම්පූර්ණයෙන්ම ගනී, මුද්රණ යන්ත්රය, cast ඉලක්කය සහ රවුටරයේ පරිපාලන පිටුව ඇතුළුව.
භෞතික පෙරනිමි සටහන මකා නොදමා එම ආවරණය අවශ්ය ග්රාහකයෝ ඒ වෙනුවට 0.0.0.0/1 සහ 128.0.0.0/1 යුගලය භාවිත කරති. වඩාත් නිශ්චිත මාර්ග දෙකක් පෙරනිමි මාර්ගය පරදවයි, එකට ඒවා සම්පූර්ණ ලිපින අවකාශය ආවරණය කරයි, දුරකථනයේම පෙරනිමි සටහන තවමත් භෞතික ජාලයට බැඳී ඇති සොකට් සඳහා වගුවේ රැඳේ.
ලිපින සහ DNS සටහන් එකම ගොඩනැගුම්කරුගෙන් පැමිණ වෙනත් ප්රශ්නයකට පිළිතුරු දෙයි. addAddress අතුරුමුහුණතට උපසර්ග දිගක් සහිත ලිපිනයක් දෙයි, addDnsServer විෂය පථයේ යෙදුම් අතුරුමුහුණත හරහා විමසන විසඳන්නෙකු ස්ථාපනය කරයි. පවුල් දෙකම එක් අතුරුමුහුණතක සිටිය හැක, එබැවින් IPv6 ලිපිනයක් අසල IPv4 පමණක් මාර්ග කට්ටලයක් යනු නිවැරදිව කියවෙන නමුත් තවමත් ගලා යන වින්යාසයකි. අතුරුමුහුණතට ලිපිනයක් නොමැති පවුලක් මාර්ගගත කරන්නේ නම්, කර්නලයට එම පැකට් සඳහා මූල ලිපිනයක් නොමැති අතර ඒවා කිසිදා විස්තරකයේ නොපෙනේ.
establish() ආපසු දෙන්නේ කුමක්ද
establish() ParcelFileDescriptor එකක් ආපසු දෙයි, නැතහොත් යෙදුම අවසර ලත් නොවන විට null. null යනු ජාල දෝෂයක් නොව එකඟතා තත්ත්වයකි: VpnService.prepare() දැනටමත් null ආපසු දී තිබිය යුතුය, නැතහොත් පරිශීලකයා ඇමතුමට පෙර පද්ධති සංවාදය අනුමත කර තිබිය යුතුය. සේවාව ක්රියාත්මක වන අතරතුර එකඟතාව ඉවත් කළ හැක, අතුරුමුහුණත ඔබේ කියවීම් ලූපයට කිසිදු ආපසු ඇමතුමක් නොමැතිව ඔබේ පාද යටින් වැසේ.
ඔබ වෙනත් ලෙස නොකියන්නේ නම් විස්තරකය අවහිර නොකරයි, එබැවින් කියවීම තන්තුව නවතා නොතබා දත්ත නොමැතිව වහාම ආපසු එයි. අවහිර සොකට් සඳහා ලියූ ලූපයක් එක් කෝරයක් දවයි, හිස් කියවීමක් මාරාන්තික ලෙස සලකන ලූපයක් නිශ්චල තත්පරයකදී ටනලය ඉරා දමයි. Builder.setBlocking(true) එම හැසිරීම වෙනස් කරයි, මිල වන්නේ කියවීම තුළ රැඳී සිටින තන්තුවකි.
මාර්ග සහ ලිපින තර්ක LinkAddress අගයන් ලෙස වලංගු කරනු ලැබේ, 224.0.0.0/4 වැනි මල්ටිකාස්ට් ගමනාන්ත සෘජුවම ප්රතික්ෂේප කරනු ලැබේ. ලක්ෂ්යයේ සිට ලක්ෂ්යයට tun අතුරුමුහුණතටද විකාශන වසමක් නොමැත, එබැවින් එය හරහා මල්ටිකාස්ට් සොයා ගැනීමට තවත් මාර්ගයක් නොව වෙනත් සැලසුමක් අවශ්යයි. පරීක්ෂා කළ යුතු ලැයිස්තුව VpnService.Builder වේ, ඇමතුමක් නොසලකා හැරුණු බව නිගමනය කිරීමට පෙර.
යෙදුම් අනුව විෂය පථය කට්ටලය පටු කරයි, ටනලය නොවේ
API 21 සිට ගොඩනැගුම්කරු addAllowedApplication සහ addDisallowedApplication පිළිගනී, ලැයිස්තු දෙකම එක් ගොඩනැගුම්කරුවෙකු තුළ අන්යෝන්ය වශයෙන් බැහැර කරයි. අවසර ලැයිස්තුව එම පැකට් සඳහා ටනලය පවත්වා ගනී, අනෙක් සියල්ල භෞතික ජාලය රඳවා ගනී; තහනම් ලැයිස්තුව නම් කළ පැකට් හැර සියල්ල අල්ලා ගනී, කුමක් ග්රාහකයෙකු බෙදුණු ටනල්කරණය ලෙස ලබා දෙයිද. API 21 ට පෙර වේදිකා යාන්ත්රණයක් කිසිසේත් නොමැත, යෙදුම් අනුව හැසිරීම පැමිණියේ තමන්ගේම යැවුම්කරු තුළ UID අනුව පෙරහන් කළ තෙවන පාර්ශ්ව ග්රාහකයන්ගෙනි. දෝෂ නිරාකරණයේදී මෙම වෙනස වැදගත් වේ, මන්ද එක් පැකට්ටුවක අවසර ලැයිස්තුවක් සහිත යෙදුම් අනුව ටනලයක් පාහේ කිසිදු ට්රැෆික් නිපදවන්නේ නැති අතර එය නිවැරදි හැසිරීමකි, කැඩුණු මාර්ගයක් නොවේ.
විෂය පථය කුමක් වුවත්, ඔබේ යෙදුම VPN සේවාදායකයට විවෘත කරන සොකට් එය ගොඩනගන ටනලය හරහා ගමන් නොකළ යුතුය. VpnService.protect(socket) එම සොකට් යටි ජාලයට බඳියි, එවිට එහි පැකට් tun උපාංගය මඟ හරියි. ඇමතුම මඟ හැරියොත්, අතට අත දීම එය ඔසවා තැබිය යුතුව තිබූ අතුරුමුහුණතෙන් ගිල දැමේ.
VpnService.setUnderlyingNetworks කුමන භෞතික ජාලය ටනලය ගෙන යයිද පද්ධතියට කියා චක්රය වසයි. එම අගය VPN අනෙක් යෙදුම්වලට සම්බන්ධතාවය වාර්තා කරන ආකාරය තීරණය කරයි, null හෝ පැරණි අගයක් දුරකථනයේ ඉතිරි කොටස නොබැඳි ලෙස සලකන සම්බන්ධිත ටනලයක සුලභ හේතුවකි. යටි ජාලය වෙනස් වන විට එය යාවත්කාලීන කරන්න, ආරම්භයේදී පමණක් නොවේ.
පරීක්ෂක එකතු සහ MTU: නිවැරදි මාර්ගයක් තවමත් අසාර්ථක වන තැන
පැකට් පැමිණි පසු, පැකට් මට්ටමේ විස්තර දෙකක් කිසිවක් අන්තයේ සිට අන්තය දක්වා ක්රියා කරයිද යන්න තීරණය කරයි. පළමුවැන්න මූල ලිපිනයයි: අතුරුමුහුණත ලිපින කිහිපයක් සමඟ කර්නලය පළමුවැන්න දරන පැකට් යැවිය හැක, එබැවින් ශීර්ෂ නැවත ලියන යැවුම්කරු ලිපිනය සහ එය ආවරණය කරන පරීක්ෂක එකතුව නිවැරදි කළ යුතුය.
දෙවැන්න පරීක්ෂක එකතුවේ විෂය පථයයි. යෙදුම TCP හෝ UDP පැකට් තමන්ම ගොඩනගන විට, පරීක්ෂක එකතුව මූල ලිපිනය, ගමනාන්ත ලිපිනය, ප්රොටෝකෝල අංකය සහ ප්රවාහන දිග දරන ව්යාජ ශීර්ෂයක් ආවරණය කරයි, ඒවායින් එකක් හෝ හැර දැමීම පැමිණ ඉවත දමන පැකට් ලබා දෙයි. එම අසාර්ථකත්වය කිසිදා නොපැමිණෙන පිළිතුරකට පසු කාල සීමාව ඉකුත් වීමක් ලෙස පෙනේ, එය බොහෝ දෙනා නැවත මාර්ගවලට යවයි. setMtu අතුරුමුහුණතේ MTU නිර්ණය කරයි, සෑම කියවීමක්ම හරියටම සම්පූර්ණ IP පැකට්ටුවක් ආපසු දෙයි, එබැවින් බයිට් ප්රවාහයක් සඳහා ලියූ බෆරයක් පැකට්ටුව නොව ඔබේ විග්රහය කැබලි කරයි.
ස්තර වෙන් කරන සත්යාපන වටයක්
විෂය පථය වැරදුණේ කොහේද සොයා ගැනීමට ස්තර පිළිවෙළින් පරීක්ෂා කරන්න. VPN ජාලය සැබවින්ම කුමන මාර්ග දරයිද උපාංගයෙන් අසන්න, පසුව දන්නා ලිපිනයකට ප්රවාහයක් විස්තරකයේ කියවීමක් ලෙස පෙනේදැයි පරීක්ෂා කරන්න, පසුව ඔබේ යැවුම්කරු යවන පැකට්ටුව හොඳින් හැඩගැසී ඇත්දැයි පරීක්ෂා කරන්න. මාර්ග ගැටලුවක් විස්තරකයේ කිසිවක් නොපෙන්වයි, පරීක්ෂක එකතු ගැටලුවක් පැමිණ අතුරුදහන් වන පැකට්ටුවක් පෙන්වයි.
විස්තරකයට කිසිවක් ළඟා නොවන්නේ නම්, සැකකරු කියවන්නා නොව මාර්ග කට්ටලයයි: උපසර්ග තහවුරු කරන්න, එකම පවුලේ ලිපිනයක් ඇති බව තහවුරු කරන්න, යෙදුම ඔබ නියම කළ විෂය පථය තුළ ඇති බව තහවුරු කරන්න. පැකට් විස්තරකයට ළඟා වුවත් කිසිවක් ආපසු නොඑන්නේ නම්, නැවත මාර්ගයක් ස්පර්ශ කිරීමට පෙර protect() සහ යටි ජාලයේ අගය පරීක්ෂා කරන්න. දුරස්ථ පැත්ත විකෘත පැකට් වාර්තා කරන්නේ නම්, පරීක්ෂක එකතුව සහ MTU බැලිය යුතු තැන් ය. සෑම ස්තරයකටම එක් පරීක්ෂණයක් අඩක් දිනක අනුමානය ඉතිරි කරයි.