Android पर हर ऐप के लिए VPN: किसी ऐप को बाहर रखना उसे ब्लॉक करना नहीं है
स्क्रीन पर दिखने वाली प्रति-ऐप सूची किसी एक टनल मालिक की है, और किसी ऐप को बाहर रखना उसे उस टनल के इर्द-गिर्द भेजता है, न कि नेटवर्क से बाहर। वहीं से शुरू करें।
दो लोग एक ही सवाल पूछते हैं और एक-दूसरे से मेल न खाने वाले जवाब पाते हैं, क्योंकि वे अलग-अलग जगह खड़े हैं। एक के पास सिस्टम की VPN सेटिंग्स स्क्रीन खुली है और वह ऐप्स की सूची संपादित कर रहा है। दूसरा एडिटर में VpnService.Builder.addDisallowedApplication() लिख रहा है। दोनों इसे प्रति-ऐप VPN फ़िल्टर कहते हैं। इनमें से केवल एक के पास वह नियंत्रण है जिसका वे वर्णन कर रहे हैं, और इनमें से कोई कुछ भी ब्लॉक नहीं कर रहा है।
उसी स्क्रीन से शुरू करें जो उपयोगकर्ता देखता है
सेटिंग्स खोलें, VPN प्रविष्टि खोजें और उस कनेक्शन को देखें जो वास्तव में सक्रिय है। अगर क्लाइंट प्रति-ऐप सूची देता है, तो वह सूची क्लाइंट की अपनी टनल की है। प्लेटफ़ॉर्म ऐसा कोई सामान्य API प्रकाशित नहीं करता जिसके ज़रिए कोई असंबंधित ऐप किसी दूसरे VPN के ऐप चयन को पढ़ या बदल सके, इसलिए दूसरा ऐप उपयोगकर्ता के लिए उस सूची को ठीक नहीं कर सकता।
यह इस यात्रा का पहला द्वार है। अगर इंस्टॉल किए गए VPN में ऐसी सेटिंग नहीं है, तो उसके इर्द-गिर्द कोड करने को कुछ नहीं है: वह सुविधा उस उत्पाद में ही नहीं है जो टनल का मालिक है। अगर है, तो सही सुधार उसी स्क्रीन में है, और वह उसी व्यक्ति द्वारा किया जाएगा जो उसे खोल सकता है।
पैकेट का पीछा टनल तक करें
जब आपका अपना ऐप कोई टनल बनाता है, तो वह एक TUN इंटरफ़ेस बनाता है और घोषित करता है कि किन ऐप्स का ट्रैफ़िक उसमें जाता है। सदस्यता कॉल इंटरफ़ेस बनने से पहले होते हैं, और उसके बाद उस सत्र के लिए नियम-समूह स्थिर रहता है:
val builder = VpnService.Builder()
builder.addAddress("10.8.0.2", 32)
builder.addRoute("0.0.0.0", 0)
builder.addDisallowedApplication("com.example.bypass")
val tun = builder.establish() // membership decided hereवे कॉल केवल उसी टनल पर लागू होते हैं जो आपके ऐप ने अभी बनाया है, और किसी और चीज़ पर नहीं। वे पूरे डिवाइस की नीति नहीं हैं, वे दूसरे क्लाइंट के लिए बनी नहीं रहतीं, और वे किसी और के VPN तक नहीं पहुँच सकतीं। जब पैकेट हल न हो पाने के कारण बिल्डर की कोई कॉल अपवाद फेंकती है, तो इंटरफ़ेस कभी नहीं बनता, जो एक साफ़ विफलता है, चुपचाप होने वाली नहीं।
बहिष्कार ब्लॉक जैसा क्यों लगा
बाहर रखा गया ऐप आपकी टनल के इर्द-गिर्द नीचे के नेटवर्क पर भेजा जाता है। यह उसे ब्लॉक करने का उल्टा है: ट्रैफ़िक अब भी डिवाइस से बाहर जाता है, बस उस इंटरफ़ेस से बाहर जो आप नियंत्रित करते हैं। फ़ायरवॉल जैसा ऐप उल्टा करता है। वह ऐप के ट्रैफ़िक को अपनी टनल में लेता है और फिर पैकेट गिरा देता है, या उन्हें आगे भेजने से मना कर देता है, इसलिए इंटरफ़ेस वही रहता है और नीति की दिशा उलट जाती है।
उस उलटाव के पीछे का काम कोई कॉन्फ़िगरेशन फ़्लैग नहीं है। आप टनल डिस्क्रिप्टर से IP पैकेट पढ़ते हैं, प्रवाह के अनुसार निर्णय लेते हैं, और या तो उन्हें सुरक्षित सॉकेट से आगे भेजते हैं या गिरा देते हैं। जिसे आप नहीं संभालते वह बस रुक जाता है, और इसीलिए अधूरी टनल टूटे हुए नेटवर्क जैसी दिखती है, काम करने वाले फ़िल्टर जैसी नहीं। अगर आपका लक्ष्य ब्लॉक है, तो पैकेट प्रबंधन, फ़ोरग्राउंड सेवा और उस ट्रैफ़िक के लिए लिखित नीति का बजट रखें जिसे आप वर्गीकृत नहीं कर सकते।
जब आप इसे खुद बनाते हैं तो क्या टूटता है
Android आम तौर पर एक समय में एक ही सक्रिय VPN की अनुमति देता है, इसलिए आपकी फ़िल्टर करने वाली टनल और एक गोपनीयता टनल उसी जगह के लिए होड़ करती हैं, जब तक कि उत्पाद चेनिंग का समर्थन न करें। कनेक्शन ब्लॉक करने वाला हमेशा-चालू VPN विफलता का तरीका ऐसे बदलता है जो यहाँ मायने रखता है: जो ट्रैफ़िक टनल में नहीं जा सकता वह सीधे भेजे जाने के बजाय गिरा दिया जाता है, और यही लीक-रोकथाम डिज़ाइन चाहता है और डिबगिंग सत्र शायद ही कभी अपेक्षा करता है।
पैकेट दृश्यता दूसरा जाल है। किसी ऐप का पैकेज नाम हल करना NameNotFoundException के साथ विफल हो सकता है, और नए Android संस्करणों पर आप जो पैकेज देख सकते हैं वह उन क्वेरीज़ पर निर्भर करता है जिन्हें आपने घोषित किया है। हर नाम के हल हो जाने की धारणा के बजाय अपवाद को संभालें, और ऐप्स के इंस्टॉल या हटाए जाने पर सूची को दोबारा पढ़ें, उसे हमेशा के लिए कैश में रखने के बजाय।
प्रबंधित डिवाइस एक तीसरा मालिक जोड़ते हैं. एंटरप्राइज़ मोबिलिटी नीति प्रति-ऐप VPN या हमेशा-चालू प्रोफ़ाइल सेट कर सकती है, और कोई साधारण ऐप उसे ओवरराइड नहीं कर सकता। अपने कोड को डिबग करने से पहले जाँचें कि डिवाइस प्रबंधित है या नहीं, क्योंकि उस स्थिति में जिस सूची को आप बदलना चाहते हैं, वह शायद फ़ोन रखने वाले किसी भी व्यक्ति द्वारा संपादित न हो सके।
इसे किसी ऐसे ऐप से परखें जिसे आप नियंत्रित करते हैं
जिस ऐप को आप फ़िल्टर करना चाहते हैं, उससे परीक्षण न करें। ऐसा दूसरा ऐप लें जिसका नेटवर्क व्यवहार आप देख सकें, और जाँचें कि उसका ट्रैफ़िक आपकी टनल से बाहर जाता है जबकि लक्ष्य का नहीं जाता। अगर दोनों अंदर रहें, तो नीति काम कर रही है और लक्ष्य बाहर रखा गया है; अगर कोई भी बाहर न जाए, तो टनल ही गलत है और ऐप सूची समस्या नहीं है।
फिर तय करें कि आप वास्तव में तीन में से क्या बना रहे हैं। प्रति-ऐप टनल बिल्डर API है, जिसमें सूची आपकी प्रोफ़ाइल का हिस्सा है। डिवाइस फ़ायरवॉल पैकेट प्रबंधन और एक ऐसा जीवनचक्र है जिसे आप उचित ठहरा सकें। किसी और का VPN बदलना कोई समर्थित रास्ता ही नहीं है, और वहाँ ईमानदार जवाब यह है कि वह सेटिंग उसी उत्पाद की है।