Android VpnService சில டிராஃபிக்கை மட்டும் பிடிப்பது ஏன், எல்லாவற்றையும் அல்ல
வழிகள், DNS உள்ளீடுகள் மற்றும் ஒவ்வொரு பயன்பாட்டின் எல்லை ஆகியவை எந்தப் பொதிகளை tun சாதனம் அடையும், உள்ளூர் சாதனங்கள் ஏன் மறையும், கட்டுநர் எதை மறுக்கிறார் என்பதைத் தீர்மானிக்கின்றன.
VpnService இல் எதுவும் தானாகவே டிராஃபிக்கைப் பிடிக்காது. இது கணினியிடம் tun இடைமுகத்தைக் கேட்கிறது, அந்த இடைமுகத்திற்கு முகவரிகள் மற்றும் வழிகளின் தொகுப்பை வழங்குகிறது, அந்தக் கணத்திலிருந்து கருநெறி அந்த வழிகளுடன் பொருந்தும் ஒவ்வொரு பொதியையும் பயன்பாடு படிக்கக்கூடிய கோப்பு விவரிப்பியில் நகலெடுக்கிறது. பயன்பாட்டின் குறியீடு வழிகள் தேர்ந்தெடுக்காத பொதிகளை ஒருபோதும் பார்ப்பதில்லை, எனவே சுரங்கப்பாதையின் எல்லை நிரலாக்கக் கேள்வியாகும் முன்பே வழிசெலுத்தல் அட்டவணைக் கேள்வியாகும். அதனால்தான் அதே சேவைச் செயலாக்கம் ஒரு தொலைபேசியில் அனைத்து ஓட்டத்தையும் விழுங்கும் மற்றொன்றில் ஒரு பகுதியை மட்டும், அதனால்தான் வழியைச் சேர்ப்பது சில சமயம் உடைந்ததாகத் தோன்றிய சுரங்கப்பாதையைச் சரிசெய்கிறது. நீங்கள் பெறுவது நீங்கள் அறிவித்ததே, கட்டுநர் அமைதியாக மறுத்த அனைத்தையும் கழித்து.
எந்தப் பொதிகள் வருகின்றன என்பதை வழிகள் தீர்மானிக்கின்றன
Builder.addRoute(prefix, prefixLength) VPN பிணையத்தின் வழிசெலுத்தல் அட்டவணையில் முன்னொட்டை நிறுவுகிறது. கணினி அந்தப் பிணையத்தை எல்லைக்குள் உள்ள பயன்பாடுகளுக்கு இயல்புநிலையாகக் கருதுகிறது, எனவே அதன் உள்ளீடுகள் இயற்பியல் பிணையத்தின் இயல்புநிலை வழிக்கு முன்பே பார்க்கப்படுகின்றன, பொருந்தும் முன்னொட்டு ஒரு ஓட்டத்தைத் திருப்பப் போதுமானது. எனவே 0.0.0.0/0 க்கான வழி IPv4 முழுவதையும் எடுக்கிறது, அச்சுப்பொறி, cast இலக்கு மற்றும் திசைவியின் நிர்வாகப் பக்கம் உட்பட.
இயற்பியல் இயல்புநிலை உள்ளீட்டை நீக்காமல் அந்தப் பாதுகாப்பை விரும்பும் வாடிக்கையாளர்கள் அதற்குப் பதிலாக 0.0.0.0/1 மற்றும் 128.0.0.0/1 இணையைப் பயன்படுத்துகிறார்கள். இரண்டு கூடுதல் குறிப்பிட்ட வழிகள் இயல்புநிலை வழியை வெல்கின்றன, ஒன்றாக அவை முழு முகவரி வெளியையும் மூடுகின்றன, தொலைபேசியின் சொந்த இயல்புநிலை உள்ளீடு இன்னும் இயற்பியல் பிணையத்துடன் பிணைக்கப்பட்ட சாக்கெட்டுகளுக்காக அட்டவணையில் இருக்கிறது.
முகவரிகள் மற்றும் DNS உள்ளீடுகள் அதே கட்டுநரிடமிருந்து வந்து வேறு கேள்விக்குப் பதிலளிக்கின்றன. addAddress இடைமுகத்திற்கு முன்னொட்டு நீளத்துடன் முகவரி தருகிறது, addDnsServer எல்லைக்குள் உள்ள பயன்பாடுகள் இடைமுகம் வழியாகக் கேட்கும் தீர்வியை நிறுவுகிறது. இரு குடும்பங்களும் ஒரே இடைமுகத்தில் இருக்கலாம், எனவே IPv6 முகவரிக்கு அருகில் IPv4 மட்டும் வழிகளின் தொகுப்பு சரியாகப் படிக்கப்படும் ஆனால் இன்னும் கசியும் அமைப்பாகும். இடைமுகத்தில் முகவரி இல்லாத குடும்பத்தை வழிசெலுத்தினால், கருநெறிக்கு அந்தப் பொதிகளுக்கு மூல முகவரி இல்லை, அவை ஒருபோதும் விவரிப்பியில் தோன்றாது.
establish() என்ன திருப்பித் தருகிறது
establish() ஒரு ParcelFileDescriptor திருப்பித் தருகிறது, அல்லது பயன்பாடு அனுமதிக்கப்படாதபோது null. null என்பது பிணையப் பிழை அல்ல, ஒப்புதலின் நிலை: VpnService.prepare() ஏற்கனவே null திருப்பியிருக்க வேண்டும், அல்லது பயனர் அழைப்புக்கு முன் கணினி உரையாடலை அங்கீகரித்திருக்க வேண்டும். சேவை இயங்கும்போது ஒப்புதல் திரும்பப் பெறப்படலாம், இடைமுகம் உங்கள் வாசிப்புச் சுழற்சிக்கு எந்த அழைப்பு மீட்பும் இல்லாமல் உங்கள் கால்களின் கீழ் மூடப்படுகிறது.
நீங்கள் வேறுவிதமாகக் கூறாவிட்டால் விவரிப்பி தடுக்காது, எனவே வாசிப்பு இழையை நிறுத்தாமல் தரவு இல்லாமல் உடனே திரும்புகிறது. தடுக்கும் சாக்கெட்டுக்காக எழுதப்பட்ட சுழற்சி ஒரு மையத்தை எரிக்கிறது, காலி வாசிப்பை மரணகரமாகக் கருதும் சுழற்சி சும்மா நொடியில் சுரங்கப்பாதையைக் கிழிக்கிறது. Builder.setBlocking(true) அந்த நடத்தையை மாற்றுகிறது, விலை வாசிப்பின் உள்ளே காத்திருக்கும் இழை.
வழி மற்றும் முகவரி வாதங்கள் LinkAddress மதிப்புகளாகச் சரிபார்க்கப்படுகின்றன, 224.0.0.0/4 போன்ற மல்டிகாஸ்ட் இலக்குகள் நேரடியாக மறுக்கப்படுகின்றன. புள்ளி-க்கு-புள்ளி tun இடைமுகத்திற்கும் ஒளிபரப்பு களம் இல்லை, எனவே அதன் வழியாக மல்டிகாஸ்ட் கண்டறிதலுக்கு மற்றொரு வழி அல்ல, வேறு வடிவமைப்பு தேவை. சரிபார்க்க வேண்டிய பட்டியல் VpnService.Builder ஆகும், ஒரு அழைப்பு புறக்கணிக்கப்பட்டது என முடிவெடுக்கும் முன்.
பயன்பாட்டு எல்லை தொகுப்பைக் குறுக்குகிறது, சுரங்கப்பாதையை அல்ல
API 21 முதல் கட்டுநர் addAllowedApplication மற்றும் addDisallowedApplication ஏற்கிறது, இரு பட்டியல்களும் ஒரே கட்டுநரில் பரஸ்பரம் தவிர்க்கின்றன. அனுமதிப் பட்டியல் அந்தப் பொதிகளுக்கு சுரங்கப்பாதையை நிலைநிறுத்துகிறது, மற்ற அனைத்தும் இயற்பியல் பிணையத்தை வைத்திருக்கிறது; தடைப் பட்டியல் பெயரிடப்பட்ட பொதிகளைத் தவிர அனைத்தையும் பிடிக்கிறது, அதை ஒரு வாடிக்கையாளர் பிரிக்கப்பட்ட சுரங்கப்பாதையாக வழங்குகிறார். API 21 க்கு முன் தளம் சார்ந்த எந்த வழிமுறையும் இல்லை, பயன்பாட்டு நடத்தை தங்கள் சொந்த முன்னனுப்பியில் UID அடிப்படையில் வடிகட்டிய மூன்றாம் தரப்பு வாடிக்கையாளர்களிடமிருந்து வந்தது. பிழைத்திருத்தத்தின் போது இந்த வேறுபாடு முக்கியம், ஏனெனில் ஒரு பொதியின் அனுமதிப் பட்டியலுடன் கூடிய பயன்பாட்டு சுரங்கப்பாதை கிட்டத்தட்ட டிராஃபிக்கையே உருவாக்காது, அது சரியான நடத்தை, உடைந்த வழி அல்ல.
எல்லை எதுவாக இருந்தாலும், உங்கள் பயன்பாடு VPN சேவையகத்திற்குத் திறக்கும் சாக்கெட் அது கட்டும் சுரங்கப்பாதை வழியாகச் செல்லக்கூடாது. VpnService.protect(socket) அந்தச் சாக்கெட்டை அடிப்படைப் பிணையத்துடன் பிணைக்கிறது, அதன் பொதிகள் tun சாதனத்தைத் தவிர்க்கும். அழைப்பைத் தவிர்த்தால், கைக்குலுக்கலை அதை உயர்த்த வேண்டிய இடைமுகம் விழுங்குகிறது.
VpnService.setUnderlyingNetworks எந்த இயற்பியல் பிணையம் சுரங்கப்பாதையைச் சுமக்கிறது என கணினியிடம் கூறி வட்டத்தை மூடுகிறது. அந்த மதிப்பு VPN மற்ற பயன்பாடுகளுக்கு இணைப்பை எவ்வாறு தெரிவிக்கிறது என்பதைத் தீர்மானிக்கிறது, null அல்லது பழைய மதிப்பு தொலைபேசியின் மற்ற பகுதி இணையமற்றதாகக் கருதும் இணைக்கப்பட்ட சுரங்கப்பாதைக்கு வழக்கமான காரணம். அடிப்படைப் பிணையம் மாறும்போது அதைப் புதுப்பிக்கவும், தொடக்கத்தில் மட்டும் அல்ல.
சரிபார்ப்புத் தொகைகள் மற்றும் MTU: சரியான வழியும் தோல்வியடையும் இடம்
பொதிகள் வந்தபின், பொதி மட்டத்தில் இரண்டு விவரங்கள் ஏதேனும் ஒரு முனையிலிருந்து மறுமுனை வரை வேலை செய்யுமா என்பதைத் தீர்மானிக்கின்றன. முதலாவது மூல முகவரி: பல இடைமுக முகவரிகள் இருந்தால் கருநெறி முதலாவதைச் சுமக்கும் பொதிகளை அனுப்பலாம், எனவே தலைப்புகளை மீண்டும் எழுதும் முன்னனுப்பி முகவரியையும் அதை மூடும் சரிபார்ப்புத் தொகையையும் சரிசெய்ய வேண்டும்.
இரண்டாவது சரிபார்ப்புத் தொகையின் எல்லை. பயன்பாடு TCP அல்லது UDP பொதிகளைத் தானே கட்டும்போது, சரிபார்ப்புத் தொகை மூல முகவரி, இலக்கு முகவரி, நெறிமுறை எண் மற்றும் போக்குவரத்து நீளம் கொண்ட போலித் தலைப்பை மூடுகிறது, அவற்றில் எதையும் விட்டுவிட்டால் வந்து தூக்கி எறியப்படும் பொதிகள் கிடைக்கும். அந்தத் தோல்வி ஒருபோதும் வராத பதிலுக்குப் பின் நேரம் முடிந்ததைப் போலத் தோன்றுகிறது, அது பெரும்பாலோரை வழிகளுக்கே திருப்பி அனுப்புகிறது. setMtu இடைமுகத்தின் MTU வை நிர்ணயிக்கிறது, ஒவ்வொரு வாசிப்பும் சரியாக ஒரு முழு IP பொதியைத் திருப்பித் தருகிறது, எனவே பைட் ஓட்டத்திற்காக எழுதப்பட்ட இடையகம் பொதியை அல்ல, உங்கள் பகுப்பாய்வைத் துண்டாக்கும்.
அடுக்குகளைப் பிரிக்கும் சரிபார்ப்புச் சுற்று
எல்லை எங்கு தவறியது எனக் கண்டறிய அடுக்குகளை வரிசையாகச் சோதிக்கவும். VPN பிணையம் உண்மையில் எந்த வழிகளை வைத்திருக்கிறது என சாதனத்தைக் கேளுங்கள், பிறகு அறியப்பட்ட முகவரிக்கான ஓட்டம் விவரிப்பியில் வாசிப்பாகத் தோன்றுகிறதா எனப் பாருங்கள், பிறகு உங்கள் முன்னனுப்பி அனுப்பும் பொதி நன்கு வடிவமைக்கப்பட்டதா எனப் பாருங்கள். வழிப் பிரச்சினை விவரிப்பியில் எதையும் காட்டாது, சரிபார்ப்புத் தொகைப் பிரச்சினை வந்து மறையும் பொதியைக் காட்டுகிறது.
விவரிப்பியை எதுவும் அடையவில்லை என்றால், சந்தேகத்திற்குரியது வாசிப்பவர் அல்ல, வழிகளின் தொகுப்பு: முன்னொட்டுகளை உறுதிப்படுத்துங்கள், அதே குடும்பத்தில் முகவரி உள்ளதை உறுதிப்படுத்துங்கள், பயன்பாடு நீங்கள் வகுத்த எல்லைக்குள் உள்ளதை உறுதிப்படுத்துங்கள். பொதிகள் விவரிப்பியை அடைந்தும் எதுவும் திரும்பவில்லை என்றால், மீண்டும் ஒரு வழியைத் தொடுவதற்கு முன் protect() மற்றும் அடிப்படைப் பிணையத்தின் மதிப்பைச் சரிபார்க்கவும். தொலைப் பக்கம் சிதைந்த பொதிகளைத் தெரிவித்தால், சரிபார்ப்புத் தொகையும் MTU வும் பார்க்க வேண்டிய இடங்கள். ஒவ்வொரு அடுக்குக்கும் ஒரு சோதனை அரை நாள் ஊகத்தைச் சேமிக்கிறது.