د تونل خپل پاکټونه د تونل څخه بهر ساتلو دوې لارې شته: د ترانسپورت سوکټ ساتل، یا ټول اپلیکیشن د VPN څخه ایستل۔ دا دوه بېلې ستونزې حل کوي، او د پراخې لارې غوره کول ځکه چې نښلول یې اسانه دي، هغه لار ده چې اپلیکیشنونه پرته له پامه خپل لاسرسی محلي شبکې ته او ووېشل شوي DNS له لاسه ورکوي۔ له هغه شي پیل کړئ چې باید د تونل څخه بهر پاتې شي، بیا هغه ترټولو کوچنی پراخوالی غوره کړئ چې دا ترلاسه کوي۔

protect() د تونل څخه څه لرې کوي

VpnService.protect() د هر سوکټ لپاره یوه بلنه ده۔ هغه سوکټ یا ډیسکریپټر چې تونل وړي ورته ورکوئ، او Android هغه سوکټ نښه کوي ترڅو د هغه ترافیک د VPN انټرفېس پرځای لاندې شبکه وکاروي۔ نور هر څه چې اپلیکیشن یې لېږي لا هم عادي VPN لار تعقیبوي۔

همدا تنګ پراخوالی اصل دی۔ ساتل شوی سوکټ نه بدلوي چې ستاسو HTTP کلاینټ نومونه څنګه حل کوي، ستاسو د تحلیل بلنې کوم انټرفېس کاروي، یا له وروسته پرانیستل شوې دوهمې اړیکې سره څه پېښېږي۔

درې شرطونه چې پراخوالی معلوموي

لومړی شرط دا دی چې یوازې د تونل ترانسپورت باید ووځي که نه۔ که د اپلیکیشن نور ترافیک باید لا هم د VPN له لارې تېر شي، نو د سوکټ ساتنه سم پراخوالی دی۔ دوهم شرط دا دی چې آیا تاسو د سوکټ جوړولو کنټرول لرئ۔ هغه کتابخانه چې خپل سوکټ ژور دننه پرانیزي تاسو ته protect() بللو لپاره ځای نه پرېږدي، پرته له دې چې کولک ورکړي یا چمتو سوکټ ومني۔ دریم شرط دا دی چې آیا اپلیکیشن باید سیده محلي شبکې یا captive portal ته ورسیږي، چې دا له تونل ژوندي ساتلو څخه بېله غوښتنه ده۔

اپلیکیشن په addDisallowedApplication() ایستل ناپېکل شوی اوزار دی۔ دا هره اړیکه چې اپلیکیشن جوړوي د VPN څخه لرې کوي، هغه هم چې تاسو یې کتل غوښتل، او په ځینو وسایلو کې د محلي موندنې چلند هم بدلوي۔

دریمه لاره دا ده چې ترانسپورت په خوښ شوې شبکه وتړئ:bindProcessToNetwork() یا د سوکټ کچې شبکه لاستي سره۔ دا هغه وخت ګټوره ده چې وسیله په یو وخت کې Wi-Fi او موبایل ولري او غواړئ تونل له یو ټاکلي پورتنۍ لارې تېر شي۔

هغه وخت چې ترانسپورت جوړېږي بلنه ورته وکړئ

بلنه وکړئ protect() په هماغه بلاک کې چې ترانسپورت جوړوي،connect() یا send() مخکې۔ که بلنه false بیرته راوګرځوي، سوکټ وتړئ او تنظیم ناکام کړئ؛ دوام یې تاسو له هغه ترانسپورت سره پرېږدي چې پاکټونه یې ستاسو خپل انټرفېس ته بیا ننوتلای شي۔

شکل دومره کوچنی دی چې په یو ځای کې وساتل شي:

DatagramSocket transport = new DatagramSocket();
if (!protect(transport)) {
    transport.close();
    throw new IOException("transport not protected");
}
transport.connect(serverAddress);

دلته درې جزئیات چیچي۔ لومړی،بولین یوازینی سیګنال دی چې ترلاسه کوئ، نو ناکامي د کافي شرایطو سره ثبت کړئ ترڅو بېرته اخیستل شوې رضایت او رد شوې بلنه سره توپیر وکړئ۔ دوهم،protect() سوکټ پوښي، نه د ډیسکریپټر شمېره: که سوکټ وتړئ او وروسته هماغه بشپړ عدد د بل سوکټ لپاره وکاروئ، نوی سوکټ نه دی ساتل شوی۔ دریم، کله چې اصلي کتابخانه ترانسپورت پرانیزي، ډیسکریپټر مخکې له دې چې اصلي کوډ ونښلي وساتئ، که نه نو لار ممکن مخکې غوره شوې وي۔د VpnService حواله هغه ځای دی چې تایید کړئ ستاسو د موخې API کچه په رښتیا کوم اوورلوډونه وړاندې کوي۔

بلاک شوې لار وآزمویئ، نه یوازې خوښه لار

د تونل په پورته حالت کې تایید کړئ، ځکه یوازې هغه حالت دی چې دوه لارې توپیر کولای شي۔ یوه غوښتنه د ساتل شوي ترانسپورت له لارې او بله د هغه کوډ لارې چې هیڅکله protect() بلنه نه ده کړې ولېږئ، بیا پرتله کړئ چې لرې سر څه ویني: ساتل شوې اړیکه باید د لاندې شبکې سره د سرچینې په توګه ورسیږي، په داسې حال کې چې نه ساتل شوې د تونل خپل پته ښیي او د تونل د بایټ شمېرونکي خوځوي۔ په وسیله،ss یا netstat هماغه وېش مخکې له دې چې څه راډیو پرېږدي ښیي۔

بېرته اخیستل جلا وآزمویئ، ځکه د رضایت بدلون انټرفېس پرته له دې چې ستاسو سوکټ کوډ ته لاس ووړي نسکوروي۔ د VPN رضایت بېرته واخلئ یا خدمت ودروئ، ترانسپورت بیا جوړ کړئ او تایید کړئ چې protect() لا هم true بیرته راګرځوي او ترانسپورت بیا نښلي کله چې رضایت بیا ورکړل شي۔

که ساتل شوې غوښتنه بیا هم تونل تعقیب کړي، د ساتنې بلنه احتمالاً وروسته له هغه پېښېږي چې سوکټ لا دمخه لارښوول شوی۔ هغه مخکې یوسئ او بیا وآزمویئ۔

پرېکړه د ترانسپورت تنظیم ترڅنګ ولیکل شوې وساتئ: کوم سوکټونه ساتل شوي، کوم اپلیکیشن ترافیک ایستل شوی، او کله چې ساتنه ناکامه شي اپلیکیشن څه کوي۔ هماغه کرښه ده چې وروسته بیا جوړونې ته اجازه نه ورکوي چې ایستل ټول اپلیکیشن ته وغځوي ځکه چې یوه ازموینه ناکامه وه۔ دا بل کس ته هم لار ورکوي چې نیت پرته له مانیفست د برعکس انجنیري وګوري۔

اړوندې مقالې