سینڈ باکس شدہ Mac ایپ کے اندر فعال VPN کی شناخت
اس سوال کے لیے کوئی عوامی API نہیں ہے، اور انٹرفیس کے نام کی ترکیب محض ایک ہیورسٹک ہے۔ چھ جانچیں تاکہ فیصلہ کر سکیں کہ آپ کی ایپ کو واقعی کس چیز پر انحصار کرنا چاہیے۔
آپ کو ایک اسکرین چاہیے جو ٹنل فعال ہونے پر مختلف برتاؤ کرے، اور ایسی کوئی کال نہیں جو آپ کو یہ بتائے۔ یہی شپنگ حد ہے: macOS پر کوئی عوامی فریم ورک یہ نہیں بتاتا کہ کوئی بھی VPN منسلک ہے یا نہیں، اور iOS پر حالت اُس ایپ کی ہے جس نے کنفیگریشن انسٹال کی۔ نیچے دی گئی جانچیں اِس حد سے اُس چیز تک لے جاتی ہیں جو آپ شپ کر سکتے ہیں، اور اِن میں سے کوئی بھی تلاش کو جلدی ختم کر سکتی ہے۔
جانچ 1: کیا اِس سوال کا جواب دینا ممکن ہے؟
سینڈ باکس کسی بھی API سے پہلے سوال کا فیصلہ کر دیتا ہے۔ تیسرے فریق کا عمل دوسرے وینڈر کی ایکسٹینشن شمار نہیں کر سکتا، اور اُس ایکسٹینشن کی کنفیگریشن بھی نہیں پڑھ سکتا، اس لیے پوچھنے کے لیے کوئی معاون چیز نہیں ہے۔
ہر بائی پاس ایک ہی دیوار سے ٹکراتا ہے۔ انٹرفیس کی فہرستیں، scutil --nc list اور نظام کی کنفیگریشن کی براہِ راست قرأت یا تو وہ اجازتیں مانگتی ہیں جو سینڈ باکس روک لیتا ہے یا اُس رویے پر منحصر ہیں جس کا Apple نے کبھی وعدہ نہیں کیا۔ اگر منصوبے کو اِن میں سے کوئی چیز درکار ہو تو مسئلہ منصوبہ ہی ہے۔ غیر دستاویزی تفصیل پر بنی خصوصیت ترسیل کی تاریخ والا سپورٹ ٹکٹ ہے۔
جانچ 2: کیا آپ کی ایپ خود ٹنل کا انتظام کرتی ہے؟
اگر ہاں، تو آپ کی اپنی کنفیگریشن کے لیے معاون جواب موجود ہے۔ ترجیحات لوڈ کریں، خرابی سنبھالیں، پھر حالت پڑھیں اور پولنگ کے بجائے تبدیلیوں کی رکنیت لیں:
vpnManager.loadFromPreferences { error in
// handle a load failure before reading status
}
NotificationCenter.default.addObserver(
forName: .NEVPNStatusDidChange,
object: nil,
queue: nil
) { note in
let status = (note.object as? NEVPNConnection)?.status
}اِس بارے میں درست رہیں کہ یہ کیا واپس کرتا ہے: اُس ٹنل کی حالت جو آپ نے انسٹال کی۔ دوسرا کلائنٹ چلانے والا صارف منقطع دکھائی دے گا، اور یہ آپ کے کوڈ میں کوئی خرابی نہیں۔ جواب پر تعمیر کرنے سے پہلے فیصلہ کریں کہ آپ کی خصوصیت اِن دو سوالوں میں سے کون سا واقعی پوچھ رہی ہے۔
جانچ 3: ایک ہیورسٹک واقعی آپ کو کیا بتائے گا؟
بڑے پیمانے پر نقل کیا گیا طریقہ نظام کی پراکسی ڈکشنری سے اُس کے دائرہ کار والے اندراجات پوچھتا ہے اور چابیاں پڑھتا ہے، جو اتفاقاً انٹرفیس کے نام ہوتے ہیں:
let settings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as NSDictionary?
let scoped = settings?["__SCOPED__"] as? [String: Any]
let names = scoped?.keys ?? []وہ چابی جو tap، tun، ppp، ipsec یا utun سے شروع ہو، ظاہر کرتی ہے کہ ٹنل کے دائرہ کار والا انٹرفیس موجود ہے۔ پورا نام ملانا فوراً ناکام ہو جاتا ہے، کیونکہ iOS 12 utun1 اور utun2 کے ساتھ آیا اور کچھ پروفائل ipsec4، ppp0 یا utun0 کے طور پر ظاہر ہوتے ہیں۔ اِس کے بجائے سابقے موازنہ کریں۔
پھر بھی نام کسی مالک کی شناخت نہیں کرتا۔ نظام کی خصوصیات اور دوسرے وینڈروں کی ایکسٹینشنز بھی utun انٹرفیس بناتی ہیں، اور ایک ایسا بھی ہو سکتا ہے جو آپ کے ٹریفک کا کچھ بھی نہ لے جائے۔ اِسے اِس اشارے کے طور پر پڑھیں کہ قریب ٹنل کی شکل کی کوئی چیز ہے، اِس سے زیادہ نہیں۔ یہاں غلط مثبت سستا ہے اگر آپ صرف ایک خصوصیت کو گیٹ کریں، اور مہنگا ہے اگر لاگ اِن اسکرین کو گیٹ کریں۔
جانچ 4: کیا آپ اِس کے بجائے منزل کی جانچ کر سکتے ہیں؟
اگر ایپ کو صرف یہ جاننا ہے کہ کوئی داخلی سروس قابلِ رسائی ہے یا نہیں، تو اُس سروس کی جانچ کریں۔ ٹائم آؤٹ کے ساتھ ایک مختصر پروب اُس سوال کا جواب دیتا ہے جس پر خصوصیت واقعی منحصر ہے، اور صارف کے کلائنٹ بدلنے یا ٹنل کی شکل بدلنے پر بھی کام کرتا ہے۔
رسائی کا امکان آپ کے راستے کے بارے میں ایک مشاہدہ ہے۔ انٹرفیس کا نام آپ کے راستے سے متصل کسی چیز کے بارے میں ایک اندازہ ہے، اسی لیے ہیورسٹک بگ رپورٹس میں بحث پیدا کرتا ہے اور پروب ثبوت۔ اگر صارف کے VPN فعال ہونے پر اصرار کے باوجود پروب ناکام ہو، تو اب ڈی بگ کرنے کے لیے آپ کے پاس مخصوص راستہ ہے: نام کی تحلیل، راستہ یا سروس کی اجازت۔
جانچ 5: کیا پلیٹ فارم وہ نافذ کر سکتا ہے جو آپ کو درکار ہے؟
جب تقاضا یہ ضمانت ہو کہ ٹنل سے کچھ نہیں نکلے گا، تو پروفائل اُس کی جگہ ہے، ڈیٹیکٹر نہیں۔ includeAllNetworks کو iOS 14 یا بعد کے ورژن میں مکمل ٹنل کنفیگریشن میں فعال کرنا آپ کی ایپ سے اندازہ لگانے کو کہنے کے بجائے پلیٹ فارم کا رویہ بدل دیتا ہے۔ یہ پرچم NEVPNProtocol حوالہ میں دستاویزی ہے۔
یہ ایک مختلف قسم کا جواب ہے: مشاہدے کے بجائے نفاذ۔ یہ بھی صرف اُن پروفائلوں پر لاگو ہوتا ہے جو آپ کنٹرول کرتے ہیں، اس لیے کسی اور کی ٹنل دیکھنے والی صارف ایپ کی مدد نہیں کرتا۔
جانچ 6: ناکامی کو محفوظ اور قابلِ مشاہدہ بنائیں
صرف اُس صلاحیت کو بند کریں جسے ٹنل درکار ہے اور ایپ کا باقی حصہ قابلِ استعمال رکھیں۔ جو ڈیٹیکٹر یقین نہ ہونے پر پورا انٹرفیس چھپا دیتا ہے، وہ ہر اُس شخص کے لیے رکاوٹ پیدا کرتا ہے جس کی ٹنل ایسا نام استعمال کرتی ہے جس کا آپ نے کبھی گمان نہیں کیا۔ اِس کے بجائے قدامت پسندانہ رویے پر واپس جائیں: مقامی خصوصیات کام کرتی رہتی ہیں اور صرف وہی دور دراز کال غیر فعال ہوتی ہے جسے واقعی ٹنل درکار ہے۔ یہ انتخاب ایک مصنوعاتی فیصلہ ہے، اور یہ ہیورسٹک کے ساتھ لکھے جانے کے لائق ہے۔
جو آپ نے مشاہدہ کیا اُسے لاگ کریں: انٹرفیس کے نام، پلیٹ فارم ورژن اور ایک پروب کا نتیجہ۔ یہ اگلی رپورٹ کو بحث سے جانچ میں بدل دیتا ہے۔ پھر جہاں معاون اعلان ہو وہاں اُسے ترجیح دیں، کیونکہ زیرِ انتظام کنفیگریشن ارادے کو واضح طور پر اٹھا سکتی ہے اور نام جانچنے کی زیادہ تر وجہ ہٹا سکتی ہے۔
اگر 1 سے 5 تک کی جانچوں نے آپ کو معاون جواب کے بغیر چھوڑ دیا، تو پروب شپ کریں اور نتیجے کو دیانتداری سے لیبل کریں۔ دستاویزی بہترین کوشش کا اشارہ اگلی ریلیز میں ٹوٹنے والے نجی API سے بہتر مصنوعاتی فیصلہ ہے۔