Android VPN சுரங்கப்பாதையிலிருந்து ஒரு துணைவலையத்தை எவ்வாறு விலக்குவது
VpnService ஒரு வழியை விலக்க முடியாது, எனவே நீங்கள் நிரப்பியைச் சேர்க்கிறீர்கள்: /8 க்கு உருவாக்கப்பட்ட எட்டு முன்னொட்டுகள், மீதமுள்ளதைப் பிடிக்கும் IPv6, DNS மற்றும் தேடல் சோதனைகளுடன்.
Android இன் VpnService இல் விலக்கு வழி இல்லை, எவ்வளவு API படித்தாலும் ஒன்று உருவாகாது. Builder.addRoute() சுரங்கப்பாதையில் இலக்குகளை மட்டுமே சேர்க்கிறது, எனவே ஒரு LAN பிரிவை உள்ளூராக வைத்திருப்பது என்பது அந்தப் பிரிவு ஒருபோதும் வழிப் பட்டியலில் சேராது என்பதாகும். அதற்குப் பதிலாக நீங்கள் சேர்ப்பது பிரிவின் நிரப்பி, சாதாரண முன்னொட்டுகளாக வெளிப்படுத்தப்படுகிறது. வேலை கணிதம், அது சில ஊகிக்கக்கூடிய இடங்களில் தோல்வியடைகிறது.
கீழே உள்ள சோதனைகளை வரிசையாகச் செய்யுங்கள். ஒவ்வொன்றும் முந்தையது நிலைத்தது எனக் கருதுகிறது, எனவே கீழே உள்ள அறிகுறிகளை இணைப்பதற்குப் பதிலாக முதல் தோல்வியில் நிறுத்துங்கள்.
சுரங்கப்பாதை கூறுவதிலிருந்து தொடங்குங்கள்
0.0.0.0/0 ஐ addRoute() க்கு அனுப்புவது ஒவ்வொரு IPv4 இலக்கும் சுரங்கப்பாதைக்குச் சொந்தம் என்று Android க்கு சொல்கிறது. அதனால்தான் பல வாடிக்கையாளர்கள் பிளவுபட்ட சுரங்கப்பாதைக்கு திறனற்றவர்களாகத் தெரிகிறார்கள்: அவர்கள் முழு முகவரி இடத்தையும் கோரி பின்னர் அதிலிருந்து கழிக்க முயற்சிக்கிறார்கள். கட்டுப்படுத்தியில் எதுவும் கழிக்கவில்லை. நீங்கள் உள்ளூராக வைத்திருக்க விரும்பிய வலையமைப்பிற்கு மிகவும் குறிப்பிட்ட வழி மக்கள் எதிர்பார்ப்பதற்கு எதிர்மாறாகச் செயல்படுகிறது, ஏனெனில் நீளமான பொருந்தும் முன்னொட்டு வெற்றிபெறுகிறது, அந்த வலையமைப்பு சுரங்கப்பாதைக்குள் வந்துவிடுகிறது.
வழிப் பட்டியலே முழு கொள்கை. அதற்குப் பின்னால் ஒவ்வொரு இலக்கிற்கும் வீட்டோ இல்லை, மேலும் 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 க்கான ஒரு சுற்றுவழி, வடிவமைப்புக் கருவி அல்ல.