Android VPN बोगद्यातून सबनेट कसा वगळायचा
VpnService मार्ग वगळू शकत नाही, म्हणून तुम्ही पूरक जोडता: /8 साठी तयार केलेले आठ प्रीफिक्स, शिवाय उर्वरित पकडणार्या IPv6, DNS आणि शोध तपासण्या।
Android च्या VpnService मध्ये वगळण्याचा मार्ग नाही, आणि API वाचण्याच्या कोणत्याही प्रमाणात तो तयार होणार नाही। Builder.addRoute() बोगद्यात नेहमी फक्त गंतव्ये जोडतो, म्हणून LAN विभाग स्थानिक ठेवणे म्हणजे तो विभाग कधीही मार्ग यादीत येत नाही। त्याऐवजी तुम्ही विभागाचा पूरक जोडता, जो सामान्य प्रीफिक्स म्हणून व्यक्त केला जातो। काम अंकगणित आहे, आणि ते काही अंदाज करण्यायोग्य ठिकाणी अयशस्वी होते।
खालील तपासण्या क्रमाने करा। प्रत्येक मागील टिकली असे गृहीत धरते, म्हणून खालील लक्षणे डागाळण्याऐवजी पहिल्या अपयशावर थांबा।
बोगदा काय दावा करतो त्यापासून सुरुवात करा
0.0.0.0/0 addRoute() ला देणे Android ला सांगते की प्रत्येक IPv4 गंतव्य बोगद्याचे आहे। म्हणूनच इतके क्लायंट विभाजित बोगद्यासाठी अक्षम दिसतात: ते संपूर्ण पत्ता जागा दावा करतात आणि नंतर त्यातून वजा करण्याचा प्रयत्न करतात। बांधणीत काहीही वजा करत नाही। जे नेटवर्क तुम्हाला स्थानिक ठेवायचे होते त्यासाठी अधिक विशिष्ट मार्ग लोक अपेक्षित असलेल्याच्या उलट करतो, कारण सर्वात लांब जुळणारा प्रीफिक्स जिंकतो आणि ते नेटवर्क बोगद्याच्या आत येते।
मार्ग यादी हीच संपूर्ण धोरण आहे। तिच्या मागे प्रत्येक गंतव्यासाठी व्हिटो नाही, आणि Builder संदर्भ असा कोणताही पद्धत सूचीबद्ध करत नाही जो एक देईल।
प्रीफिक्स अंकगणितातून पूरक तयार करा
वगळलेल्या प्रीफिक्सचा पूरक म्हणजे पत्ता वृक्षाच्या मुळापर्यंतच्या मार्गावरील त्याच्या भावंडांचा संच। 1 ते वगळलेल्या लांबीपर्यंत प्रत्येक लांबीसाठी, तुमचा प्रीफिक्स असलेला त्या लांबीचा ब्लॉक घ्या, प्रीफिक्सच्या लगेच खालील बिट फिरवा आणि निकाल द्या। तुम्ही तो चालवेपर्यंत तो अमूर्त वाटतो।
10.0.0.0/8 वगळल्यास आठ मार्ग मिळतात: 128.0.0.0/1, 64.0.0.0/2, 32.0.0.0/3, 16.0.0.0/4, 0.0.0.0/5, 12.0.0.0/6, 8.0.0.0/7, 11.0.0.0/8। त्यापैकी कोणताही 10.0.0.0/8 धारण करत नाही, आणि एकत्र ते बाकी सर्व व्यापतात।
आठ ओळी कोणत्याही प्रीफिक्ससाठी ती यादी तयार करतात:
import ipaddress
def complement(addr, length):
base = int(ipaddress.IPv4Address(addr))
out = []
for k in range(1, length + 1):
block = base & (0xFFFFFFFF << (32 - k))
sibling = block ^ (1 << (32 - k))
out.append(f"{ipaddress.IPv4Address(sibling)}/{k}")
return out
print(complement("10.0.0.0", 8))
मार्गांची संख्या प्रीफिक्स लांबीइतकी असते, आणि तीच लक्ष ठेवायची संख्या आहे। एक /21 वगळणे 21 मार्ग खर्च करते आणि वाचनीय राहते। दहा वगळण्यांना काही शंभर खर्च येऊ शकतो, ज्याचा अर्थ सहसा जनरेटर नव्हे तर नेटवर्क रचना बदलावी लागते।
पत्ता कुटुंब आणि बोगद्याची व्याप्ती तपासा
IPv4 मार्ग IPv6 साठी काहीही करत नाहीत। जर बोगदा IPv6 पत्ता दावा करत असेल, तर IPv6 LAN प्रीफिक्सला स्वतःचा पूरक आवश्यक आहे, जो 128 बिटवर त्याच अंकगणिताने तयार होतो। कागदावर वगळणे काम करते पण स्थानिक उपकरण पोहोचाबाहेर राहते याचे सामान्य कारण हे आहे: यजमानापर्यंत IPv6 ने पोहोचले गेले, आणि फक्त IPv4 कापले गेले। अंकगणित चुकीचे आहे असा निष्कर्ष काढण्यापूर्वी दोन्ही कुटुंबे तपासा।
व्याप्ती ही तपासणीची दुसरी अर्धी आहे। Android नेटवर्कनुसार आणि ॲपनुसार मार्गनिर्देशन मागोवा घेते, म्हणून तोच प्रीफिक्स एका ॲपसाठी बोगद्यातून आणि दुसर्यासाठी थेट जाऊ शकतो, VPN कसा जाहीर केला यावर अवलंबून।
DNS आणि प्रत्येक ॲपचे नियम योग्य ठिकाणी ठेवा
मार्ग वगळणे रिझोल्व्हर बदलत नाही। स्थानिक यजमाननाव अजूनही बोगद्याच्या DNS सर्व्हरकडून उत्तर मिळवू शकते, तर त्याचा पत्ता स्थानिकरीत्या मार्गित होतो, आणि विसंगती LAN पोहोचू शकत नाही अशा गोष्टीत सोडवल्या जाणार्या नावाप्रमाणे दिसते। रिझोल्व्हर धोरण जाणीवपूर्वक ठेवा, शोध डोमेन किंवा विभाजित DNS नियमासह। मार्गांनी तुमच्यासाठी हे ठरवले असे गृहीत धरू नका।
addDisallowedApplication() एक ॲप बोगद्याबाहेर ठेवतो; आत राहणार्या ॲपसाठी गंतव्य बाहेर ठेवत नाही। protect() तुम्ही उघडलेल्या सॉकेटला बोगदा टाळू देतो, आणि अशा प्रकारे बोगदा स्वतःचे वहन पकडणे टाळतो। दोन्हीपैकी कोणतेही पूरक बदलत नाही।
स्वतःच्या यादीने नव्हे, शोधाने पडताळा
बोगदा वर आल्यावर, तुम्ही बनवलेली यादी पुन्हा वाचण्याऐवजी पत्ता प्रत्यक्षात कुठे जातो हे उपकरणाला विचारा। iproute2 सह येणार्या बिल्डवर, adb shell ip route get 10.1.2.3 कर्नेलने निवडलेल्या इंटरफेसचे नाव सांगतो। सार्वजनिक पत्त्यासाठी तोच आदेश चालवा आणि तो बोगद्याचे नाव सांगतो याची खात्री करा।
आणखी दोन तपासण्या चक्र बंद करतात। प्रथम स्थानिक नाव सोडवा, नंतर सोडवलेल्या पत्त्यावर adb shell ip route get चालवा आणि बोगदा नसलेला इंटरफेस मागा, कारण यशस्वी adb shell ping -c 1 host.lan पोहोच सिद्ध करतो, मार्ग नाही। बोगदा एक दावा करत असेल तर IPv6 वर पत्ता-कुटुंब चाचणी पुन्हा करा। तुम्ही पाठवता त्या API स्तरावर चाचणी करा, कारण VPN नेटवर्क मार्गनिर्देशन तक्त्यासमोर कसे येतात हे आवृत्त्यांमध्ये बदलले आहे। कागदावर बरोबर दिसणारी मार्ग यादी आणि चुकीचा इंटरफेस निवडणारा शोध वेगवेगळ्या बग आहेत, आणि वापरकर्त्यांपर्यंत फक्त दुसराच पोहोचतो।
वगळण्याची यादी वाढत राहिली तर मार्ग तयार करणे थांबवा आणि दूरचे नेटवर्क पुन्हा क्रमांकित करा किंवा त्याऐवजी बोगदा अरुंद करा। जनरेटर गहाळ API साठीचा उपाय आहे, रचना साधन नाही।