VpnService protect() की ॲप वगळणे: राउटिंग काय दुरुस्त करते
टनेल वाहून नेणारे सॉकेट संरक्षित करा, किंवा संपूर्ण ॲप वगळा: तुमच्या Android VPN ला किती व्याप्ती हवी हे ठरवणाऱ्या तीन अटी।
टनेलचे स्वतःचे पॅकेट टनेलच्या बाहेर ठेवण्याचे दोन मार्ग आहेत: ट्रान्सपोर्ट सॉकेट संरक्षित करणे, किंवा संपूर्ण ॲप VPN मधून बाहेर काढणे। ते वेगवेगळ्या समस्या सोडवतात, आणि जोडणे सोपे म्हणून मोठी व्याप्ती निवडणे हाच तो मार्ग आहे ज्यात ॲप्स लक्ष न देता स्थानिक नेटवर्कचा प्रवेश आणि विभाजित DNS गमावतात। टनेलच्या बाहेर राहिले पाहिजे यापासून सुरुवात करा, नंतर ते साध्य करणारी सर्वात लहान व्याप्ती निवडा।
protect() टनेलमधून काय काढते
VpnService.protect() हे प्रति-सॉकेट कॉल आहे। टनेल वाहून नेणारे सॉकेट किंवा डिस्क्रिप्टर तुम्ही त्याला देता, आणि Android त्या सॉकेटला चिन्हांकित करते जेणेकरून त्याचा रहदारी VPN इंटरफेसऐवजी खालील नेटवर्क वापरेल। ॲप पाठवते ते बाकी सर्व सामान्य VPN मार्गाचे अनुसरण करते।
तीच अरुंद व्याप्ती मुद्दा आहे। संरक्षित सॉकेट तुमचा HTTP क्लायंट नावे कशी सोडवतो, तुमचे विश्लेषण कॉल कोणता इंटरफेस वापरतात, किंवा नंतर उघडणाऱ्या दुसऱ्या कनेक्शनचे काय होते हे बदलत नाही।
व्याप्ती ठरवणाऱ्या तीन अटी
पहिली अट अशी की फक्त टनेलचे ट्रान्सपोर्ट बाहेर पडायचे आहे का। ॲपचा उर्वरित रहदारी अजूनही VPN मधून जायचा असेल, तर सॉकेट संरक्षण हीच योग्य व्याप्ती आहे। दुसरी अट अशी की सॉकेट तयार करण्यावर तुमचे नियंत्रण आहे का। आत खोलवर स्वतःचे सॉकेट उघडणारी लायब्ररी तुम्हालाprotect() कॉल करण्याची जागा देत नाही, जोपर्यंत ती हुक देत नाही किंवा तयार सॉकेट स्वीकारत नाही। तिसरी अट अशी की ॲपला स्थानिक नेटवर्क किंवा captive portal थेट गाठायचे आहे का, जी टनेल जिवंत ठेवण्यापेक्षा वेगळी गरज आहे।
ॲपलाaddDisallowedApplication() ने वगळणे हे ढोबळ साधन आहे। ॲप करत असलेले प्रत्येक कनेक्शन VPN मधून काढून टाकते, तुम्हाला तपासायची असलेलीही, आणि काही उपकरणांवर स्थानिक शोधाचे वर्तनही बदलते।
तिसरा पर्याय म्हणजे ट्रान्सपोर्टला निवडलेल्या नेटवर्कशी बांधणे:bindProcessToNetwork() किंवा सॉकेट पातळीवरील नेटवर्क हँडलने। उपकरणाकडे एकाच वेळी Wi-Fi आणि मोबाइल असताना आणि टनेल ठराविक वरच्या मार्गाने जावे असे वाटत असल्यास हे उपयुक्त आहे।
ट्रान्सपोर्ट तयार होत असतानाच तो कॉल करा
कॉल कराprotect() ट्रान्सपोर्ट तयार करणाऱ्या त्याच ब्लॉकमध्ये,connect() किंवाsend() च्या आधी। कॉल false परत देत असल्यास सॉकेट बंद करा आणि सेटअप अयशस्वी करा; पुढे चालू ठेवल्यास पॅकेट तुमच्याच इंटरफेसमध्ये पुन्हा येऊ शकणारा ट्रान्सपोर्ट तुमच्याकडे राहतो।
आकार एकाच ठिकाणी ठेवण्याइतका लहान आहे:
DatagramSocket transport = new DatagramSocket();
if (!protect(transport)) {
transport.close();
throw new IOException("transport not protected");
}
transport.connect(serverAddress);येथे तीन तपशील चावतात। प्रथम,बुलियन हाच तुम्हाला मिळणारा एकमेव संकेत, म्हणून मागे घेतलेली संमती आणि नाकारलेला कॉल यात फरक करण्याइतक्या संदर्भासह अयशस्वी नोंदवा। दुसरे,protect() सॉकेट व्यापते, डिस्क्रिप्टर क्रमांक नाही: सॉकेट बंद करून नंतर तोच पूर्णांक दुसऱ्या सॉकेटसाठी वापरल्यास नवीन सॉकेट संरक्षित नसते। तिसरे, नेटिव्ह लायब्ररी ट्रान्सपोर्ट उघडत असल्यास नेटिव्ह कोड जोडण्यापूर्वी डिस्क्रिप्टर संरक्षित करा, अन्यथा मार्ग आधीच निवडला गेलेला असू शकतो।VpnService संदर्भ तुमची लक्ष्य API पातळी प्रत्यक्षात कोणते ओव्हरलोड देते हे तपासण्याची जागा आहे।
फक्त आनंदाचा मार्ग नाही, अडवलेला मार्गही तपासा
टनेल उभा असताना पडताळणी करा, कारण दोन्ही मार्ग वेगळे होऊ शकतात अशी तीच एकमेव अवस्था आहे। संरक्षित ट्रान्सपोर्टमधून एक विनंती आणिprotect() कधीही कॉल न केलेल्या कोड मार्गातून दुसरी पाठवा, नंतर दूरचे टोक काय पाहते ते तुलना करा: संरक्षित कनेक्शनने खालील नेटवर्क स्रोत म्हणून येणे अपेक्षित आहे, संरक्षण नसलेले टनेलचा स्वतःचा पत्ता दाखवते आणि टनेलचे बाइट काउंटर हलवते। उपकरणावर ss किंवाnetstat रेडिओतून काही बाहेर पडण्यापूर्वीच तेच विभाजन दाखवतात।
मागे घेण्याची चाचणी वेगळी करा, कारण संमतीतील बदल तुमच्या सॉकेट कोडला स्पर्श न करता इंटरफेस कोसळतो। VPN संमती मागे घ्या किंवा सेवा थांबवा, ट्रान्सपोर्ट पुन्हा तयार करा आणिprotect() अजूनही true परत देतो आणि संमती पुन्हा मिळाल्यावर ट्रान्सपोर्ट पुन्हा जोडतो याची खात्री करा।
संरक्षित विनंती तरीही टनेलचा पाठलाग करत असल्यास, संरक्षण कॉल सॉकेट आधीच राउट झाल्यानंतर होत असावा। तो आधी हलवा आणि पुन्हा तपासा।
निर्णय ट्रान्सपोर्ट सेटअपच्या शेजारी लिहून ठेवा: कोणती सॉकेट संरक्षित आहेत, कोणता ॲप रहदारी वगळला आहे, आणि संरक्षण अयशस्वी झाल्यास ॲप काय करते। तीच ओळ एक चाचणी अयशस्वी झाली म्हणून वगळणे संपूर्ण ॲपपर्यंत वाढवण्यापासून पुढील पुनर्रचनेला रोखते। ती पुढच्या व्यक्तीला मॅनिफेस्ट उलट अभियांत्रिकी न करता हेतू तपासण्याचा मार्गही देते।