ٹنل کی اپنی پیکٹوں کو ٹنل سے باہر رکھنے کے دو طریقے ہیں: ٹرانسپورٹ ساکٹ کی حفاظت کریں، یا پوری ایپ کو VPN سے نکال دیں۔ یہ مختلف مسائل حل کرتے ہیں، اور صرف اس لیے زیادہ وسیع طریقہ چننا کہ اسے جوڑنا آسان ہے، وہی وجہ ہے کہ ایپس بغیر جانے اپنے مقامی نیٹ ورک تک رسائی اور تقسیم شدہ DNS کھو دیتی ہیں۔ اس چیز سے شروع کریں جو ٹنل سے باہر رہنی چاہیے، پھر وہ سب سے چھوٹی وسعت چنیں جو اسے پوری کرے۔

protect() ٹنل سے کیا ہٹاتا ہے

VpnService.protect() ایک واحد ساکٹ کے لیے کال ہے۔ آپ اسے وہ ساکٹ یا ڈسکرپٹر دیتے ہیں جو ٹنل لے جاتا ہے، اور Android اس ساکٹ کو نشان زد کرتا ہے تاکہ اس کی ٹریفک VPN انٹرفیس کے بجائے بنیادی نیٹ ورک استعمال کرے۔ ایپ جو کچھ اور بھیجتی ہے وہ اب بھی معمول کے VPN راستے پر چلتا ہے۔

یہی تنگ وسعت اصل مقصد ہے۔ محفوظ ساکٹ اس بات کو نہیں بدلتا کہ آپ کا HTTP کلائنٹ نام کیسے حل کرتا ہے، آپ کی تجزیاتی کالیں کون سا انٹرفیس استعمال کرتی ہیں، یا بعد میں کھلنے والے دوسرے کنکشن کا کیا ہوتا ہے۔

وسعت طے کرنے والی تین شرطیں

پہلی شرط یہ ہے کہ کیا صرف ٹنل کی ٹرانسپورٹ کو باہر نکلنا ہے۔ اگر ایپ کی دیگر ٹریفک اب بھی VPN سے گزرنی چاہیے تو ساکٹ کی حفاظت ہی درست وسعت ہے۔ دوسری شرط یہ ہے کہ کیا ساکٹ بنانا آپ کے قابو میں ہے۔ ایسی لائبریری جو اندر گہرائی میں اپنا ساکٹ کھولتی ہے، آپ کو protect() پکارنے کی جگہ نہیں دیتی، الا یہ کہ وہ کوئی ہک فراہم کرے یا پہلے سے بنا ساکٹ قبول کرے۔ تیسری شرط یہ ہے کہ کیا ایپ کو مقامی نیٹ ورک یا کیپٹیو پورٹل تک براہ راست پہنچنا ہے، جو ٹنل کو زندہ رکھنے سے مختلف تقاضا ہے۔

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);

یہاں تین تفصیلیں کاٹتی ہیں۔ پہلی، آپ کو ملنے والا واحد اشارہ boolean قدر ہے، اس لیے ناکامی کو اتنی تفصیل کے ساتھ لاگ کریں کہ منسوخ شدہ اجازت کو مسترد شدہ کال سے الگ پہچان سکیں۔ دوسری، protect() ساکٹ کو ڈھکتا ہے، ڈسکرپٹر نمبر کو نہیں: اگر آپ ساکٹ بند کریں اور بعد میں وہی عدد کسی دوسرے ساکٹ کے لیے استعمال کریں تو نیا ساکٹ محفوظ نہیں ہوتا۔ تیسری، جب نیٹو لائبریری ٹرانسپورٹ کھولے تو نیٹو کوڈ کے جڑنے سے پہلے ڈسکرپٹر کی حفاظت کریں، ورنہ راستہ پہلے ہی منتخب ہو چکا ہو سکتا ہے۔ VpnService حوالہ وہ جگہ ہے جہاں آپ تصدیق کرتے ہیں کہ آپ کی ہدف API سطح واقعی کون سے اوور لوڈ فراہم کرتی ہے۔

مسدود راستے کو بھی جانچیں، صرف کامیاب راستہ نہیں

ٹنل چلنے کی حالت میں تصدیق کریں، کیونکہ یہی واحد حالت ہے جس میں دونوں راستے مختلف ہو سکتے ہیں۔ ایک درخواست محفوظ ٹرانسپورٹ سے اور دوسری ایسے کوڈ راستے سے بھیجیں جس نے کبھی protect() نہیں پکارا، پھر موازنہ کریں کہ دور سرا کیا دیکھتا ہے: محفوظ کنکشن کو بنیادی نیٹ ورک کو ماخذ بنا کر آنا چاہیے، جبکہ غیر محفوظ ٹنل کا اپنا پتہ دکھاتا ہے اور ٹنل کے بائٹ کاؤنٹر ہلاتا ہے۔ آلے پر ss یا netstat یہی تقسیم اس سے پہلے دکھاتا ہے کہ کوئی چیز ریڈیو سے نکلے۔

منسوخی کو الگ جانچیں، کیونکہ اجازت کی تبدیلی آپ کے ساکٹ کوڈ کو چھوئے بغیر انٹرفیس گرا دیتی ہے۔ VPN کی اجازت منسوخ کریں یا سروس روکیں، ٹرانسپورٹ دوبارہ بنائیں، اور تصدیق کریں کہ protect() اب بھی true واپس کرتا ہے اور اجازت دوبارہ ملنے پر ٹرانسپورٹ پھر جڑتا ہے۔

اگر محفوظ درخواست پھر بھی ٹنل کے ساتھ جائے تو حفاظتی کال غالباً اس وقت ہو رہی ہے جب ساکٹ پہلے ہی روٹ ہو چکا ہے۔ اسے پہلے منتقل کریں اور دوبارہ جانچیں۔

فیصلہ ٹرانسپورٹ سیٹ اپ کے ساتھ لکھا رکھیں: کون سے ساکٹ محفوظ ہیں، ایپ کی کون سی ٹریفک خارج ہے، اور حفاظت ناکام ہونے پر ایپ کیا کرتی ہے۔ یہی سطر بعد کی ری فیکٹرنگ کو، صرف ایک ٹیسٹ ناکام ہونے پر، خارج کرنے کو پوری ایپ تک بڑھانے سے روکتی ہے۔ یہ اگلے شخص کو مینی فیسٹ کی ریورس انجینئرنگ کے بغیر ارادہ جانچنے کا طریقہ بھی دیتی ہے۔

متعلقہ مضامین