क्या iPhone VPN पर है? एक iOS ऐप असल में क्या देख सकता है
iOS SDK में कोई एक VPN फ़्लैग नहीं है। ऐप केवल अपना कॉन्फ़िगरेशन, एक स्थिति सूचना और सीमित दायरे का प्रॉक्सी स्नैपशॉट देख सकता है, इससे अधिक नहीं।
किसी iOS ऐप से पूछिए कि फ़ोन VPN पर है या नहीं, और ईमानदार जवाब यह है कि वह उस अर्थ में नहीं जान सकता जो आपका इरादा है। SDK «डिवाइस सुरंग में है» के लिए कोई फ़्लैग नहीं देता, और जो निजी इंटरफ़ेस उसके करीब पहुँच सकते थे, वे प्रकाशित होने वाले ऐप के लिए बंद हैं। आप अपने ऐप का अपना कॉन्फ़िगरेशन, उससे जुड़ी स्थिति, और नेटवर्क स्टैक से एक-दो अप्रत्यक्ष संकेत देख सकते हैं। हर एक अलग सवाल का जवाब देता है, और ज़्यादातर टूटी जाँचें इसी से आती हैं कि इनमें से किसी एक को पूरा जवाब मान लिया जाए।
एक ही VPN फ़्लैग का मिथक
मान्यता यह है कि SDK में कहीं कोई प्रॉपर्टी है जो बताती है कि डिवाइस सुरंग में है या नहीं, जैसे रीचेबिलिटी फ़्लैग बताता है कि कोई होस्ट जवाब दे रहा है या नहीं। ऐसी कोई सार्वजनिक प्रॉपर्टी नहीं है। और अगर होती भी, तो «सुरंग मौजूद है» और «मेरा ट्रैफ़िक उसका इस्तेमाल करता है» अलग दावे हैं, और ज़्यादातर ऐप के लिए सिर्फ़ दूसरा मायने रखता है।
यही खाई वह कारण है कि एक-पंक्ति VPN डिटेक्टर का विज्ञापन करने वाली लाइब्रेरी आमतौर पर कुछ नाज़ुक पढ़ती हैं, जैसे इंटरफ़ेस का नाम या प्रॉक्सी कुंजी, और उसे फ़ैसले के रूप में पेश करती हैं।
किसी nil पर भरोसा करने से पहले प्राथमिकताएँ लोड करें
साझा मैनेजर इंस्टेंस आपके माँगते ही मौजूद होता है, लेकिन उसकी प्रोटोकॉल प्रॉपर्टी लोड कॉलबैक पूरा होने तक nil रहती है। इसलिए nil प्रोटोकॉल का अर्थ «अभी लोड नहीं हुआ» कम से कम उतनी ही बार होता है जितनी बार «इंस्टॉल नहीं है»। पढ़ाई कम्प्लीशन ब्लॉक के अंदर करें, और तभी फ़ैसला करें: मौजूद प्रोटोकॉल ऑब्जेक्ट, जिसका इनेबल फ़्लैग चालू है, «इंस्टॉल» जैसा दिखता है।
दूसरा संकेत कनेक्शन ऑब्जेक्ट पर है: अमान्य स्थिति, जिसकी सूचना सिस्टम तब देता है जब इस ऐप का कोई कॉन्फ़िगरेशन इंस्टॉल न हो। पूरी लोड के बाद अमान्य स्थिति और nil प्रोटोकॉल साथ में असली अनुपस्थिति हैं, समय की दौड़ नहीं।
कनेक्शन बदलाव सूचनाओं के रूप में आते हैं
load और save को दिए गए हैंडलर बताते हैं कि कॉन्फ़िगरेशन के साथ क्या हुआ, यह नहीं कि सुरंग क्या कर रही है। कनेक्ट के समय उनमें से किसी के चलने का इंतज़ार ऐसी दौड़ है जो कभी नहीं सुलझती। इसके बजाय स्थिति-परिवर्तन की सूचना पर नज़र रखें, और जब वह आए तो कनेक्शन ऑब्जेक्ट का मौजूदा मान पढ़ें।
कॉन्फ़िगरेशन इंस्टॉल हो जाने के बाद कनेक्शन स्थिति एक छोटे क्रम से गुज़रती है: डिस्कनेक्टेड, कनेक्टिंग, कनेक्टेड, रीअसर्टिंग, डिस्कनेक्टिंग। «कनेक्टेड» सुरंग का वर्णन करता है, उसके पीछे के सर्वर का नहीं, इसलिए यह सबूत नहीं है कि ट्रैफ़िक बह रहा है। On-demand ऐप के सस्पेंड रहने पर भी सुरंग उठा सकता है, और तब सूचना उससे पहले आ जाती है जब आपके पास अपडेट करने को कुछ हो।
सीमित प्रॉक्सी स्नैपशॉट एक संकेत है, फ़ैसला नहीं
CFNetwork ऐप को सिस्टम की मौजूदा प्रॉक्सी सेटिंग्स दे सकता है, और उस परिणाम के अंदर इंटरफ़ेस नाम से कुंजीबद्ध एक सीमित शब्दकोश होता है। tun, utun, ppp, ipsec या tap से शुरू होने वाला नाम देखना इस बात का संकेत है कि सुरंग मौजूद है। यह इस ऐप के देख सकने का स्नैपशॉट ही रहता है, पैकेट कहाँ जाते हैं इसका बयान नहीं।
प्रदाता नामकरण पर सहमत नहीं हैं, इसलिए प्रीफ़िक्स का न होना कुछ साबित नहीं करता, और मौजूद इंटरफ़ेस बिना ट्रैफ़िक ढोए भी हो सकता है। रीचेबिलिटी और भी कमज़ोर है: निजी पते पर सफल अनुरोध दिखाता है कि उस पल उस अनुरोध के लिए रास्ता काम कर रहा था, यह नहीं कि VPN इंस्टॉल है।
सिम्युलेटर Mac उधार लेता है, और दूसरे ऐप अदृश्य रहते हैं
सिम्युलेटर का अपना कोई नेटवर्क स्टैक नहीं है; वह जो भी कनेक्शन बनाता है वह Mac का है। इसलिए होस्ट Mac पर चल रहा VPN सिम्युलेटेड ऐप के लिए पहले से लागू है, और सिम्युलेटर की अपनी सेटिंग्स कुछ नहीं दिखातीं। अगर सुरंग सिम्युलेटर शुरू होने के बाद उठी है, तो उसे फिर से शुरू करना आमतौर पर ऐप डीबग करने से तेज़ है। ग़ैर-मानक पोर्ट पर मौजूद होस्ट को वह पोर्ट URL में चाहिए, या socat TCP-LISTEN:12345,fork TCP:host:12345 जैसा स्थानीय फ़ॉरवर्ड चाहिए।
सार्वजनिक API दूसरे ऐप या कॉन्फ़िगरेशन प्रोफ़ाइल के VPN प्रोफ़ाइल की सूची नहीं देंगे। एक ज्ञात ऐप के लिए canOpenURL के ज़रिए URL स्कीम जाँच ही पोर्टेबल तरकीब है, और iOS 9 से पूछी गई स्कीम आपकी Info.plist में घोषित होनी चाहिए; अगर उसे छोड़ दें तो कॉल false लौटाता है। OpenVPN Connect openvpn:// पर जवाब देता है, जो उसे अच्छा उदाहरण और ख़राब सामान्य डिटेक्टर बनाता है।
तीन अवलोकन जोड़िए और बताइए उनका क्या अर्थ है
व्यवहार में तीन नतीजे इकट्ठे कीजिए: एक कॉन्फ़िगरेशन जो लोड हुआ और चालू है, एक कनेक्शन स्थिति जो अमान्य नहीं है, और ऐसे पते पर अनुरोध जहाँ सिर्फ़ सुरंग से पहुँचा जा सकता है। हर एक अकेला भ्रमित करता है; साथ में वे बताते हैं कि ऐप क्या जान सकता है, यह नहीं कि उपयोगकर्ता क्या मानता है।
नतीजे को अपने डायग्नोस्टिक्स में एक boolean के रूप में नहीं, तीन पंक्तियों के रूप में लिखें। जब उपयोगकर्ता कहे कि VPN बंद है और आपका ऐप सहमत न हो, तीन पंक्तियाँ दिखाती हैं कि कौन-सा अवलोकन अलग हुआ, और यही अंतर है उस सपोर्ट टिकट के बीच जिस पर आप कुछ कर सकते हैं और उसके जो «मेरे यहाँ चलता है» पर ख़त्म होता है।