आपका Android ऐप सिस्टम VPN प्रोफ़ाइल क्यों नहीं जोड़ सकता
VpnService ऐसा टनल बनाता है जो आपके ऐप का है; यह फ़ोन की PPTP, L2TP या IPsec प्रविष्टियाँ जोड़ या संपादित नहीं कर सकता। सीमा पर चलें और सही रास्ता चुनें।
आप सेटिंग्स में VPN पंक्ति पर टैप करते हैं, कोई और जो प्रोफ़ाइल इंस्टॉल करता है उसे देखते हैं, और उसे जोड़ने वाली कॉल खोजने लगते हैं। ऐसी कोई कॉल नहीं है। ऐप VpnService के ज़रिए अपना खुद का टनल खोल सकता है, लेकिन उस सूची की प्रविष्टियाँ प्लेटफ़ॉर्म की हैं और उस क्लाइंट की हैं जिसने उन्हें बनाया। रेखा ठीक कहाँ है यह जानना आपको छिपी क्लासों के पीछे भागने से एक हफ़्ता बचाता है।
सेटिंग्स स्क्रीन जो दिखाती है उसी से शुरू करें
VPN सूची उन प्रोफ़ाइलों का रजिस्टर है जो सिस्टम या विक्रेता के क्लाइंट ने इंस्टॉल किए: PPTP, L2TP/IPsec, IKEv2, और वे पंक्तियाँ जो किसी OEM ऐप या MDM ने डाल दीं। हर पंक्ति में सर्वर पता, क्रेडेंशियल और प्रोटोकॉल का कार्यान्वयन होता है जो आपकी प्रक्रिया के बाहर रहता है। जब उपयोगकर्ता वहाँ कनेक्ट पर टैप करता है, टनल प्लेटफ़ॉर्म का क्लाइंट उठाता है, आपका कोड नहीं। इसीलिए वह पंक्ति रीबूट के बाद भी बनी रहती है और इसीलिए आपका ऐप अनइंस्टॉल करने से वह कभी नहीं हटती।
उपयोगकर्ता की तरफ़ से सूची API सतह जैसी लगती है, ऐसी जगह जहाँ VPN जोड़ना एक इंटेंट की दूरी पर होना चाहिए। ऐसा नहीं है। उसे छूने वाले अकेले सार्वजनिक प्रवेश बिंदु नेविगेशन इंटेंट हैं, और उसमें जो कुछ लिखता है वह प्लेटफ़ॉर्म या किसी विशेषाधिकार प्राप्त घटक का है।
व्यावहारिक परिणाम: अगर कोई सहायता पाठ उपयोगकर्ताओं से कहता है कि प्रोफ़ाइल सेटिंग्स में जोड़ें, तो आपका ऐप उस प्रवाह का हिस्सा ही नहीं है।
VpnService असल में आपको क्या देता है
VpnService और VpnService.Builder एक टनल का वर्णन करते हैं जो आपके ऐप का है। आप पते, रूट, DNS सर्वर और MTU जोड़ते हैं, addAllowedApplication() या addDisallowedApplication() से ट्रैफ़िक की सीमा तय करते हैं, और फिर establish() TUN इंटरफ़ेस के लिए ParcelFileDescriptor लौटाता है। उस क्षण से ऐप IP पैकेट पढ़ता है और जवाब लिखता है, यानी प्रोटोकॉल लागू करना या उसे शामिल करना आपका काम है: OpenVPN, WireGuard, कोई कस्टम ट्रांसपोर्ट।
उस क्रम में कुछ भी PPTP, L2TP/IPsec या IKEv2 नहीं बोलता। Builder में ऐसा कोई स्विच नहीं है जो कहे सिस्टम का L2TP क्लाइंट इस्तेमाल करो, और ऐसा कोई कॉलबैक नहीं है जो आपको प्लेटफ़ॉर्म के पहले से मौजूद प्रोफ़ाइल को चलाने दे। यही असली सीमा है, और यह अनुमतियों का अंतराल नहीं, डिज़ाइन की सीमा है।
इसलिए ऐप Android पर बिल्कुल VPN क्लाइंट हो सकता है। बस फ़ोन के साथ आने वाले क्लाइंट का प्रबंधक नहीं हो सकता।
सहमति संवाद सजावट नहीं है
चूँकि आपका टनल दूसरे ऐप्स का ट्रैफ़िक पकड़ सकता है, सिस्टम उपयोगकर्ता से उसकी स्पष्ट स्वीकृति लेता है। prepare() एक Intent लौटाता है जिसे आपको शुरू करना होता है, स्वीकृति आपके पैकेज से बँधी होती है, और जब तक टनल चालू है स्टेटस बार एक स्थायी संकेतक दिखाता है। दूसरा VPN ऊपर आते ही पहला निष्क्रिय हो जाता है, क्योंकि Android एक बार में एक ही सक्रिय VPN चलाता है।
एक-सक्रिय का यह नियम परीक्षण में लोगों को उलझाता है। आप अपना टनल तब उठाते हैं जब कोई कॉर्पोरेट क्लाइंट जुड़ा होता है और नतीजा निकालते हैं कि आपका कोड टूटा है, जबकि प्लेटफ़ॉर्म बस दूसरे क्लाइंट से हट गया। स्वीकृतियाँ बाद में रद्द हो सकती हैं, और जिन डिवाइसों में सहमति गतिविधि नहीं है वहाँ prepare() null लौटा सकता है, इसलिए establish() को अब भी विफलता संभालनी होती है।
छिपे API और सेटिंग्स इंटेंट
पुराने उत्तर com.android.internal क्लासों और AIDL इंटरफ़ेस की ओर इशारा करते हैं जिन्हें अंतर्निहित क्लाइंट इस्तेमाल करता है। वे SDK में नहीं हैं, रिलीज़ के बीच बिना सूचना बदलते हैं, और ऐप स्टोर उस पहुँच को जोखिम मानते हैं। डिवाइस को रूट करना भी उन्हें स्थिर नहीं बनाता, क्योंकि रूट और छिपे API तक पहुँच असंबंधित समस्याएँ हैं।
समर्थित नेविगेशन सहायक Settings.ACTION_VPN_SETTINGS है, जिसका मान android.net.vpn.SETTINGS है। शुरू करने से पहले उसे रिज़ॉल्व करें, क्योंकि कुछ OEM बिल्ड वह गतिविधि नहीं देते, और रिज़ॉल्व विफल होने पर लिखित चरणों पर जाएँ। यह उपयोगकर्ता को स्क्रीन तक ले जाता है और कुछ भी कॉन्फ़िगर नहीं करता।
डिवाइस-मालिक और MDM रास्ते वह अपवाद हैं जो लोग आम तौर पर मतलब रखते हैं। DevicePolicyManager हमेशा-चालू VPN पैकेज निर्दिष्ट कर सकता है, और प्रबंधित कॉन्फ़िगरेशन उस क्लाइंट के लिए सेटिंग्स पहले से लोड कर सकते हैं जो उन्हें समर्थन देता है, लेकिन यह अब भी सार्वजनिक SDK द्वारा PPTP प्रोफ़ाइल लिखना नहीं है।
उपयोगकर्ता की तरफ़ से निर्णय पर चलें
अगर आपके उत्पाद को ट्रैफ़िक ढोना है, तो VpnService के साथ असली प्रोटोकॉल स्टैक की योजना बनाएँ, और सहमति प्रवाह तथा एक-VPN नियम के लिए समय रखें। अगर लक्ष्य मौजूदा कॉर्पोरेट प्रोफ़ाइल से जुड़ना है, तो आपका काम मार्गदर्शन है: सेटिंग्स स्क्रीन पर डीप लिंक, फ़ील्ड का दस्तावेज़ीकरण, और टनलिंग प्लेटफ़ॉर्म क्लाइंट को करने दें। अगर ऐप को सिर्फ़ एक निजी एंडपॉइंट तक पहुँचना है, तो उसे अपना टनल बिल्कुल ज़रूरी नहीं है।
कोड लिखने से पहले वह निर्णय लिख लें, क्योंकि पहले स्प्रिंट के बाद तीनों रास्तों में लगभग कुछ भी साझा नहीं है।
शुरू करने से पहले आखिरी जाँच: आवश्यकता कहती है कि हमारा ऐप जुड़ता है या डिवाइस जुड़ता है? पहला VpnService है, दूसरा वह प्रोफ़ाइल है जिसे आप बना नहीं सकते। उस वाक्य को सही करना किसी भी रीफ़ैक्टरिंग से सस्ता है।