اینڈرائیڈ VPN ٹنل سے سب نیٹ کو کیسے خارج کریں
VpnService کسی راستے کو خارج نہیں کر سکتا، اس لیے آپ تکمیلی حصہ شامل کرتے ہیں: /8 کے لیے آٹھ تیار کردہ سابقے، ساتھ ہی IPv6، DNS اور تلاش کی جانچ جو باقی کو پکڑتی ہے۔
اینڈرائیڈ کے VpnService میں خارج کرنے کا کوئی راستہ نہیں، اور API پڑھنے کی کوئی مقدار ایک بھی پیدا نہیں کرے گی۔ Builder.addRoute() ٹنل میں ہمیشہ صرف منزلیں شامل کرتا ہے، اس لیے LAN کے کسی حصے کو مقامی رکھنے کا مطلب یہ ہے کہ وہ حصہ کبھی راستوں کی فہرست میں داخل نہیں ہوتا۔ اس کے بجائے آپ حصے کا تکمیلی حصہ شامل کرتے ہیں، جو عام سابقوں کی صورت میں بیان ہوتا ہے۔ کام حساب ہے، اور یہ چند متوقع جگہوں پر ناکام ہوتا ہے۔
نیچے دی گئی جانچ ترتیب سے کریں۔ ہر ایک یہ مانتی ہے کہ پچھلی قائم رہی، اس لیے نیچے علامات کو پیوند کرنے کے بجائے پہلی ناکامی پر رک جائیں۔
ٹنل جو دعویٰ کرتا ہے اسی سے شروع کریں
0.0.0.0/0 کو addRoute() میں دینا اینڈرائیڈ کو بتاتا ہے کہ ہر IPv4 منزل ٹنل کی ہے۔ اسی لیے بہت سے کلائنٹ تقسیم شدہ ٹنلنگ سے قاصر دکھتے ہیں: وہ پورے پتے کی جگہ کا دعویٰ کرتے ہیں اور پھر اس میں سے تفریق کرنے کی کوشش کرتے ہیں۔ بنانے والے میں کچھ بھی تفریق نہیں کرتا۔ جس نیٹ ورک کو آپ مقامی رکھنا چاہتے تھے اس کے لیے زیادہ مخصوص راستہ لوگوں کی توقع کے برعکس کرتا ہے، کیونکہ سب سے لمبا مماثل سابقہ جیتتا ہے اور وہ نیٹ ورک ٹنل کے اندر آ جاتا ہے۔
راستوں کی فہرست ہی پوری پالیسی ہے۔ اس کے پیچھے ہر منزل کے لیے ویٹو نہیں، اور Builder حوالہ ایسا کوئی طریقہ نہیں بتاتا جو ایک دے۔
سابقوں کے حساب سے تکمیلی حصہ بنائیں
خارج شدہ سابقے کا تکمیلی حصہ پتوں کے درخت کی جڑ تک کے راستے پر اس کے بہن بھائیوں کا مجموعہ ہے۔ 1 سے خارج شدہ لمبائی تک ہر لمبائی کے لیے، وہ بلاک لیں جس میں آپ کا سابقہ ہے، سابقے کے بالکل نیچے والا بٹ پلٹیں اور نتیجہ دیں۔ جب تک آپ اسے چلا نہیں لیتے یہ تجریدی سنائی دیتا ہے۔
10.0.0.0/8 کو خارج کرنے سے آٹھ راستے ملتے ہیں: 128.0.0.0/1، 64.0.0.0/2، 32.0.0.0/3، 16.0.0.0/4، 0.0.0.0/5، 12.0.0.0/6، 8.0.0.0/7، 11.0.0.0/8۔ ان میں سے کوئی 10.0.0.0/8 نہیں رکھتا، اور مل کر وہ باقی سب ڈھانپ لیتے ہیں۔
آٹھ سطریں کسی بھی سابقے کے لیے وہ فہرست بناتی ہیں:
import ipaddress
def complement(addr, length):
base = int(ipaddress.IPv4Address(addr))
out = []
for k in range(1, length + 1):
block = base & (0xFFFFFFFF << (32 - k))
sibling = block ^ (1 << (32 - k))
out.append(f"{ipaddress.IPv4Address(sibling)}/{k}")
return out
print(complement("10.0.0.0", 8))
راستوں کی تعداد سابقے کی لمبائی کے برابر ہوتی ہے، اور یہی وہ تعداد ہے جس پر نظر رکھنی ہے۔ ایک /21 خارج کرنا 21 راستوں کا خرچ لاتا ہے اور پڑھنے کے قابل رہتا ہے۔ دس خارج کرنے چند سو کا خرچ لا سکتے ہیں، جس کا مطلب عام طور پر یہ ہے کہ نیٹ ورک کا ڈیزائن بدلنا ہے، جنریٹر نہیں۔
پتے کا خاندان اور ٹنل کا دائرہ جانچیں
IPv4 راستے IPv6 کے لیے کچھ نہیں کرتے۔ اگر ٹنل IPv6 پتہ دعویٰ کرتا ہے، تو IPv6 LAN سابقے کو اپنا تکمیلی حصہ درکار ہے، جو 128 بٹس پر اسی حساب سے بنایا جاتا ہے۔ کاغذ پر خارج کرنا کام کرنے مگر مقامی آلہ ناقابل رسائی رہنے کی ایک عام وجہ یہ ہے: میزبان تک IPv6 کے ذریعے پہنچا گیا، اور صرف IPv4 کاٹا گیا تھا۔ حساب غلط ہے یہ نتیجہ نکالنے سے پہلے دونوں خاندان جانچیں۔
دائرہ جانچ کا دوسرا نصف ہے۔ اینڈرائیڈ نیٹ ورک اور ایپ کے حساب سے راستہ بندی کا سراغ رکھتا ہے، اس لیے وہی سابقہ ایک ایپ کے لیے ٹنل سے اور دوسری کے لیے سیدھا جا سکتا ہے، اس پر منحصر کہ VPN کیسے اعلان کیا گیا۔
DNS اور فی ایپ قواعد کو ان کی جگہ رکھیں
راستے خارج کرنا حل کرنے والا نہیں بدلتا۔ مقامی میزبان نام اب بھی ٹنل کے DNS سرور سے جواب پا سکتا ہے جبکہ اس کا پتہ مقامی طور پر راستہ بند ہوتا ہے، اور عدم مطابقت ایسے نام کی صورت میں ظاہر ہوتی ہے جو ایسی چیز میں حل ہوتا ہے جہاں LAN نہیں پہنچ سکتا۔ حل کرنے والے کی پالیسی جان بوجھ کر مقرر کریں، تلاش کے ڈومین یا منقسم DNS قاعدے کے ساتھ۔ یہ مت مانیں کہ راستوں نے یہ آپ کے لیے طے کر دیا۔
addDisallowedApplication() ایک ایپ کو ٹنل سے باہر رکھتا ہے؛ اندر رہنے والی ایپس کے لیے منزل باہر نہیں رکھتا۔ protect() آپ کے کھولے ہوئے ساکٹ کو ٹنل سے بچنے دیتا ہے، اور اسی طرح ٹنل اپنی ہی ترسیل کو پکڑنے سے بچتی ہے۔ دونوں میں سے کوئی تکمیلی حصے کا نعم البدل نہیں۔
اپنی فہرست سے نہیں، تلاش سے تصدیق کریں
ٹنل کے قائم ہونے کے بعد، اپنی بنائی ہوئی فہرست دوبارہ پڑھنے کے بجائے آلے سے پوچھیں کہ پتہ واقعی کہاں جاتا ہے۔ iproute2 والی بلڈ پر، adb shell ip route get 10.1.2.3 اس انٹرفیس کا نام بتاتا ہے جو کرنل نے چنا۔ عوامی پتے کے لیے وہی حکم چلائیں اور تصدیق کریں کہ یہ ٹنل کا نام بتاتا ہے۔
مزید دو جانچیں چکر بند کرتی ہیں۔ پہلے مقامی نام حل کریں، پھر حل شدہ پتے پر adb shell ip route get چلائیں اور ایسا انٹرفیس مانگیں جو ٹنل نہ ہو، کیونکہ کامیاب adb shell ping -c 1 host.lan رسائی ثابت کرتا ہے، راستہ نہیں۔ اگر ٹنل ایک دعویٰ کرے تو IPv6 پر پتہ خاندان کا امتحان دہرائیں۔ اسی API سطح پر جانچیں جو آپ بھیجتے ہیں، کیونکہ VPN نیٹ ورک راستہ بندی جدول کے سامنے کیسے آتے ہیں یہ ریلیز کے ساتھ بدلا ہے۔ کاغذ پر درست دکھنے والی راستوں کی فہرست اور غلط انٹرفیس چننے والی تلاش مختلف بگ ہیں، اور صارفین تک صرف دوسرا پہنچتا ہے۔
اگر خارج کرنے کی فہرست بڑھتی رہے، تو راستے بنانا بند کریں اور دور دراز نیٹ ورک کو دوبارہ نمبر دیں یا اس کے بجائے ٹنل کو تنگ کریں۔ جنریٹر غائب API کے لیے ایک راستہ ہے، ڈیزائن کا آلہ نہیں۔