غلط انګیرنه دا ده چې د VpnService اپلیکیشن سیسټم سویچ اړوي او له هغې وروسته تلیفون خوندي وي۔ په حقیقت کې چې پېښېږي هغه تنګتر دی: اپلیکیشن رضایت غواړي، یو انټرفېس جوړوي، د فایل ډسکریپټر له لارې پاکټونه لولي او لیکي، او کله چې ودرېږي انټرفېس بیرته ورکوي۔ یو وخت یوازې یو داسې تونل ژوندی اوسېدای شي، او سیسټم کولای شي پرته له پوښتنې هغه واخلي۔ هغه ګډوډ چلند چې خلک پر پروتوکول ورته اچوي، ډېره برخه یې له همدې مالکیت ماډل څخه راځي۔

هره ژوند دوره بدلون د څنډې قضیې په توګه نه، بلکې د ډیزاین برخې په توګه وګڼئ۔

افسانه: اپلیکیشن د تلیفون VPN فعالوي

بهیر د VpnService.prepare() سره پیلېږي، کوم چې یو Intent بیرته ورکوي چې کاروونکی باید ومني، او د establish() سره دوام کوي، کوم چې وروسته هم د هغو لاملونو له امله ناکامېدای شي چې اپلیکیشن کنټرول نه کوي۔ دوهم تونل جوړول لومړنی انټرفېس غیرفعالوي او د سیسټم خبرتیا بدلوي۔ په دې ترتیب کې چېرته هم اپلیکیشن د ټول وسیلې سویچ نه لري؛ هغه د ورکړل شوي ډسکریپټر او پر هغه راپرېوتونکو پاکټونو مالک دی۔ حتی دایمي خبرتیا هم د اپلیکیشن ډیزاین نه، بلکې د سیسټم ده۔

ځکه چې انټرفېس ورکول کېږي نه نیول کېږي، بل کلاینټ کولای شي هر وخت ځای ونیسي۔ اپلیکیشن دا د بیرته راستنېدونکي ارزښت نه، بلکې د کال بیک له لارې پوهېږي۔

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

افسانه: رضایت یو ځل ورکول کېږي

کله چې سیسټم تونل بل کلاینټ ته سپاري، د binder پر سر لغوه کولو معامله استوي چې بنسټیزه طبقه یې له onBind() څخه بیرته راولي۔ هغه اپلیکیشن چې دا binder په خپل بدلوي، باید لغوه کولو معامله پخپله مخته واستوي، که نه VpnService.onRevoke() هېڅکله فعال نه شي او خدمت په داسې ډسکریپټر کې لیکل ته دوام ورکړي چې نور نه شته۔ کاروونکی هم کولای شي تصویب بیرته واخلي، او سیسټم کولای شي خدمت د بیا پیل یا تل فعال بیا نښلولو پر مهال ودروي۔

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

هغه اپلیکیشن چې لغوه کول د حالت نه، بلکې استثنا په توګه ګڼي، به د نښلېدو راپور ورکړي پداسې حال کې چې هغه هر پاکټ چې لیکي غورځول کېږي، او دا د محرمیت وسیلې لپاره تر ټولو بد ناکامي حالت دی۔

افسانه: انټرفېس ستاسو لپاره ترافیک فلټروي

څه چې راځي هغه خام IP دی۔ نیول یا فلټرول پدې معنا دي چې د IP، TCP، UDP او IPv6 سرلیکونه تحلیل کړئ، بهیرونه تعقیب کړئ او ځوابونه بیرته ډسکریپټر ته ولیکئ، کوم چې د نیولو اپلیکیشن د سیسټم اسانتیا نه، بلکې کوچنی شبکه سټیک جوړوي۔ protect() د دې لپاره شته چې د اپلیکیشن خپل ټرانسپورټ ساکټ خپل تونل اوږدو کړي نه دا چې ځان ونیسي، او یو بولین بیرته ورکوي چې د تونل له پورته کېدو وروسته جوړ شوي هر ساکټ کې د کتلو وړ دی۔

په جوړوونکي کې د اجازه ورکړل شوو او منع شوو اپلیکیشنونو لیستونه ټاکي چې د چا ترافیک انټرفېس ته ننوځي۔ دوی له هغو IP پاکټونو بهر پیلوډ ته لاسرسی نه ورکوي چې انټرفېس یې وړي، او هیڅ API د بل کلاینټ تونل نه ښکاره کوي او نه د سیسټم VPN پروفایلونه لیست کوي۔ د شبکې وړتیاوې کولای شي ووایي چې یوه شبکه د VPN ټرانسپورټ ده، خو نه دا چې تونل د چا دی۔

همدې لامل د نورو اپلیکیشنونو په اړه د حالت پوښتنې متضاد ځوابونه ترلاسه کوي: معلومات یوازې ستاسو پروسې ته نه ښکاره کېږي۔

ژوند دوره په حقیقت کې څه غواړي

هغه حالتونه تعقیب کړئ چې تاسو یې کنټرولوئ: چمتو، جوړشوی، لغوه شوی، ودرول شوی۔ بیا نښلول باید ویجاړول او بیا جوړول وي، د ډسکریپټر او ټرانسپورټ ساکټ لپاره یو مالک سره، ځکه چې دوه برخې چې د جوړولو لپاره سیالي کوي به د یوازیني موجود ځای لپاره جګړه وکړي۔ په عصري Android کې د شالید پیلونه محدود دي، نو د بوټ خپرونه تضمین نه ده؛ چېرته چې د API کچه اجازه ورکوي هلته د هغې خبرتیا سره د مخکیني پلان خدمت وکاروئ۔

یوازې پای حالت نه، بلکې بدلون لاګ کړئ، او د حالت ماشین دومره کوچنی وساتئ چې هره لار وازموئ۔ هغه حالت چې په ازموینه کې ورته نه رسېږئ، هغه حالت دی چې په ساحه کې به پرته له لاګ ورسره مخ شئ۔

ژوند دوره په وسیله کې وازموئ

ایمولټرونه کولای شي نښلېدل جعلي کړي، خو د رضایت او لغوه کولو لار په قناعت بخښونکي ډول نه، نو دا په ریښتیني وسیله کې وچلوئ چې د ځای د غلا لپاره پکې دوهم VPN کلاینټ نصب وي۔

adb shell dumpsys connectivity | grep -i -A3 vpn
adb shell dumpsys activity services | grep -i -A2 vpnservice
adb logcat -s VpnService:V AndroidRuntime:E
adb shell am force-stop com.example.vpnapp

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

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

اړوندې مقالې