இல்லை, VpnService செயலி ஃபோனின் VPN-ஐ இயக்க முடியாது
செயலி ஒரு சுரங்கப்பாதை மற்றும் அதன் வாழ்க்கைச் சுழற்சியைக் கொண்டுள்ளது, ஃபோனின் VPN சுவிட்சை அல்ல. ஒப்புதல் திரும்பப் பெறப்படலாம், ஒரே நேரத்தில் ஒரு VPN மட்டுமே இயங்கும், மேலும் பாக்கெட்டுகளை நீங்களே பகுப்பாய்வு செய்ய வேண்டும்.
தவறான அனுமானம் என்னவென்றால், VpnService செயலி ஒரு சிஸ்டம் சுவிட்சைத் திருப்புகிறது, அதன்பிறகு ஃபோன் பாதுகாக்கப்படுகிறது என்பதே. உண்மையில் நடப்பது மிகவும் குறுகியது: செயலி ஒப்புதல் கேட்கிறது, ஒரு இடைமுகத்தை உருவாக்குகிறது, கோப்பு விவரிப்பான் வழியாக பாக்கெட்டுகளைப் படிக்கிறது மற்றும் எழுதுகிறது, நிற்கும்போது இடைமுகத்தைத் திருப்பித் தருகிறது. ஒரே நேரத்தில் அத்தகைய ஒரு சுரங்கப்பாதை மட்டுமே உயிரோடு இருக்க முடியும், மேலும் சிஸ்டம் கேட்காமலே அதை எடுத்துக் கொள்ளலாம். மக்கள் நெறிமுறையின் மீது சுமத்தும் குழப்பமான நடத்தையின் பெரும்பகுதி அந்த உரிமை மாதிரியிலிருந்தே வருகிறது.
ஒவ்வொரு வாழ்க்கைச் சுழற்சி மாற்றத்தையும் விளிம்பு நிலையாக அல்ல, வடிவமைப்பின் பகுதியாகக் கருதுங்கள்.
கட்டுக்கதை: செயலி ஃபோனின் VPN-ஐ இயக்குகிறது
VpnService.prepare() உடன் ஓட்டம் தொடங்குகிறது, அது பயனர் ஏற்க வேண்டிய Intent-ஐத் திருப்பித் தருகிறது, மேலும் establish() உடன் தொடர்கிறது, அதுவும் பின்னர் செயலி கட்டுப்படுத்தாத காரணங்களால் தோல்வியடையலாம். இரண்டாவது சுரங்கப்பாதையை நிறுவுவது முதல் இடைமுகத்தை முடக்கி சிஸ்டம் அறிவிப்பை மாற்றுகிறது. அந்த வரிசையில் எங்கும் செயலி முழு சாதனத்தின் சுவிட்சைக் கொண்டிருக்கவில்லை; அதற்கு வழங்கப்பட்ட விவரிப்பான் மற்றும் அதன் மீது வரும் பாக்கெட்டுகள் மட்டுமே உள்ளன. நிரந்தர அறிவிப்பும் செயலியின் வடிவமைப்புக்கு அல்ல, சிஸ்டத்துக்கே சொந்தம்.
இடைமுகம் பறிக்கப்படுவதல்ல, வழங்கப்படுவது, எனவே வேறு ஒரு கிளையண்ட் எப்போது வேண்டுமானாலும் இடத்தைப் பிடிக்கலாம். செயலி அதைத் திரும்பும் மதிப்பின் மூலம் அல்ல, கால்பேக்கின் மூலம் அறிகிறது.
செயலியை கட்டாயமாக நிறுத்தியது அறிவிப்புப் பலகையில் தெரிவதும் அதே காரணத்தால்தான்: சிஸ்டம் தான் என்ன வழங்கியது என்பதைத் தெரிவிக்கிறது, செயலி என்ன காட்டத் தேர்ந்தெடுத்தது என்பதை அல்ல.
கட்டுக்கதை: ஒப்புதல் ஒரு முறை மட்டுமே வழங்கப்படுகிறது
சிஸ்டம் சுரங்கப்பாதையை வேறு கிளையண்டிற்கு ஒப்படைக்கும்போது, அடிப்படை வகுப்பு onBind() இலிருந்து திருப்பித் தரும் binder மீது ரத்து பரிவர்த்தனையை அனுப்புகிறது. அந்த binder-ஐ தனதாக மாற்றும் செயலி ரத்து பரிவர்த்தனையைத் தானே அனுப்ப வேண்டும், இல்லையெனில் VpnService.onRevoke() ஒருபோதும் தூண்டப்படாது, சேவை இனி இல்லாத விவரிப்பானில் எழுதிக்கொண்டே இருக்கும். பயனரும் அனுமதியைத் திரும்பப் பெறலாம், மேலும் சிஸ்டம் மறுதொடக்கம் அல்லது எப்போதும் இயங்கும் மறு இணைப்பின் போது சேவையை நிறுத்தலாம்.
இதைக் கையாள்வது ஒரு பதிவு வரி அல்ல, உறுதியான வேலை: விவரிப்பானைப் படிப்பதை நிறுத்துங்கள், அதை மூடுங்கள், இணைக்கப்பட்ட கொடியை அழித்து, பயனர் எந்த நிலையில் இருக்கிறார் என்பதைச் சொல்லுங்கள். பின்னர் செயலி மீண்டும் நிறுவ வேண்டுமா, மீண்டும் கேட்க வேண்டுமா அல்லது காத்திருக்க வேண்டுமா என்பதை முடிவு செய்யுங்கள், ஏனெனில் எப்போதும் இயங்கும் கட்டமைப்பில் சிஸ்டம் சேவையைத் தானே திரும்பக் கொண்டு வரலாம்.
ரத்தை நிலையாக அல்ல, விதிவிலக்காகக் கருதும் செயலி, தான் எழுதும் ஒவ்வொரு பாக்கெட்டும் தூக்கி எறியப்படும்போதும் இணைக்கப்பட்டதாகத் தெரிவிக்கும், மேலும் தனியுரிமைக் கருவிக்கு இது சாத்தியமான மிக மோசமான தோல்வி முறை.
கட்டுக்கதை: இடைமுகம் உங்களுக்காகப் போக்குவரத்தை வடிகட்டுகிறது
வருவது மூல IP. பிடிப்பது அல்லது வடிகட்டுவது என்பது IP, TCP, UDP மற்றும் IPv6 தலைப்புகளைப் பகுப்பாய்வு செய்வது, ஓட்டங்களைக் கண்காணிப்பது மற்றும் பதில்களை விவரிப்பானுக்குத் திரும்ப எழுதுவது, இது பிடிப்புச் செயலியை சிஸ்டம் வசதியாக அல்ல, சிறிய பிணைய அடுக்காக மாற்றுகிறது. protect() இருப்பது செயலியின் சொந்தப் போக்குவரத்து சாக்கெட் தன்னைப் பிடிப்பதற்குப் பதிலாக அதன் சுரங்கப்பாதையைத் தவிர்க்க, மேலும் சுரங்கப்பாதை எழுந்த பிறகு உருவாக்கப்படும் ஒவ்வொரு சாக்கெட்டிலும் சரிபார்க்கத் தகுந்த பூலியன் மதிப்பை அது திருப்பித் தருகிறது.
உருவாக்கியின் அனுமதிக்கப்பட்ட மற்றும் தடைசெய்யப்பட்ட செயலி பட்டியல்கள் யாருடைய போக்குவரத்து இடைமுகத்திற்குள் நுழைகிறது என்பதைத் தீர்மானிக்கின்றன. அவை இடைமுகம் சுமக்கும் IP பாக்கெட்டுகளுக்கு அப்பால் உள்ள பேலோடுக்கு அணுகலைத் தருவதில்லை, எந்த API-யும் மற்றொரு கிளையண்டின் சுரங்கப்பாதையை வெளிப்படுத்துவதில்லை அல்லது சிஸ்டத்தின் VPN சுயவிவரங்களைப் பட்டியலிடுகிறது. பிணைய திறன்கள் ஒரு பிணையம் VPN போக்குவரத்து என்று சொல்லலாம், ஆனால் சுரங்கப்பாதை யாருடையது என்று சொல்ல முடியாது.
அதனால்தான் மற்ற செயலிகளைப் பற்றிய நிலைக் கேள்விகளுக்கு முரணான பதில்கள் கிடைக்கின்றன: தகவல் உங்கள் செயல்முறைக்கு வெளிப்படுத்தப்படவே இல்லை.
வாழ்க்கைச் சுழற்சி உண்மையில் என்ன கோருகிறது
நீங்கள் கட்டுப்படுத்தும் நிலைகளைக் கண்காணியுங்கள்: தயார், நிறுவப்பட்டது, ரத்து செய்யப்பட்டது, நிறுத்தப்பட்டது. மறு இணைப்பு என்பது பிரித்தெடுத்தல் பின்னர் நிறுவுதல் என்றிருக்க வேண்டும், விவரிப்பான் மற்றும் போக்குவரத்து சாக்கெட்டுக்கு ஒரே உரிமையாளருடன், ஏனெனில் நிறுவுவதற்குப் போட்டியிடும் இரு கூறுகள் ஒரே கிடைக்கும் இடத்திற்காகச் சண்டையிடும். நவீன Android-இல் பின்னணித் தொடக்கங்கள் வரம்பிடப்பட்டுள்ளன, எனவே பூட் ஒலிபரப்பு உத்தரவாதம் அல்ல; API நிலை அனுமதிக்கும் இடத்தில் அதன் அறிவிப்புடன் முன்னணி சேவையைப் பயன்படுத்துங்கள்.
இறுதி நிலையை மட்டுமல்ல, மாற்றத்தையும் பதிவு செய்யுங்கள், ஒவ்வொரு பாதையையும் சோதிக்கக்கூடிய அளவுக்குச் சிறியதாக நிலை இயந்திரத்தை வைத்திருங்கள். சோதனையில் நீங்கள் அடைய முடியாத நிலை, பதிவு இல்லாமல் களத்தில் சந்திக்கும் நிலையாகும்.
சாதனத்தில் வாழ்க்கைச் சுழற்சியைச் சோதியுங்கள்
எமுலேட்டர்கள் இணைப்பைப் போலியாக்க முடியும், ஆனால் ஒப்புதல் மற்றும் ரத்தின் பாதையை நம்பத்தகுந்த வகையில் அல்ல, எனவே இடத்தைத் திருட இரண்டாவது VPN கிளையண்ட் நிறுவப்பட்ட உண்மையான சாதனத்தில் இவற்றை இயக்குங்கள்.
adb shell dumpsys connectivity | grep -i -A3 vpn
adb shell dumpsys activity services | grep -i -A2 vpnservice
adb logcat -s VpnService:V AndroidRuntime:E
adb shell am force-stop com.example.vpnapp
சுரங்கப்பாதையைத் தொடங்குங்கள், அறிவிப்பு மற்றும் இடைமுகத்தை உறுதிப்படுத்துங்கள், பின்னர் மற்ற கிளையண்டை இணைத்து ரத்து கால்பேக் இயங்குகிறதா, நிலை அழிகிறதா என்பதைப் பாருங்கள். செயலியைக் கட்டாயமாக நிறுத்தி, இன்னும் உயிரோடு உள்ள விவரிப்பானை ஏதேனும் தெரிவிக்கிறதா எனச் சரிபாருங்கள்.
எப்போதும் இயங்கும் மறுதொடக்கத்திற்குப் பிறகு வரிசையை மீண்டும் செய்யுங்கள், ஏனெனில் அந்தப் பாதை பயனர் தொடங்கிய இணைப்பிலிருந்து வேறுபடுகிறது. நீங்கள் தேடுவது பச்சைச் சின்னம் அல்ல, செயலி இனி தனக்குச் சொந்தமில்லாத விவரிப்பானைப் பயன்படுத்துவதை நிறுத்தியது என்பதற்கான சான்று.